From 7d435b1892492fdf6933267007927ecc39786e07 Mon Sep 17 00:00:00 2001 From: bmazzarol Date: Sun, 3 Aug 2025 15:45:12 +0800 Subject: [PATCH 1/2] feat: standard release things added --- .config/dotnet-tools.json | 18 ++++++ .github/CODEOWNERS | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++ .github/workflows/build-deploy-docs.yml | 17 ++++++ .github/workflows/cd-build.yml | 23 ++++++++ .github/workflows/check-code-format.yml | 12 ++++ .github/workflows/check-commit-message.yml | 12 ++++ .github/workflows/check-docs.yml | 14 +++++ .github/workflows/check-markdown.yml | 21 +++++++ .github/workflows/ci-build.yml | 22 ++++++++ .github/workflows/test-reporter.yml | 18 ++++++ .husky/commit-msg | 22 ++++++++ .husky/pre-commit | 22 ++++++++ .husky/task-runner.json | 39 +++++++++++++ Cutout.Docs/.config/dotnet-tools.json | 12 ++++ Cutout.Docs/.gitignore | 3 + Cutout.Docs/Cutout.Docs.csproj | 3 + Cutout.Docs/articles/getting-started.md | 25 +++++++++ Cutout.Docs/articles/rules/CUTOUT001.md | 9 +++ Cutout.Docs/articles/rules/toc.yml | 3 + Cutout.Docs/articles/template/break.md | 21 +++++++ Cutout.Docs/articles/template/call.md | 16 ++++++ Cutout.Docs/articles/template/continue.md | 21 +++++++ Cutout.Docs/articles/template/for.md | 19 +++++++ Cutout.Docs/articles/template/foreach.md | 20 +++++++ Cutout.Docs/articles/template/if.md | 26 +++++++++ Cutout.Docs/articles/template/return.md | 19 +++++++ Cutout.Docs/articles/template/syntax.md | 61 +++++++++++++++++++++ Cutout.Docs/articles/template/toc.yml | 21 +++++++ Cutout.Docs/articles/template/var.md | 17 ++++++ Cutout.Docs/articles/template/while.md | 19 +++++++ Cutout.Docs/docfx.json | 37 +++++++++++++ Cutout.Docs/images/favicon.ico | Bin 0 -> 15406 bytes Cutout.Docs/images/scissors-icon.png | Bin 0 -> 83841 bytes Cutout.Docs/index.md | 40 ++++++++++++++ Cutout.Docs/template/public/main.css | 18 ++++++ Cutout.Docs/template/public/main.js | 9 +++ Cutout.Docs/toc.yml | 9 +++ Cutout.Sample/Examples.cs | 26 +++++++++ Cutout.sln | 6 ++ Cutout/README.md | 2 +- README.md | 2 +- commitlint.config.js | 15 +++++ 44 files changed, 776 insertions(+), 2 deletions(-) create mode 100644 .config/dotnet-tools.json create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/build-deploy-docs.yml create mode 100644 .github/workflows/cd-build.yml create mode 100644 .github/workflows/check-code-format.yml create mode 100644 .github/workflows/check-commit-message.yml create mode 100644 .github/workflows/check-docs.yml create mode 100644 .github/workflows/check-markdown.yml create mode 100644 .github/workflows/ci-build.yml create mode 100644 .github/workflows/test-reporter.yml create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .husky/task-runner.json create mode 100644 Cutout.Docs/.config/dotnet-tools.json create mode 100644 Cutout.Docs/.gitignore create mode 100644 Cutout.Docs/Cutout.Docs.csproj create mode 100644 Cutout.Docs/articles/getting-started.md create mode 100644 Cutout.Docs/articles/rules/CUTOUT001.md create mode 100644 Cutout.Docs/articles/rules/toc.yml create mode 100644 Cutout.Docs/articles/template/break.md create mode 100644 Cutout.Docs/articles/template/call.md create mode 100644 Cutout.Docs/articles/template/continue.md create mode 100644 Cutout.Docs/articles/template/for.md create mode 100644 Cutout.Docs/articles/template/foreach.md create mode 100644 Cutout.Docs/articles/template/if.md create mode 100644 Cutout.Docs/articles/template/return.md create mode 100644 Cutout.Docs/articles/template/syntax.md create mode 100644 Cutout.Docs/articles/template/toc.yml create mode 100644 Cutout.Docs/articles/template/var.md create mode 100644 Cutout.Docs/articles/template/while.md create mode 100644 Cutout.Docs/docfx.json create mode 100644 Cutout.Docs/images/favicon.ico create mode 100644 Cutout.Docs/images/scissors-icon.png create mode 100644 Cutout.Docs/index.md create mode 100644 Cutout.Docs/template/public/main.css create mode 100644 Cutout.Docs/template/public/main.js create mode 100644 Cutout.Docs/toc.yml create mode 100644 commitlint.config.js diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..5cd79ab --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "husky": { + "version": "0.7.2", + "commands": [ + "husky" + ] + }, + "csharpier": { + "version": "1.0.3", + "commands": [ + "csharpier" + ] + } + } +} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..8babb0b --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @bmazzarol \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..654ba62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '…' +2. Click on '…' +3. Scroll down to '…' +4. See error. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..5f43738 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when (...) + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml new file mode 100644 index 0000000..85c55d5 --- /dev/null +++ b/.github/workflows/build-deploy-docs.yml @@ -0,0 +1,17 @@ +name: Build and Deploy Docs + +on: + push: + branches: [main] + +jobs: + build-and-deploy-docs: + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + steps: + - uses: bmazzarol/bmazzarol/.github/actions/build-deploy-docs@main + with: + docsProjectPath: Cutout.Docs + csProjFileName: Cutout.Docs.csproj diff --git a/.github/workflows/cd-build.yml b/.github/workflows/cd-build.yml new file mode 100644 index 0000000..7ae2866 --- /dev/null +++ b/.github/workflows/cd-build.yml @@ -0,0 +1,23 @@ +name: CD Build + +on: + workflow_dispatch: + inputs: + version: + description: Release Version + required: true + release: + types: [published] + +env: + PACKAGE_VERSION: ${{ github.event.inputs.version || github.event.release.tag_name }} + +jobs: + publish: + name: Publish to Nuget + runs-on: ubuntu-latest + steps: + - uses: bmazzarol/bmazzarol/.github/actions/cd-build@main + with: + version: ${{ env.PACKAGE_VERSION }} + nugetKey: ${{ secrets.NUGET_API_KEY }} diff --git a/.github/workflows/check-code-format.yml b/.github/workflows/check-code-format.yml new file mode 100644 index 0000000..89f0122 --- /dev/null +++ b/.github/workflows/check-code-format.yml @@ -0,0 +1,12 @@ +name: Check C# Formatting + +on: + pull_request: + branches: [main] + +jobs: + check_formatting: + runs-on: ubuntu-latest + name: Check C# Formatting + steps: + - uses: bmazzarol/bmazzarol/.github/actions/check-code-format@main diff --git a/.github/workflows/check-commit-message.yml b/.github/workflows/check-commit-message.yml new file mode 100644 index 0000000..6250ed2 --- /dev/null +++ b/.github/workflows/check-commit-message.yml @@ -0,0 +1,12 @@ +name: Check Commit Message + +on: + pull_request: + branches: [main] + +jobs: + commitlint: + if: ${{ github.actor != 'dependabot[bot]' }} + runs-on: ubuntu-latest + steps: + - uses: bmazzarol/bmazzarol/.github/actions/check-commit-message@main diff --git a/.github/workflows/check-docs.yml b/.github/workflows/check-docs.yml new file mode 100644 index 0000000..47a10d8 --- /dev/null +++ b/.github/workflows/check-docs.yml @@ -0,0 +1,14 @@ +name: Check the Docfx site + +on: + pull_request: + branches: [main] + +jobs: + check-docs: + runs-on: ubuntu-latest + steps: + - uses: bmazzarol/bmazzarol/.github/actions/check-docs@main + with: + docsProjectPath: Cutout.Docs + csProjFileName: Cutout.Docs.csproj diff --git a/.github/workflows/check-markdown.yml b/.github/workflows/check-markdown.yml new file mode 100644 index 0000000..4379dd8 --- /dev/null +++ b/.github/workflows/check-markdown.yml @@ -0,0 +1,21 @@ +name: Check Markdown + +on: + push: + branches: [main] + paths: + - "**/*.md" + - .github/workflows/check-markdown.yml + pull_request: + branches: [main] + +jobs: + lint: + runs-on: ubuntu-latest + permissions: + statuses: write + steps: + - uses: bmazzarol/bmazzarol/.github/actions/check-markdown@main + with: + targetMdFiles: | + "Cutout*/**/*.md" "Cutout.Docs/**/*.md" "*.md" "!LICENSE.md" \ No newline at end of file diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml new file mode 100644 index 0000000..a436f4c --- /dev/null +++ b/.github/workflows/ci-build.yml @@ -0,0 +1,22 @@ +name: CI Build + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + if: ${{ github.actor != 'dependabot[bot]' }} + name: Build and analyze + runs-on: ubuntu-latest + permissions: + checks: write + pull-requests: write + steps: + - uses: bmazzarol/bmazzarol/.github/actions/ci-build@main + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + sonarToken: ${{ secrets.SONAR_TOKEN }} + sonarProjectKey: bmazzarol_Cutout \ No newline at end of file diff --git a/.github/workflows/test-reporter.yml b/.github/workflows/test-reporter.yml new file mode 100644 index 0000000..0aed7fb --- /dev/null +++ b/.github/workflows/test-reporter.yml @@ -0,0 +1,18 @@ +name: Test Reporter + +on: + workflow_run: + workflows: [CI Build] + types: [completed] + +jobs: + report: + runs-on: ubuntu-latest + steps: + - uses: dorny/test-reporter@v1 + with: + artifact: test-results + name: Test Results + path: | + **/*.trx + reporter: dotnet-trx diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..fd2e998 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,22 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +## husky task runner examples ------------------- +## Note : for local installation use 'dotnet' prefix. e.g. 'dotnet husky' + +## run all tasks +#husky run + +### run all tasks with group: 'group-name' +#husky run --group group-name + +## run task with name: 'task-name' +#husky run --name task-name + +## pass hook arguments to task +#husky run --args "$1" "$2" + +## or put your custom commands ------------------- +#echo 'Husky.Net is awesome!' + +npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..fd85d23 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,22 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +## husky task runner examples ------------------- +## Note : for local installation use 'dotnet' prefix. e.g. 'dotnet husky' + +## run all tasks +#husky run + +### run all tasks with group: 'group-name' +#husky run --group group-name + +## run task with name: 'task-name' +#husky run --name task-name + +## pass hook arguments to task +#husky run --args "$1" "$2" + +## or put your custom commands ------------------- +#echo 'Husky.Net is awesome!' + +dotnet husky run diff --git a/.husky/task-runner.json b/.husky/task-runner.json new file mode 100644 index 0000000..ed079de --- /dev/null +++ b/.husky/task-runner.json @@ -0,0 +1,39 @@ +{ + "tasks": [ + { + "name": "Format C# Code", + "command": "dotnet", + "args": [ + "csharpier", + "format", + "." + ] + }, + { + "name": "Lint Markdown", + "command": "npx", + "args": [ + "markdownlint-cli2", + "Cutout*/**/*.md", + "Cutout.Docs/**/*.md", + "*.md", + "!LICENSE.md" + ] + }, + { + "name": "Test C# Code", + "command": "dotnet", + "args": [ + "test" + ] + }, + { + "name": "Lint Docs", + "command": "dotnet", + "args": [ + "build", + "Cutout.Docs/Cutout.Docs.csproj" + ] + } + ] +} diff --git a/Cutout.Docs/.config/dotnet-tools.json b/Cutout.Docs/.config/dotnet-tools.json new file mode 100644 index 0000000..6e7d362 --- /dev/null +++ b/Cutout.Docs/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "docfx": { + "version": "2.78.2", + "commands": [ + "docfx" + ] + } + } +} \ No newline at end of file diff --git a/Cutout.Docs/.gitignore b/Cutout.Docs/.gitignore new file mode 100644 index 0000000..9ebe008 --- /dev/null +++ b/Cutout.Docs/.gitignore @@ -0,0 +1,3 @@ +_site +api +doctests \ No newline at end of file diff --git a/Cutout.Docs/Cutout.Docs.csproj b/Cutout.Docs/Cutout.Docs.csproj new file mode 100644 index 0000000..445083c --- /dev/null +++ b/Cutout.Docs/Cutout.Docs.csproj @@ -0,0 +1,3 @@ + + + diff --git a/Cutout.Docs/articles/getting-started.md b/Cutout.Docs/articles/getting-started.md new file mode 100644 index 0000000..d1ea31e --- /dev/null +++ b/Cutout.Docs/articles/getting-started.md @@ -0,0 +1,25 @@ +# Getting Started + +To use this library, simply include `Cutout.dll` in your project or grab +it from [NuGet](https://www.nuget.org/packages/Cutout/), and add a reference to it. + +```xml + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + +``` + +Then use the `Cutout.Template` attribute to define a template method. + +[!code-csharp[](../../Cutout.Sample/Examples.cs#ParameterExample)] + +The first parameter is the `StringBuilder`-like type to write to. Everything +else passed can be used in the template. + +The template must be a compile-time constant string, so it can be defined +as a `const` field or inline in the attribute. + +[!code-csharp[](../../Cutout.Sample/Examples.cs#ExampleWithConditionAndConstTemplate)] diff --git a/Cutout.Docs/articles/rules/CUTOUT001.md b/Cutout.Docs/articles/rules/CUTOUT001.md new file mode 100644 index 0000000..a9333a1 --- /dev/null +++ b/Cutout.Docs/articles/rules/CUTOUT001.md @@ -0,0 +1,9 @@ +# CUTOUT001 - Invalid Template + +The template used is not valid in some way. This could be due to a syntax +error, or it could be that the template is not compatible with the Cutout +version of the liquid language. + +The error will indicate the line number and position of the where the parser +encountered the issue. The user is expected to go to the template string and +resolve the issue. diff --git a/Cutout.Docs/articles/rules/toc.yml b/Cutout.Docs/articles/rules/toc.yml new file mode 100644 index 0000000..a6bb6c5 --- /dev/null +++ b/Cutout.Docs/articles/rules/toc.yml @@ -0,0 +1,3 @@ +items: + - name: (CUTOUT001) Invalid Template + href: CUTOUT001.md diff --git a/Cutout.Docs/articles/template/break.md b/Cutout.Docs/articles/template/break.md new file mode 100644 index 0000000..8eaa20e --- /dev/null +++ b/Cutout.Docs/articles/template/break.md @@ -0,0 +1,21 @@ +# Break Statement + +The `break` statement can be used inside loops to exit the loop early, +just like in C#. + +## Syntax + +```c# +{% break %} +``` + +## Example + +```c# +{% for i = 0; i < 10; i++ %} + {% if i == 5 %} + {% break %} + {% end %} + Value: {{ i }} +{% end %} +``` diff --git a/Cutout.Docs/articles/template/call.md b/Cutout.Docs/articles/template/call.md new file mode 100644 index 0000000..3c37b96 --- /dev/null +++ b/Cutout.Docs/articles/template/call.md @@ -0,0 +1,16 @@ +# Call Statement + +The `call` statement allows you to invoke other template methods decorated +with `[Cutout.Template]`. + +## Syntax + +```c# +{% call MethodName(arg1, arg2) %} +``` + +## Example + +```c# +{% call RenderHeader("Title") %} +``` diff --git a/Cutout.Docs/articles/template/continue.md b/Cutout.Docs/articles/template/continue.md new file mode 100644 index 0000000..6e8819f --- /dev/null +++ b/Cutout.Docs/articles/template/continue.md @@ -0,0 +1,21 @@ +# Continue Statement + +The `continue` statement can be used inside loops to skip to the next iteration +, just like in C#. + +## Syntax + +```c# +{% continue %} +``` + +## Example + +```c# +{% for i = 0; i < 10; i++ %} + {% if i % 2 == 0 %} + {% continue %} + {% end %} + Odd: {{ i }} +{% end %} +``` diff --git a/Cutout.Docs/articles/template/for.md b/Cutout.Docs/articles/template/for.md new file mode 100644 index 0000000..c126822 --- /dev/null +++ b/Cutout.Docs/articles/template/for.md @@ -0,0 +1,19 @@ +# For Statement + +The `for` statement allows you to write C#-style for loops in your template. + +## Syntax + +```c# +{% for i = 0; i < items.Count; i++ %} + ... +{% end %} +``` + +## Example + +```c# +{% for i = 0; i < items.Count; i++ %} +Item: {{ items[i] }} +{% end %} +``` diff --git a/Cutout.Docs/articles/template/foreach.md b/Cutout.Docs/articles/template/foreach.md new file mode 100644 index 0000000..46fbb26 --- /dev/null +++ b/Cutout.Docs/articles/template/foreach.md @@ -0,0 +1,20 @@ +# Foreach Statement + +The `foreach` statement allows you to iterate over collections in your template +using C# syntax. + +## Syntax + +```c# +{% foreach item in items %} + ... +{% end %} +``` + +## Example + +```c# +{% foreach item in items %} +Item: {{ item }} +{% end %} +``` diff --git a/Cutout.Docs/articles/template/if.md b/Cutout.Docs/articles/template/if.md new file mode 100644 index 0000000..1469369 --- /dev/null +++ b/Cutout.Docs/articles/template/if.md @@ -0,0 +1,26 @@ +# If/Else Statement + +The `if` statement allows conditional rendering in templates. +The condition must be a valid C# boolean expression. + +## Syntax + +```c# +{% if condition %} + ... +{% elseif otherCondition %} + ... +{% else %} + ... +{% end %} +``` + +## Example + +```c# +{% if name == "Bob" %} +Hello Bob +{% else %} +Hello {{ name }} +{% end %} +``` diff --git a/Cutout.Docs/articles/template/return.md b/Cutout.Docs/articles/template/return.md new file mode 100644 index 0000000..a052110 --- /dev/null +++ b/Cutout.Docs/articles/template/return.md @@ -0,0 +1,19 @@ +# Return Statement + +The `return` statement can be used to exit from a template method early, +similar to C#. + +## Syntax + +```c# +{% return %} +``` + +## Example + +```c# +{% if shouldExit %} + {% return %} +{% end %} +Continue rendering... +``` diff --git a/Cutout.Docs/articles/template/syntax.md b/Cutout.Docs/articles/template/syntax.md new file mode 100644 index 0000000..43a506a --- /dev/null +++ b/Cutout.Docs/articles/template/syntax.md @@ -0,0 +1,61 @@ +# Template Definition + +Cutout templates use a syntax inspired +by [Liquid](https://shopify.github.io/liquid/), but support C# expressions +instead of the custom language that Liquid uses. This allows you to write +templates that are both powerful and easy to read, while leveraging the full +capabilities of C#. + +## Syntax Overview + +* **Literals:** Any text outside of `{{ ... }}` or `{% ... %}` is treated as a + string literal and written directly to the output. +* **Expressions:** Use `{{ ... }}` to insert the value of any valid C# + expression. +***Blocks:** Use `{% ... %}` for control flow (e.g., if, for, foreach, while) + and function calls. +***Whitespace Control:** Whitespace can be managed using the `-` character, + similar to Liquid. For example, `{%- ... -%}` trims whitespace around the + block. + +### Example + +```csharp +private const string Template = """ + {% if name == "Bob" %} + Hello Bob + {% else %} + Hello {{ name }} + {% end %} + """; + +[Cutout.Template(Template)] +public static partial void MyTemplateMethod(StringBuilder sb, string name); +``` + +## Whitespace Handling + +Cutout supports whitespace control similar to +[Liquid's whitespace basics](https://shopify.github.io/liquid/basics/whitespace/) +: + +* `{% ... %}`: Preserves whitespace around the block. +* `{%- ... %}`: Trims whitespace before the block. +* `{% ... -%}`: Trims whitespace after the block. +* `{%- ... -%}`: Trims whitespace both before and after the block. +* The same applies to output tags: `{{ ... }}`, `{{- ... }}`, `{{ ... -}}`, + `{{- ... -}}`. + +This allows for fine-grained control over the formatting of generated code, +making it easier to maintain correct indentation and spacing. + +## Deviations from Liquid Standard + +| Feature | Cutout Implementation | Liquid Standard | +|--------------------|-------------------------------------------------|---------------------------------------------------| +| End Block | Single `{% end %}` for all blocks | Specific `{% endif %}`, `{% endfor %}` etc. | +| Expressions | Must be valid C# expressions | Liquid expressions | +| Function Calls | `{% call Function(args) %}` | Not supported in Liquid | +| Loop Syntax | C# style (`for`, `foreach`, `while`) | Liquid style (`for ... in ...`) | +| Whitespace Control | Same as Liquid (`-` modifier) | Liquid whitespace control | +| Conditionals | Only one conditional statement (`if`) supported | Multiple conditional types (`if`, `unless`, etc.) | diff --git a/Cutout.Docs/articles/template/toc.yml b/Cutout.Docs/articles/template/toc.yml new file mode 100644 index 0000000..052e332 --- /dev/null +++ b/Cutout.Docs/articles/template/toc.yml @@ -0,0 +1,21 @@ +items: + - name: Syntax + href: syntax.md + - name: If/Else + href: if.md + - name: For + href: for.md + - name: Foreach + href: foreach.md + - name: While + href: while.md + - name: Call + href: call.md + - name: Var + href: var.md + - name: Continue + href: continue.md + - name: Break + href: break.md + - name: Return + href: return.md diff --git a/Cutout.Docs/articles/template/var.md b/Cutout.Docs/articles/template/var.md new file mode 100644 index 0000000..59c45f1 --- /dev/null +++ b/Cutout.Docs/articles/template/var.md @@ -0,0 +1,17 @@ +# Var Statement + +The `var` statement allows you to declare variables within your template +using C# syntax. + +## Syntax + +```c# +{% var x = 10 %} +``` + +## Example + +```c# +{% var greeting = "Hello" %} +{{ greeting }} +``` diff --git a/Cutout.Docs/articles/template/while.md b/Cutout.Docs/articles/template/while.md new file mode 100644 index 0000000..bbb868f --- /dev/null +++ b/Cutout.Docs/articles/template/while.md @@ -0,0 +1,19 @@ +# While Statement + +The `while` statement allows you to write C#-style while loops in your template. + +## Syntax + +```c# +{% while condition %} + ... +{% end %} +``` + +## Example + +```c# +{% while i < 10 %} +Value: {{ i }} +{% end %} +``` diff --git a/Cutout.Docs/docfx.json b/Cutout.Docs/docfx.json new file mode 100644 index 0000000..e89aae7 --- /dev/null +++ b/Cutout.Docs/docfx.json @@ -0,0 +1,37 @@ +{ + "metadata": [], + "build": { + "content": [ + { + "files": [ + "articles/**.md", + "articles/**.yml", + "toc.yml", + "*.md" + ] + } + ], + "resource": [ + { + "files": [ + "images/**" + ] + } + ], + "postProcessors": [ + "ExtractSearchIndex" + ], + "template": [ + "default", + "modern", + "template" + ], + "output": "_site", + "globalMetadata": { + "_appName": "Cutout", + "_appLogoPath": "images/scissors-icon.png", + "_appFaviconPath": "images/favicon.ico", + "_appFooter": "Created By Ben Mazzarol" + } + } +} \ No newline at end of file diff --git a/Cutout.Docs/images/favicon.ico b/Cutout.Docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4097a9ffdbf47c58ff19ab200ed38b2d8feaa5b GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/Cutout.Docs/images/scissors-icon.png b/Cutout.Docs/images/scissors-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c546e56e19d7283bfa4605d9f0985612baba07a GIT binary patch literal 83841 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 literal 0 HcmV?d00001 diff --git a/Cutout.Docs/index.md b/Cutout.Docs/index.md new file mode 100644 index 0000000..44406ac --- /dev/null +++ b/Cutout.Docs/index.md @@ -0,0 +1,40 @@ + +

+ +Cutout + +# Cutout + +--- + +[![Nuget](https://img.shields.io/nuget/v/Cutout)](https://www.nuget.org/packages/Cutout/) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=bmazzarol_Cutout&metric=coverage)](https://sonarcloud.io/summary/new_code?id=bmazzarol_Cutout) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=bmazzarol_Cutout&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=bmazzarol_Cutout) +[![CD Build](https://github.com/bmazzarol/Cutout/actions/workflows/cd-build.yml/badge.svg)](https://github.com/bmazzarol/Cutout/actions/workflows/cd-build.yml) +[![Check Markdown](https://github.com/bmazzarol/Cutout/actions/workflows/check-markdown.yml/badge.svg)](https://github.com/bmazzarol/Cutout/actions/workflows/check-markdown.yml) + +Zero cost :muscle: source generated templating for .NET + +--- + +
+ +## Why? + +When building source generators there is a requirement to generate source code +as a string that has indentation managed correctly. The code also needs to be +as fast as possible to not impact users in large repositories. + +The recommended approach is to use +the [IndentedTextWriter](https://learn.microsoft.com/en-us/dotnet/api/system.codedom.compiler.indentedtextwriter?view=net-9.0) +. This class is simple to use, but is low level. + +A standard template engine is a better approach from a code maintenance +perspective, but the performance is not as good. + +This aims to provide the best of both worlds. + +It's a source generator, so can be used in other source generators without +incurring a dependency on a template engine, and it lets you use a simplified +version of [liquid](https://shopify.github.io/liquid/) and any type that +implements the basic StringBuilder API. diff --git a/Cutout.Docs/template/public/main.css b/Cutout.Docs/template/public/main.css new file mode 100644 index 0000000..4228cef --- /dev/null +++ b/Cutout.Docs/template/public/main.css @@ -0,0 +1,18 @@ +#logo { + margin-right: 1em; + height: 2.5em; +} + +.navbar { + background-color: var(--bs-border-color); +} + +body > footer { + background-color: var(--bs-tertiary-bg); + height: auto; + padding: 0.5em; +} + +body > footer.border-top { + border-top-color: var(--bs-tertiary-bg); +} diff --git a/Cutout.Docs/template/public/main.js b/Cutout.Docs/template/public/main.js new file mode 100644 index 0000000..0c99bf7 --- /dev/null +++ b/Cutout.Docs/template/public/main.js @@ -0,0 +1,9 @@ +export default { + iconLinks: [ + { + icon: 'github', + href: 'https://github.com/bmazzarol/Cutout', + title: 'GitHub' + } + ] +} \ No newline at end of file diff --git a/Cutout.Docs/toc.yml b/Cutout.Docs/toc.yml new file mode 100644 index 0000000..045380b --- /dev/null +++ b/Cutout.Docs/toc.yml @@ -0,0 +1,9 @@ +items: + - name: About + href: index.md + - name: Getting Started + href: articles/getting-started.md + - name: Template + href: articles/template/ + - name: Analyser Rules + href: articles/rules/ diff --git a/Cutout.Sample/Examples.cs b/Cutout.Sample/Examples.cs index deff70e..d62b7eb 100644 --- a/Cutout.Sample/Examples.cs +++ b/Cutout.Sample/Examples.cs @@ -6,4 +6,30 @@ public static partial class Examples { [Template("This is a very simple example")] public static partial void Test(this StringBuilder builder); + + #region ParameterExample + + [Template("This is a very simple example with a {{parameter}} parameter")] + public static partial void Test2(this StringBuilder builder, string parameter); + + #endregion + + #region ExampleWithConditionAndConstTemplate + + private const string TemplateExample = """ + A multi-line template example + with a {{parameter}} parameter. + + It also has a conditional section, + {%- if parameter == "INVALID" -%} + show this text + {%- else -%} + show this text instead + {%- end -%} + """; + + [Template(TemplateExample)] + public static partial void Test3(this StringBuilder builder, string parameter); + + #endregion } diff --git a/Cutout.sln b/Cutout.sln index 1db3910..4f05841 100644 --- a/Cutout.sln +++ b/Cutout.sln @@ -6,6 +6,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cutout.Sample", "Cutout.Sam EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cutout.Tests", "Cutout.Tests\Cutout.Tests.csproj", "{EA3D7126-C006-47DE-AF88-AEC0F5FD485E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cutout.Docs", "Cutout.Docs\Cutout.Docs.csproj", "{8D842E29-21B3-4D8A-9EA5-581795C0132A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,5 +26,9 @@ Global {EA3D7126-C006-47DE-AF88-AEC0F5FD485E}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA3D7126-C006-47DE-AF88-AEC0F5FD485E}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA3D7126-C006-47DE-AF88-AEC0F5FD485E}.Release|Any CPU.Build.0 = Release|Any CPU + {8D842E29-21B3-4D8A-9EA5-581795C0132A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D842E29-21B3-4D8A-9EA5-581795C0132A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D842E29-21B3-4D8A-9EA5-581795C0132A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D842E29-21B3-4D8A-9EA5-581795C0132A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Cutout/README.md b/Cutout/README.md index 3b7209f..90bacbc 100644 --- a/Cutout/README.md +++ b/Cutout/README.md @@ -51,7 +51,7 @@ public static partial class MyTemplate ## Template Language -Everything that is not between `{{` or `{@` and `}}` or `%}` is treated as a +Everything that is not between `{{` or `{@` and `}}` or `%}` is treated as a string literal. Any valid C# expression can be used in the template as it is compiled to C# diff --git a/README.md b/README.md index dd09a14..433e719 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ public static partial class MyTemplate ## Template Language -Everything that is not between `{{` or `{@` and `}}` or `%}` is treated as a +Everything that is not between `{{` or `{@` and `}}` or `%}` is treated as a string literal. Any valid C# expression can be used in the template as it is compiled to C# diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..de8425d --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,15 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + "subject-case": [0, 'never'], + "subject-max-length": [2, "always", 100], + "scope-enum": _ => [ + 2, + "always", + [ + "deps", + "docs" + ] + ] + } +} From 6bc25ba8ce749b1f3a1ea8f7ae5a1d9b371d649a Mon Sep 17 00:00:00 2001 From: bmazzarol Date: Sun, 3 Aug 2025 16:06:04 +0800 Subject: [PATCH 2/2] fix: review fixes 1 --- Cutout.Docs/articles/rules/CUTOUT001.md | 6 +++--- Cutout.Docs/articles/template/syntax.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cutout.Docs/articles/rules/CUTOUT001.md b/Cutout.Docs/articles/rules/CUTOUT001.md index a9333a1..3751111 100644 --- a/Cutout.Docs/articles/rules/CUTOUT001.md +++ b/Cutout.Docs/articles/rules/CUTOUT001.md @@ -4,6 +4,6 @@ The template used is not valid in some way. This could be due to a syntax error, or it could be that the template is not compatible with the Cutout version of the liquid language. -The error will indicate the line number and position of the where the parser -encountered the issue. The user is expected to go to the template string and -resolve the issue. +The error will indicate the line number and position where the parser +encountered the issue. The user should review the template string and +resolve the problem. diff --git a/Cutout.Docs/articles/template/syntax.md b/Cutout.Docs/articles/template/syntax.md index 43a506a..ff9b3ee 100644 --- a/Cutout.Docs/articles/template/syntax.md +++ b/Cutout.Docs/articles/template/syntax.md @@ -12,9 +12,9 @@ capabilities of C#. string literal and written directly to the output. * **Expressions:** Use `{{ ... }}` to insert the value of any valid C# expression. -***Blocks:** Use `{% ... %}` for control flow (e.g., if, for, foreach, while) +* **Blocks:** Use `{% ... %}` for control flow (e.g., if, for, foreach, while) and function calls. -***Whitespace Control:** Whitespace can be managed using the `-` character, +* **Whitespace Control:** Whitespace can be managed using the `-` character, similar to Liquid. For example, `{%- ... -%}` trims whitespace around the block.