From 9e333ef94a96d48ce47708e4467022b53992ef79 Mon Sep 17 00:00:00 2001 From: Erfan Shokrollahi Date: Sat, 18 Dec 2021 02:06:54 +0330 Subject: [PATCH 001/161] Added EnsureExistsAsync for optimal checking --- .../Repositories/RepositoryExtensions.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 2b4dd70e62..83b61b43e3 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -47,6 +47,33 @@ public static class RepositoryExtensions } } + + public static async Task EnsureExistsAsync( + this IRepository repository, + TKey id, + CancellationToken cancellationToken = default + ) + where TEntity : class, IEntity + { + if (await repository.AnyAsync(x => x.Id.Equals(id), cancellationToken)) + { + throw new EntityNotFoundException(typeof(TEntity), id); + } + } + + public static async Task EnsureExistsAsync( + this IRepository repository, + Expression> expression, + CancellationToken cancellationToken = default + ) + where TEntity : class, IEntity + { + if (await repository.AnyAsync(expression, cancellationToken)) + { + throw new EntityNotFoundException(typeof(TEntity)); + } + } + public static async Task HardDeleteAsync( this IRepository repository, Expression> predicate, From 45c6a6ea189254c85e9c3c1f1a8020c22aea74f7 Mon Sep 17 00:00:00 2001 From: Erfan Shokrollahi Date: Mon, 20 Dec 2021 15:07:19 +0330 Subject: [PATCH 002/161] Update framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs Co-authored-by: Qingxiao Ren --- .../Volo/Abp/Domain/Repositories/RepositoryExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 83b61b43e3..a3ba6e3ac0 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -55,7 +55,7 @@ public static class RepositoryExtensions ) where TEntity : class, IEntity { - if (await repository.AnyAsync(x => x.Id.Equals(id), cancellationToken)) + if (!await repository.AnyAsync(x => x.Id.Equals(id), cancellationToken)) { throw new EntityNotFoundException(typeof(TEntity), id); } From 7d5016e84a257197f6073690e144c899dcb28408 Mon Sep 17 00:00:00 2001 From: Erfan Shokrollahi Date: Mon, 20 Dec 2021 15:12:47 +0330 Subject: [PATCH 003/161] Fixed missing ! in EnsureExistsAsync method --- .../Volo/Abp/Domain/Repositories/RepositoryExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index a3ba6e3ac0..35c31af06e 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -68,7 +68,7 @@ public static class RepositoryExtensions ) where TEntity : class, IEntity { - if (await repository.AnyAsync(expression, cancellationToken)) + if (!await repository.AnyAsync(expression, cancellationToken)) { throw new EntityNotFoundException(typeof(TEntity)); } From 107b848e86672a1c03e802e4eb38faf9d9af5c9b Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 21 Dec 2021 10:30:17 +0800 Subject: [PATCH 004/161] Update RepositoryExtensions.cs --- .../Abp/Domain/Repositories/RepositoryExtensions.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 35c31af06e..21162ed9e7 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -47,13 +47,12 @@ public static class RepositoryExtensions } } - public static async Task EnsureExistsAsync( - this IRepository repository, - TKey id, - CancellationToken cancellationToken = default - ) - where TEntity : class, IEntity + this IRepository repository, + TKey id, + CancellationToken cancellationToken = default + ) + where TEntity : class, IEntity { if (!await repository.AnyAsync(x => x.Id.Equals(id), cancellationToken)) { From ecf0572f27037db7a7e4bba986e1f6b68f8e7978 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 21 Jan 2022 11:04:39 +0800 Subject: [PATCH 005/161] Upgrade MongoDB.Driver to 2.14. Resolve #11394 --- framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj index d72f308510..69ac5b1dcd 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj +++ b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj @@ -15,7 +15,7 @@ - + From 0698514b796ca687ab7862be16f58b8699490224 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 27 Apr 2022 11:45:25 +0800 Subject: [PATCH 006/161] Add validation rules for this property. Resolve #12282 --- .../Modeling/PropertyApiDescriptionModel.cs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs index 87449956cd..bd3852098b 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Reflection; using Volo.Abp.Http.ProxyScripting.Configuration; @@ -18,16 +19,31 @@ public class PropertyApiDescriptionModel public bool IsRequired { get; set; } - //TODO: Validation rules for this property + public int? MinLength { get; set; } + + public int? MaxLength { get; set; } + + public string Minimum { get; set; } + + public string Maximum { get; set; } + + public string Regex { get; set; } + public static PropertyApiDescriptionModel Create(PropertyInfo propertyInfo) { + var customAttributes = propertyInfo.GetCustomAttributes(true); return new PropertyApiDescriptionModel { Name = propertyInfo.Name, JsonName = AbpApiProxyScriptingConfiguration.PropertyNameGenerator.Invoke(propertyInfo), Type = ApiTypeNameHelper.GetTypeName(propertyInfo.PropertyType), TypeSimple = ApiTypeNameHelper.GetSimpleTypeName(propertyInfo.PropertyType), - IsRequired = propertyInfo.IsDefined(typeof(RequiredAttribute), true) + IsRequired = customAttributes.OfType().Any(), + Minimum = customAttributes.OfType().Select(x => x.Minimum).FirstOrDefault()?.ToString(), + Maximum = customAttributes.OfType().Select(x => x.Maximum).FirstOrDefault()?.ToString(), + MinLength = customAttributes.OfType().FirstOrDefault()?.Length ?? customAttributes.OfType().FirstOrDefault()?.MinimumLength, + MaxLength = customAttributes.OfType().FirstOrDefault()?.Length ?? customAttributes.OfType().FirstOrDefault()?.MaximumLength, + Regex= customAttributes.OfType().Select(x => x.Pattern).FirstOrDefault() }; } } From 16bbe7147d2b12cac94567028fc0f095931109a6 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 2 May 2022 11:08:32 +0800 Subject: [PATCH 007/161] Upgrade `MongoDB.Driver` to `2.15`. --- framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj index 69ac5b1dcd..7adca7867f 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj +++ b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj @@ -15,7 +15,7 @@ - + From 166fa898dd898bd6a66fcb39f23599fa9b9793b5 Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Thu, 5 May 2022 14:56:25 +0300 Subject: [PATCH 008/161] Update common.props --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index facc92f0bc..fb595041d7 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 5.3.0 + 5.3.0-rc.1 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From 77e28155017dcf3a5b1df1c0f523d6c5ca5a9a14 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 5 May 2022 15:48:12 +0300 Subject: [PATCH 009/161] update auto pr base branch --- .github/workflows/auto-pr.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 6babf87b5e..c62896d948 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,15 +1,15 @@ -name: Merge branch dev with rel-5.2 +name: Merge branch rel-5.3 with rel-5.2 on: push: branches: - rel-5.2 jobs: - merge-dev-with-rel-5-2: + merge-rel-5-3-with-rel-5-2: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: - ref: dev + ref: rel-5.3 - name: Reset promotion branch run: | git fetch origin rel-5.2:rel-5.2 @@ -18,7 +18,7 @@ jobs: uses: peter-evans/create-pull-request@v3 with: branch: auto-merge/rel-5-2/${{github.run_number}} - title: Merge branch dev with rel-5.2 - body: This PR generated automatically to merge dev with rel-5.2. Please review the changed files before merging to prevent any errors that may occur. + title: Merge branch rel-5.3 with rel-5.2 + body: This PR generated automatically to merge rel-5.3 with rel-5.2. Please review the changed files before merging to prevent any errors that may occur. reviewers: ${{github.actor}} token: ${{ github.token }} From 04f4ce70200534b2b3c84a6dd5625172a3281071 Mon Sep 17 00:00:00 2001 From: Volosoft Agent <43883821+voloagent@users.noreply.github.com> Date: Thu, 5 May 2022 19:44:13 +0300 Subject: [PATCH 010/161] Update_NPM_Packages --- .../package.json | 2 +- .../yarn.lock | 224 +- .../package.json | 4 +- .../yarn.lock | 260 +- .../app/Volo.BloggingTestApp/package.json | 4 +- .../app/Volo.BloggingTestApp/yarn.lock | 298 +- .../Volo.ClientSimulation.Demo/package.json | 2 +- .../demo/Volo.ClientSimulation.Demo/yarn.lock | 238 +- modules/cms-kit/angular/package.json | 10 +- .../angular/projects/cms-kit/package.json | 4 +- .../Volo.CmsKit.IdentityServer/package.json | 2 +- .../host/Volo.CmsKit.IdentityServer/yarn.lock | 238 +- .../host/Volo.CmsKit.Web.Host/package.json | 2 +- .../host/Volo.CmsKit.Web.Host/yarn.lock | 238 +- .../host/Volo.CmsKit.Web.Unified/package.json | 4 +- .../libs/codemirror/addon/comment/comment.js | 211 + .../addon/comment/continuecomment.js | 114 + .../libs/codemirror/addon/dialog/dialog.css | 32 + .../libs/codemirror/addon/dialog/dialog.js | 163 + .../codemirror/addon/display/autorefresh.js | 47 + .../codemirror/addon/display/fullscreen.css | 6 + .../codemirror/addon/display/fullscreen.js | 41 + .../libs/codemirror/addon/display/panel.js | 133 + .../codemirror/addon/display/placeholder.js | 78 + .../libs/codemirror/addon/display/rulers.js | 51 + .../codemirror/addon/edit/closebrackets.js | 201 + .../libs/codemirror/addon/edit/closetag.js | 185 + .../codemirror/addon/edit/continuelist.js | 101 + .../codemirror/addon/edit/matchbrackets.js | 160 + .../libs/codemirror/addon/edit/matchtags.js | 66 + .../codemirror/addon/edit/trailingspace.js | 27 + .../libs/codemirror/addon/fold/brace-fold.js | 119 + .../codemirror/addon/fold/comment-fold.js | 59 + .../libs/codemirror/addon/fold/foldcode.js | 159 + .../libs/codemirror/addon/fold/foldgutter.css | 20 + .../libs/codemirror/addon/fold/foldgutter.js | 163 + .../libs/codemirror/addon/fold/indent-fold.js | 48 + .../codemirror/addon/fold/markdown-fold.js | 49 + .../libs/codemirror/addon/fold/xml-fold.js | 184 + .../codemirror/addon/hint/anyword-hint.js | 41 + .../libs/codemirror/addon/hint/css-hint.js | 66 + .../libs/codemirror/addon/hint/html-hint.js | 351 + .../codemirror/addon/hint/javascript-hint.js | 162 + .../libs/codemirror/addon/hint/show-hint.css | 36 + .../libs/codemirror/addon/hint/show-hint.js | 529 + .../libs/codemirror/addon/hint/sql-hint.js | 304 + .../libs/codemirror/addon/hint/xml-hint.js | 132 + .../addon/lint/coffeescript-lint.js | 47 + .../libs/codemirror/addon/lint/css-lint.js | 40 + .../libs/codemirror/addon/lint/html-lint.js | 59 + .../codemirror/addon/lint/javascript-lint.js | 65 + .../libs/codemirror/addon/lint/json-lint.js | 40 + .../libs/codemirror/addon/lint/lint.css | 79 + .../libs/codemirror/addon/lint/lint.js | 291 + .../libs/codemirror/addon/lint/yaml-lint.js | 41 + .../libs/codemirror/addon/merge/merge.css | 119 + .../libs/codemirror/addon/merge/merge.js | 1018 ++ .../libs/codemirror/addon/mode/loadmode.js | 66 + .../libs/codemirror/addon/mode/multiplex.js | 136 + .../codemirror/addon/mode/multiplex_test.js | 49 + .../libs/codemirror/addon/mode/overlay.js | 90 + .../libs/codemirror/addon/mode/simple.js | 216 + .../libs/codemirror/addon/runmode/colorize.js | 40 + .../addon/runmode/runmode-standalone.js | 334 + .../libs/codemirror/addon/runmode/runmode.js | 76 + .../codemirror/addon/runmode/runmode.node.js | 329 + .../addon/scroll/annotatescrollbar.js | 128 + .../codemirror/addon/scroll/scrollpastend.js | 48 + .../addon/scroll/simplescrollbars.css | 66 + .../addon/scroll/simplescrollbars.js | 152 + .../codemirror/addon/search/jump-to-line.js | 53 + .../addon/search/match-highlighter.js | 167 + .../addon/search/matchesonscrollbar.css | 8 + .../addon/search/matchesonscrollbar.js | 97 + .../libs/codemirror/addon/search/search.js | 292 + .../codemirror/addon/search/searchcursor.js | 305 + .../codemirror/addon/selection/active-line.js | 72 + .../addon/selection/mark-selection.js | 119 + .../addon/selection/selection-pointer.js | 98 + .../libs/codemirror/addon/tern/tern.css | 87 + .../libs/codemirror/addon/tern/tern.js | 750 ++ .../libs/codemirror/addon/tern/worker.js | 44 + .../libs/codemirror/addon/wrap/hardwrap.js | 160 + .../wwwroot/libs/codemirror/codemirror.css | 344 + .../wwwroot/libs/codemirror/codemirror.js | 9849 +++++++++++++++++ .../wwwroot/libs/codemirror/mode/apl/apl.js | 174 + .../codemirror/mode/asciiarmor/asciiarmor.js | 74 + .../libs/codemirror/mode/asn.1/asn.1.js | 204 + .../libs/codemirror/mode/asterisk/asterisk.js | 220 + .../codemirror/mode/brainfuck/brainfuck.js | 85 + .../libs/codemirror/mode/clike/clike.js | 940 ++ .../libs/codemirror/mode/clojure/clojure.js | 292 + .../libs/codemirror/mode/cmake/cmake.js | 97 + .../libs/codemirror/mode/cobol/cobol.js | 255 + .../mode/coffeescript/coffeescript.js | 359 + .../codemirror/mode/commonlisp/commonlisp.js | 125 + .../libs/codemirror/mode/crystal/crystal.js | 433 + .../wwwroot/libs/codemirror/mode/css/css.js | 866 ++ .../libs/codemirror/mode/cypher/cypher.js | 152 + .../wwwroot/libs/codemirror/mode/d/d.js | 223 + .../wwwroot/libs/codemirror/mode/dart/dart.js | 166 + .../wwwroot/libs/codemirror/mode/diff/diff.js | 47 + .../libs/codemirror/mode/django/django.js | 356 + .../codemirror/mode/dockerfile/dockerfile.js | 211 + .../wwwroot/libs/codemirror/mode/dtd/dtd.js | 142 + .../libs/codemirror/mode/dylan/dylan.js | 352 + .../wwwroot/libs/codemirror/mode/ebnf/ebnf.js | 195 + .../wwwroot/libs/codemirror/mode/ecl/ecl.js | 206 + .../libs/codemirror/mode/eiffel/eiffel.js | 160 + .../wwwroot/libs/codemirror/mode/elm/elm.js | 243 + .../libs/codemirror/mode/erlang/erlang.js | 619 ++ .../libs/codemirror/mode/factor/factor.js | 85 + .../wwwroot/libs/codemirror/mode/fcl/fcl.js | 173 + .../libs/codemirror/mode/forth/forth.js | 180 + .../libs/codemirror/mode/fortran/fortran.js | 188 + .../wwwroot/libs/codemirror/mode/gas/gas.js | 353 + .../wwwroot/libs/codemirror/mode/gfm/gfm.js | 129 + .../libs/codemirror/mode/gherkin/gherkin.js | 178 + .../wwwroot/libs/codemirror/mode/go/go.js | 187 + .../libs/codemirror/mode/groovy/groovy.js | 247 + .../wwwroot/libs/codemirror/mode/haml/haml.js | 161 + .../codemirror/mode/handlebars/handlebars.js | 70 + .../mode/haskell-literate/haskell-literate.js | 43 + .../libs/codemirror/mode/haskell/haskell.js | 268 + .../wwwroot/libs/codemirror/mode/haxe/haxe.js | 515 + .../mode/htmlembedded/htmlembedded.js | 37 + .../codemirror/mode/htmlmixed/htmlmixed.js | 153 + .../wwwroot/libs/codemirror/mode/http/http.js | 113 + .../wwwroot/libs/codemirror/mode/idl/idl.js | 290 + .../codemirror/mode/javascript/javascript.js | 960 ++ .../libs/codemirror/mode/jinja2/jinja2.js | 146 + .../wwwroot/libs/codemirror/mode/jsx/jsx.js | 148 + .../libs/codemirror/mode/julia/julia.js | 390 + .../codemirror/mode/livescript/livescript.js | 280 + .../wwwroot/libs/codemirror/mode/lua/lua.js | 160 + .../libs/codemirror/mode/markdown/markdown.js | 886 ++ .../mode/mathematica/mathematica.js | 176 + .../wwwroot/libs/codemirror/mode/mbox/mbox.js | 129 + .../wwwroot/libs/codemirror/mode/meta.js | 221 + .../wwwroot/libs/codemirror/mode/mirc/mirc.js | 193 + .../libs/codemirror/mode/mllike/mllike.js | 359 + .../libs/codemirror/mode/modelica/modelica.js | 245 + .../libs/codemirror/mode/mscgen/mscgen.js | 175 + .../libs/codemirror/mode/mumps/mumps.js | 148 + .../libs/codemirror/mode/nginx/nginx.js | 178 + .../wwwroot/libs/codemirror/mode/nsis/nsis.js | 95 + .../libs/codemirror/mode/ntriples/ntriples.js | 195 + .../libs/codemirror/mode/octave/octave.js | 139 + .../wwwroot/libs/codemirror/mode/oz/oz.js | 252 + .../libs/codemirror/mode/pascal/pascal.js | 136 + .../libs/codemirror/mode/pegjs/pegjs.js | 114 + .../wwwroot/libs/codemirror/mode/perl/perl.js | 836 ++ .../wwwroot/libs/codemirror/mode/php/php.js | 234 + .../wwwroot/libs/codemirror/mode/pig/pig.js | 178 + .../codemirror/mode/powershell/powershell.js | 398 + .../codemirror/mode/properties/properties.js | 78 + .../libs/codemirror/mode/protobuf/protobuf.js | 72 + .../wwwroot/libs/codemirror/mode/pug/pug.js | 591 + .../libs/codemirror/mode/puppet/puppet.js | 220 + .../libs/codemirror/mode/python/python.js | 402 + .../wwwroot/libs/codemirror/mode/q/q.js | 139 + .../wwwroot/libs/codemirror/mode/r/r.js | 190 + .../codemirror/mode/rpm/changes/index.html | 66 + .../wwwroot/libs/codemirror/mode/rpm/rpm.js | 109 + .../wwwroot/libs/codemirror/mode/rst/rst.js | 557 + .../wwwroot/libs/codemirror/mode/ruby/ruby.js | 303 + .../wwwroot/libs/codemirror/mode/rust/rust.js | 72 + .../wwwroot/libs/codemirror/mode/sas/sas.js | 303 + .../wwwroot/libs/codemirror/mode/sass/sass.js | 459 + .../libs/codemirror/mode/scheme/scheme.js | 284 + .../libs/codemirror/mode/shell/shell.js | 168 + .../libs/codemirror/mode/sieve/sieve.js | 193 + .../wwwroot/libs/codemirror/mode/slim/slim.js | 575 + .../codemirror/mode/smalltalk/smalltalk.js | 168 + .../libs/codemirror/mode/smarty/smarty.js | 225 + .../wwwroot/libs/codemirror/mode/solr/solr.js | 104 + .../wwwroot/libs/codemirror/mode/soy/soy.js | 665 ++ .../libs/codemirror/mode/sparql/sparql.js | 190 + .../mode/spreadsheet/spreadsheet.js | 112 + .../wwwroot/libs/codemirror/mode/sql/sql.js | 503 + .../wwwroot/libs/codemirror/mode/stex/stex.js | 264 + .../libs/codemirror/mode/stylus/stylus.js | 775 ++ .../libs/codemirror/mode/swift/swift.js | 223 + .../wwwroot/libs/codemirror/mode/tcl/tcl.js | 140 + .../libs/codemirror/mode/textile/textile.js | 469 + .../codemirror/mode/tiddlywiki/tiddlywiki.css | 14 + .../codemirror/mode/tiddlywiki/tiddlywiki.js | 308 + .../libs/codemirror/mode/tiki/tiki.css | 26 + .../wwwroot/libs/codemirror/mode/tiki/tiki.js | 312 + .../wwwroot/libs/codemirror/mode/toml/toml.js | 88 + .../libs/codemirror/mode/tornado/tornado.js | 68 + .../libs/codemirror/mode/troff/troff.js | 84 + .../libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js | 214 + .../wwwroot/libs/codemirror/mode/ttcn/ttcn.js | 283 + .../libs/codemirror/mode/turtle/turtle.js | 162 + .../wwwroot/libs/codemirror/mode/twig/twig.js | 141 + .../wwwroot/libs/codemirror/mode/vb/vb.js | 275 + .../libs/codemirror/mode/vbscript/vbscript.js | 350 + .../libs/codemirror/mode/velocity/velocity.js | 202 + .../libs/codemirror/mode/verilog/verilog.js | 781 ++ .../wwwroot/libs/codemirror/mode/vhdl/vhdl.js | 189 + .../wwwroot/libs/codemirror/mode/vue/vue.js | 77 + .../wwwroot/libs/codemirror/mode/wast/wast.js | 132 + .../libs/codemirror/mode/webidl/webidl.js | 195 + .../wwwroot/libs/codemirror/mode/xml/xml.js | 417 + .../libs/codemirror/mode/xquery/xquery.js | 448 + .../libs/codemirror/mode/yacas/yacas.js | 204 + .../mode/yaml-frontmatter/yaml-frontmatter.js | 72 + .../wwwroot/libs/codemirror/mode/yaml/yaml.js | 120 + .../wwwroot/libs/codemirror/mode/z80/z80.js | 116 + .../libs/codemirror/theme/3024-day.css | 41 + .../libs/codemirror/theme/3024-night.css | 39 + .../wwwroot/libs/codemirror/theme/abbott.css | 268 + .../wwwroot/libs/codemirror/theme/abcdef.css | 32 + .../libs/codemirror/theme/ambiance-mobile.css | 5 + .../libs/codemirror/theme/ambiance.css | 74 + .../libs/codemirror/theme/ayu-dark.css | 44 + .../libs/codemirror/theme/ayu-mirage.css | 45 + .../libs/codemirror/theme/base16-dark.css | 40 + .../libs/codemirror/theme/base16-light.css | 38 + .../wwwroot/libs/codemirror/theme/bespin.css | 34 + .../libs/codemirror/theme/blackboard.css | 32 + .../wwwroot/libs/codemirror/theme/cobalt.css | 25 + .../libs/codemirror/theme/colorforth.css | 33 + .../wwwroot/libs/codemirror/theme/darcula.css | 53 + .../wwwroot/libs/codemirror/theme/dracula.css | 40 + .../libs/codemirror/theme/duotone-dark.css | 35 + .../libs/codemirror/theme/duotone-light.css | 36 + .../wwwroot/libs/codemirror/theme/eclipse.css | 23 + .../wwwroot/libs/codemirror/theme/elegant.css | 13 + .../libs/codemirror/theme/erlang-dark.css | 34 + .../libs/codemirror/theme/gruvbox-dark.css | 39 + .../libs/codemirror/theme/hopscotch.css | 34 + .../libs/codemirror/theme/icecoder.css | 43 + .../wwwroot/libs/codemirror/theme/idea.css | 42 + .../wwwroot/libs/codemirror/theme/isotope.css | 34 + .../wwwroot/libs/codemirror/theme/juejin.css | 30 + .../libs/codemirror/theme/lesser-dark.css | 47 + .../libs/codemirror/theme/liquibyte.css | 95 + .../wwwroot/libs/codemirror/theme/lucario.css | 37 + .../libs/codemirror/theme/material-darker.css | 135 + .../libs/codemirror/theme/material-ocean.css | 141 + .../codemirror/theme/material-palenight.css | 141 + .../libs/codemirror/theme/material.css | 141 + .../wwwroot/libs/codemirror/theme/mbo.css | 37 + .../libs/codemirror/theme/mdn-like.css | 46 + .../libs/codemirror/theme/midnight.css | 39 + .../wwwroot/libs/codemirror/theme/monokai.css | 41 + .../wwwroot/libs/codemirror/theme/moxer.css | 143 + .../wwwroot/libs/codemirror/theme/neat.css | 12 + .../wwwroot/libs/codemirror/theme/neo.css | 43 + .../wwwroot/libs/codemirror/theme/night.css | 27 + .../wwwroot/libs/codemirror/theme/nord.css | 42 + .../libs/codemirror/theme/oceanic-next.css | 46 + .../libs/codemirror/theme/panda-syntax.css | 85 + .../libs/codemirror/theme/paraiso-dark.css | 38 + .../libs/codemirror/theme/paraiso-light.css | 38 + .../libs/codemirror/theme/pastel-on-dark.css | 52 + .../libs/codemirror/theme/railscasts.css | 34 + .../libs/codemirror/theme/rubyblue.css | 25 + .../wwwroot/libs/codemirror/theme/seti.css | 44 + .../libs/codemirror/theme/shadowfox.css | 52 + .../libs/codemirror/theme/solarized.css | 165 + .../wwwroot/libs/codemirror/theme/ssms.css | 16 + .../libs/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + .../wwwroot/libs/codemirror/theme/ttcn.css | 64 + .../libs/codemirror/theme/twilight.css | 32 + .../libs/codemirror/theme/vibrant-ink.css | 34 + .../wwwroot/libs/codemirror/theme/xq-dark.css | 53 + .../libs/codemirror/theme/xq-light.css | 43 + .../wwwroot/libs/codemirror/theme/yeti.css | 44 + .../wwwroot/libs/codemirror/theme/yonce.css | 59 + .../wwwroot/libs/codemirror/theme/zenburn.css | 37 + .../host/Volo.CmsKit.Web.Unified/yarn.lock | 374 +- modules/docs/app/VoloDocs.Web/package.json | 4 +- .../wwwroot/libs/prismjs/CHANGELOG.md | 113 +- .../wwwroot/libs/prismjs/components.js | 2 +- .../wwwroot/libs/prismjs/components.json | 77 +- .../libs/prismjs/components/prism-abap.js | 2 +- .../libs/prismjs/components/prism-abap.min.js | 2 +- .../libs/prismjs/components/prism-abnf.min.js | 2 +- .../libs/prismjs/components/prism-ada.js | 7 +- .../libs/prismjs/components/prism-ada.min.js | 2 +- .../libs/prismjs/components/prism-agda.min.js | 2 +- .../libs/prismjs/components/prism-apex.min.js | 2 +- .../libs/prismjs/components/prism-armasm.js | 49 + .../prismjs/components/prism-armasm.min.js | 1 + .../libs/prismjs/components/prism-arturo.js | 105 + .../prismjs/components/prism-arturo.min.js | 1 + .../prismjs/components/prism-asciidoc.min.js | 2 +- .../libs/prismjs/components/prism-asmatmel.js | 2 +- .../prismjs/components/prism-asmatmel.min.js | 2 +- .../prismjs/components/prism-autohotkey.js | 10 +- .../components/prism-autohotkey.min.js | 2 +- .../prismjs/components/prism-avisynth.min.js | 2 +- .../libs/prismjs/components/prism-awk.js | 32 + .../libs/prismjs/components/prism-awk.min.js | 1 + .../prismjs/components/prism-batch.min.js | 2 +- .../libs/prismjs/components/prism-cfscript.js | 2 +- .../prismjs/components/prism-cfscript.min.js | 2 +- .../libs/prismjs/components/prism-cmake.js | 4 +- .../prismjs/components/prism-cmake.min.js | 2 +- .../libs/prismjs/components/prism-cooklang.js | 146 + .../prismjs/components/prism-cooklang.min.js | 1 + .../libs/prismjs/components/prism-coq.min.js | 2 +- .../libs/prismjs/components/prism-core.min.js | 2 +- .../libs/prismjs/components/prism-cpp.min.js | 2 +- .../prismjs/components/prism-csharp.min.js | 2 +- .../libs/prismjs/components/prism-cshtml.js | 52 +- .../prismjs/components/prism-cshtml.min.js | 2 +- .../libs/prismjs/components/prism-csp.min.js | 2 +- .../libs/prismjs/components/prism-cue.js | 84 + .../libs/prismjs/components/prism-cue.min.js | 1 + .../prismjs/components/prism-dataweave.min.js | 2 +- .../libs/prismjs/components/prism-diff.min.js | 2 +- .../prismjs/components/prism-django.min.js | 2 +- .../prismjs/components/prism-docker.min.js | 2 +- .../libs/prismjs/components/prism-dot.min.js | 2 +- .../libs/prismjs/components/prism-ejs.min.js | 2 +- .../prismjs/components/prism-elixir.min.js | 2 +- .../libs/prismjs/components/prism-erb.min.js | 2 +- .../libs/prismjs/components/prism-erlang.js | 2 +- .../prismjs/components/prism-erlang.min.js | 2 +- .../prismjs/components/prism-etlua.min.js | 2 +- .../prismjs/components/prism-excel-formula.js | 6 +- .../components/prism-excel-formula.min.js | 2 +- .../prismjs/components/prism-factor.min.js | 2 +- .../prismjs/components/prism-false.min.js | 2 +- .../libs/prismjs/components/prism-flow.js | 4 +- .../libs/prismjs/components/prism-flow.min.js | 2 +- .../libs/prismjs/components/prism-ftl.min.js | 2 +- .../libs/prismjs/components/prism-gedcom.js | 4 +- .../prismjs/components/prism-gedcom.min.js | 2 +- .../libs/prismjs/components/prism-gettext.js | 43 + .../prismjs/components/prism-gettext.min.js | 1 + .../prismjs/components/prism-gherkin.min.js | 2 +- .../prismjs/components/prism-graphql.min.js | 2 +- .../libs/prismjs/components/prism-groovy.js | 113 +- .../prismjs/components/prism-groovy.min.js | 2 +- .../libs/prismjs/components/prism-haml.min.js | 2 +- .../prismjs/components/prism-handlebars.js | 1 + .../components/prism-handlebars.min.js | 2 +- .../libs/prismjs/components/prism-http.min.js | 2 +- .../prism-icu-message-format.min.js | 2 +- .../libs/prismjs/components/prism-java.js | 41 +- .../libs/prismjs/components/prism-java.min.js | 2 +- .../prismjs/components/prism-javadoc.min.js | 2 +- .../components/prism-javadoclike.min.js | 2 +- .../prismjs/components/prism-javascript.js | 20 +- .../components/prism-javascript.min.js | 2 +- .../libs/prismjs/components/prism-jq.min.js | 2 +- .../prismjs/components/prism-js-extras.min.js | 2 +- .../components/prism-js-templates.min.js | 2 +- .../prismjs/components/prism-jsdoc.min.js | 2 +- .../libs/prismjs/components/prism-jsx.min.js | 2 +- .../components/prism-keepalived.min.js | 2 +- .../libs/prismjs/components/prism-keyman.js | 2 +- .../prismjs/components/prism-keyman.min.js | 2 +- .../prismjs/components/prism-latte.min.js | 2 +- .../prismjs/components/prism-lilypond.min.js | 2 +- .../prismjs/components/prism-linker-script.js | 30 + .../components/prism-linker-script.min.js | 1 + .../prismjs/components/prism-liquid.min.js | 2 +- .../libs/prismjs/components/prism-lisp.min.js | 2 +- .../libs/prismjs/components/prism-llvm.min.js | 2 +- .../prismjs/components/prism-markdown.min.js | 2 +- .../components/prism-markup-templating.min.js | 2 +- .../prismjs/components/prism-markup.min.js | 2 +- .../libs/prismjs/components/prism-mata.js | 50 + .../libs/prismjs/components/prism-mata.min.js | 1 + .../prismjs/components/prism-maxscript.min.js | 2 +- .../libs/prismjs/components/prism-mel.js | 41 +- .../libs/prismjs/components/prism-mel.min.js | 2 +- .../prismjs/components/prism-mongodb.min.js | 2 +- .../components/prism-naniscript.min.js | 2 +- .../libs/prismjs/components/prism-neon.js | 2 +- .../libs/prismjs/components/prism-neon.min.js | 2 +- .../prismjs/components/prism-nginx.min.js | 2 +- .../libs/prismjs/components/prism-odin.js | 99 + .../libs/prismjs/components/prism-odin.min.js | 1 + .../prismjs/components/prism-parigp.min.js | 2 +- .../prismjs/components/prism-pascaligo.min.js | 2 +- .../libs/prismjs/components/prism-perl.min.js | 2 +- .../libs/prismjs/components/prism-php.js | 6 +- .../libs/prismjs/components/prism-php.min.js | 2 +- .../prismjs/components/prism-plant-uml.js | 103 + .../prismjs/components/prism-plant-uml.min.js | 1 + .../components/prism-powershell.min.js | 2 +- .../prismjs/components/prism-properties.js | 10 +- .../components/prism-properties.min.js | 2 +- .../libs/prismjs/components/prism-pug.min.js | 2 +- .../libs/prismjs/components/prism-pure.min.js | 2 +- .../prismjs/components/prism-purebasic.js | 2 +- .../prismjs/components/prism-purebasic.min.js | 2 +- .../libs/prismjs/components/prism-qml.min.js | 2 +- .../prismjs/components/prism-qsharp.min.js | 2 +- .../libs/prismjs/components/prism-rescript.js | 60 + .../prismjs/components/prism-rescript.min.js | 1 + .../components/prism-robotframework.min.js | 2 +- .../libs/prismjs/components/prism-rust.min.js | 2 +- .../libs/prismjs/components/prism-sas.min.js | 2 +- .../prismjs/components/prism-scheme.min.js | 2 +- .../components/prism-shell-session.min.js | 2 +- .../prismjs/components/prism-smarty.min.js | 2 +- .../libs/prismjs/components/prism-sml.min.js | 2 +- .../libs/prismjs/components/prism-soy.min.js | 2 +- .../libs/prismjs/components/prism-stata.js | 76 + .../prismjs/components/prism-stata.min.js | 1 + .../prismjs/components/prism-supercollider.js | 36 + .../components/prism-supercollider.min.js | 1 + .../prismjs/components/prism-swift.min.js | 2 +- .../prismjs/components/prism-systemd.min.js | 2 +- .../components/prism-t4-templating.min.js | 2 +- .../prismjs/components/prism-textile.min.js | 2 +- .../libs/prismjs/components/prism-toml.min.js | 2 +- .../libs/prismjs/components/prism-tt2.min.js | 2 +- .../libs/prismjs/components/prism-twig.min.js | 2 +- .../libs/prismjs/components/prism-vhdl.js | 7 +- .../libs/prismjs/components/prism-vhdl.min.js | 2 +- .../libs/prismjs/components/prism-wolfram.js | 2 +- .../prismjs/components/prism-wolfram.min.js | 2 +- .../prismjs/components/prism-xml-doc.min.js | 2 +- .../prismjs/components/prism-xquery.min.js | 2 +- .../libs/prismjs/components/prism-yaml.min.js | 2 +- .../libs/prismjs/components/prism-zig.min.js | 2 +- .../wwwroot/libs/prismjs/package.json | 10 +- .../plugins/autolinker/prism-autolinker.js | 2 +- .../autolinker/prism-autolinker.min.js | 2 +- .../plugins/autoloader/prism-autoloader.js | 14 + .../autoloader/prism-autoloader.min.js | 2 +- .../command-line/prism-command-line.css | 2 +- .../command-line/prism-command-line.js | 41 +- .../command-line/prism-command-line.min.css | 2 +- .../command-line/prism-command-line.min.js | 2 +- .../prism-copy-to-clipboard.min.js | 2 +- .../custom-class/prism-custom-class.min.js | 2 +- .../prism-data-uri-highlight.min.js | 2 +- .../prism-diff-highlight.min.js | 2 +- .../prism-download-button.min.js | 2 +- .../prism-file-highlight.min.js | 2 +- .../prism-filter-highlight-all.min.js | 2 +- .../prism-highlight-keywords.min.js | 2 +- .../inline-color/prism-inline-color.min.js | 2 +- .../prism-jsonp-highlight.min.js | 2 +- .../plugins/keep-markup/prism-keep-markup.js | 11 +- .../keep-markup/prism-keep-markup.min.js | 2 +- .../prism-line-highlight.min.js | 2 +- .../line-numbers/prism-line-numbers.min.js | 2 +- .../match-braces/prism-match-braces.min.js | 2 +- .../prism-normalize-whitespace.min.js | 2 +- .../previewers/prism-previewers.min.js | 2 +- .../prism-remove-initial-line-feed.min.js | 2 +- .../prism-show-invisibles.min.js | 2 +- .../show-language/prism-show-language.js | 16 + .../show-language/prism-show-language.min.js | 2 +- .../plugins/toolbar/prism-toolbar.min.js | 2 +- .../plugins/treeview/prism-treeview.min.js | 2 +- .../prism-unescaped-markup.min.js | 2 +- .../libs/prismjs/plugins/wpd/prism-wpd.min.js | 2 +- .../wwwroot/libs/prismjs/prism.js | 20 +- modules/docs/app/VoloDocs.Web/yarn.lock | 298 +- .../package.json | 2 +- .../yarn.lock | 238 +- .../package.json | 4 +- .../yarn.lock | 272 +- npm/lerna.json | 2 +- npm/ng-packs/lerna.version.json | 2 +- npm/ng-packs/package.json | 24 +- .../packages/account-core/package.json | 6 +- npm/ng-packs/packages/account/package.json | 6 +- npm/ng-packs/packages/components/package.json | 6 +- npm/ng-packs/packages/core/package.json | 4 +- .../packages/feature-management/package.json | 4 +- npm/ng-packs/packages/identity/package.json | 6 +- .../permission-management/package.json | 4 +- npm/ng-packs/packages/schematics/package.json | 2 +- .../packages/setting-management/package.json | 6 +- .../packages/tenant-management/package.json | 6 +- .../packages/theme-basic/package.json | 6 +- .../packages/theme-shared/package.json | 4 +- npm/ng-packs/yarn.lock | 7 + npm/packs/anchor-js/package.json | 4 +- .../package.json | 4 +- .../package.json | 6 +- .../package.json | 4 +- .../package.json | 30 +- npm/packs/aspnetcore.mvc.ui/package-lock.json | 2 +- npm/packs/aspnetcore.mvc.ui/package.json | 2 +- npm/packs/blogging/package.json | 10 +- npm/packs/bootstrap-datepicker/package.json | 2 +- npm/packs/bootstrap/package.json | 4 +- npm/packs/chart.js/package.json | 2 +- npm/packs/clipboard/package.json | 4 +- npm/packs/cms-kit.admin/package.json | 12 +- npm/packs/cms-kit.public/package.json | 6 +- npm/packs/cms-kit/package.json | 6 +- npm/packs/codemirror/package.json | 4 +- npm/packs/core/package.json | 4 +- npm/packs/cropperjs/package.json | 4 +- npm/packs/datatables.net-bs4/package.json | 4 +- npm/packs/datatables.net-bs5/package.json | 4 +- npm/packs/datatables.net/package.json | 4 +- npm/packs/docs/package.json | 12 +- npm/packs/flag-icon-css/package.json | 2 +- npm/packs/font-awesome/package.json | 4 +- npm/packs/highlight.js/package.json | 4 +- npm/packs/jquery-form/package.json | 4 +- .../package.json | 4 +- npm/packs/jquery-validation/package.json | 4 +- npm/packs/jquery/package.json | 4 +- npm/packs/jstree/package.json | 4 +- npm/packs/lodash/package.json | 4 +- npm/packs/luxon/package.json | 4 +- .../package.json | 4 +- npm/packs/markdown-it/package.json | 4 +- npm/packs/owl.carousel/package.json | 4 +- npm/packs/popper.js/package.json | 4 +- npm/packs/prismjs/package.json | 6 +- npm/packs/select2/package.json | 4 +- npm/packs/signalr/package.json | 4 +- npm/packs/slugify/package.json | 2 +- npm/packs/star-rating-svg/package.json | 4 +- npm/packs/sweetalert2/package.json | 4 +- npm/packs/timeago/package.json | 4 +- npm/packs/toastr/package.json | 4 +- npm/packs/tui-editor/package.json | 6 +- npm/packs/uppy/package.json | 4 +- npm/packs/utils/package.json | 2 +- npm/packs/vee-validate/package.json | 4 +- npm/packs/virtual-file-explorer/package.json | 6 +- npm/packs/vue/package.json | 2 +- templates/app-nolayers/angular/package.json | 18 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/app/angular/package.json | 18 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/module/angular/package.json | 18 +- .../projects/my-project-name/package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- 553 files changed, 58401 insertions(+), 1869 deletions(-) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/comment.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/continuecomment.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/autorefresh.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/panel.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/placeholder.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/rulers.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closebrackets.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closetag.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/continuelist.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchbrackets.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchtags.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/trailingspace.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/brace-fold.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/comment-fold.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldcode.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/indent-fold.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/markdown-fold.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/xml-fold.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/anyword-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/css-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/html-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/javascript-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/sql-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/xml-hint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/coffeescript-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/css-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/html-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/javascript-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/json-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/yaml-lint.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/loadmode.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex_test.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/overlay.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/simple.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/colorize.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode-standalone.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.node.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/annotatescrollbar.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/scrollpastend.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/jump-to-line.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mscgen/mscgen.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/solr/solr.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/soy/soy.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vue/vue.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/wast/wast.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js create mode 100644 modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index dc7f6f50d0..9948a950e9 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,7 +3,7 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^5.2.1", + "@abp/aspnetcore.mvc.ui.theme.shared": "^5.3.0-rc.1", "highlight.js": "^9.13.1" }, "devDependencies": {} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index e40aac01d8..1fc849849a 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,30 +2,30 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.shared@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -34,144 +34,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 4caf5c1672..302de41fa4 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/prismjs": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/prismjs": "^5.3.0-rc.1" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index 407c79dba3..b06a3e49a6 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,161 +41,161 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 1d0e320c39..d25e7b6f31 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/blogging": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/blogging": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 08c5aba314..003c3aa68d 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,187 +41,187 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-5.2.1.tgz#5b9c98d120293a835c0a0cb27b1764be849140d9" - integrity sha512-p2AamTCbBZkbqJKZ341JXYnzvJm4vCkT1gTZPNY49tMNa5brl2oFloI+tk491JHHaNz4lpHGFpPzQftjLPdTew== +"@abp/blogging@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-5.3.0-rc.1.tgz#a5c7cea988c167d477e858d9488e7e4f12d26d34" + integrity sha512-ABMBP+oqyWwndHdqsorQaclMd2EmKTb6uT1KKWYmsv/Q+mmGEIhGUH2vIT+HrYoFvyj5o3Bedw+rPzqxjL3H9w== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - "@abp/owl.carousel" "~5.2.1" - "@abp/prismjs" "~5.2.1" - "@abp/tui-editor" "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + "@abp/owl.carousel" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" + "@abp/tui-editor" "~5.3.0-rc.1" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/owl.carousel@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-5.2.1.tgz#f58d28c98ccb8ff0f9cbcf612519648032fa4399" - integrity sha512-LYDSKrHlrzB5mD33m39olc1V96NJnNPTv3+VefKNnZvUCRHGwwCfow4pwWgjmn2uvHBKW5qiBX9c2EbwLFplQA== +"@abp/owl.carousel@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-5.3.0-rc.1.tgz#504fa6d37553810969cd4e3b3b323744a7ec13bc" + integrity sha512-GPX+McoItf8EvZ6p7cbb1t2LovOSfDemzUXFgOLD0pCTPXiriNYknIoi/ZsvL3U/syQHpAuEbkt2C/fVVjbSnQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" owl.carousel "^2.3.4" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/tui-editor@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.2.1.tgz#06be1a029de754868fa11ce3479be3fbc90ba103" - integrity sha512-Mi3preBkGEU1hrtSNCkOjeXPc9c74DFt8BL82sPIVDglYcVrVLXbnNTWE/CHP0spmKWh33ek4FoH1Pt0TePMuw== +"@abp/tui-editor@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.1.tgz#d5b6e46c922e9743216395bc055ed8208c2ead0b" + integrity sha512-wMEph23kwGJyAGweivKn2EDTRQQD0UG0X23qMd4Cv285qdu4AoYL2/shBDFKiXfhN0Q7EZ06mhOyTuhJmTnNUg== dependencies: - "@abp/jquery" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index b65206c781..3eeba0cb36 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index e8b775d277..986dea9735 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index a2285f9846..5d7f90cd88 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index f2937c3593..5739647ca3 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=5.2.1", - "@abp/ng.theme.shared": ">=5.2.1" + "@abp/ng.core": ">=5.3.0-rc.1", + "@abp/ng.theme.shared": ">=5.3.0-rc.1" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index 44e817e13e..09b98ca204 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 69f5c5ac40..076a560d65 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index 0bd254552e..8ed51806b1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index 7004bbc292..62e3847647 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/cms-kit": "5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/cms-kit": "5.3.0-rc.1" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/comment.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/comment.js new file mode 100644 index 0000000000..dac48d0387 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/comment.js @@ -0,0 +1,211 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var noOptions = {}; + var nonWS = /[^\s\u00a0]/; + var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos; + + function firstNonWS(str) { + var found = str.search(nonWS); + return found == -1 ? 0 : found; + } + + CodeMirror.commands.toggleComment = function(cm) { + cm.toggleComment(); + }; + + CodeMirror.defineExtension("toggleComment", function(options) { + if (!options) options = noOptions; + var cm = this; + var minLine = Infinity, ranges = this.listSelections(), mode = null; + for (var i = ranges.length - 1; i >= 0; i--) { + var from = ranges[i].from(), to = ranges[i].to(); + if (from.line >= minLine) continue; + if (to.line >= minLine) to = Pos(minLine, 0); + minLine = from.line; + if (mode == null) { + if (cm.uncomment(from, to, options)) mode = "un"; + else { cm.lineComment(from, to, options); mode = "line"; } + } else if (mode == "un") { + cm.uncomment(from, to, options); + } else { + cm.lineComment(from, to, options); + } + } + }); + + // Rough heuristic to try and detect lines that are part of multi-line string + function probablyInsideString(cm, pos, line) { + return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line) + } + + function getMode(cm, pos) { + var mode = cm.getMode() + return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos) + } + + CodeMirror.defineExtension("lineComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + var firstLine = self.getLine(from.line); + if (firstLine == null || probablyInsideString(self, from, firstLine)) return; + + var commentString = options.lineComment || mode.lineComment; + if (!commentString) { + if (options.blockCommentStart || mode.blockCommentStart) { + options.fullLines = true; + self.blockComment(from, to, options); + } + return; + } + + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); + var pad = options.padding == null ? " " : options.padding; + var blankLines = options.commentBlankLines || from.line == to.line; + + self.operation(function() { + if (options.indent) { + var baseString = null; + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i); + var whitespace = line.slice(0, firstNonWS(line)); + if (baseString == null || baseString.length > whitespace.length) { + baseString = whitespace; + } + } + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i), cut = baseString.length; + if (!blankLines && !nonWS.test(line)) continue; + if (line.slice(0, cut) != baseString) cut = firstNonWS(line); + self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); + } + } else { + for (var i = from.line; i < end; ++i) { + if (blankLines || nonWS.test(self.getLine(i))) + self.replaceRange(commentString + pad, Pos(i, 0)); + } + } + }); + }); + + CodeMirror.defineExtension("blockComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) { + if ((options.lineComment || mode.lineComment) && options.fullLines != false) + self.lineComment(from, to, options); + return; + } + if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return + + var end = Math.min(to.line, self.lastLine()); + if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; + + var pad = options.padding == null ? " " : options.padding; + if (from.line > end) return; + + self.operation(function() { + if (options.fullLines != false) { + var lastLineHasText = nonWS.test(self.getLine(end)); + self.replaceRange(pad + endString, Pos(end)); + self.replaceRange(startString + pad, Pos(from.line, 0)); + var lead = options.blockCommentLead || mode.blockCommentLead; + if (lead != null) for (var i = from.line + 1; i <= end; ++i) + if (i != end || lastLineHasText) + self.replaceRange(lead + pad, Pos(i, 0)); + } else { + var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected() + self.replaceRange(endString, to); + if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to) + self.replaceRange(startString, from); + } + }); + }); + + CodeMirror.defineExtension("uncomment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, mode = getMode(self, from); + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); + + // Try finding line comments + var lineString = options.lineComment || mode.lineComment, lines = []; + var pad = options.padding == null ? " " : options.padding, didSomething; + lineComment: { + if (!lineString) break lineComment; + for (var i = start; i <= end; ++i) { + var line = self.getLine(i); + var found = line.indexOf(lineString); + if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; + if (found == -1 && nonWS.test(line)) break lineComment; + if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; + lines.push(line); + } + self.operation(function() { + for (var i = start; i <= end; ++i) { + var line = lines[i - start]; + var pos = line.indexOf(lineString), endPos = pos + lineString.length; + if (pos < 0) continue; + if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; + didSomething = true; + self.replaceRange("", Pos(i, pos), Pos(i, endPos)); + } + }); + if (didSomething) return true; + } + + // Try block comments + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) return false; + var lead = options.blockCommentLead || mode.blockCommentLead; + var startLine = self.getLine(start), open = startLine.indexOf(startString) + if (open == -1) return false + var endLine = end == start ? startLine : self.getLine(end) + var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); + var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1) + if (close == -1 || + !/comment/.test(self.getTokenTypeAt(insideStart)) || + !/comment/.test(self.getTokenTypeAt(insideEnd)) || + self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) + return false; + + // Avoid killing block comments completely outside the selection. + // Positions of the last startString before the start of the selection, and the first endString after it. + var lastStart = startLine.lastIndexOf(startString, from.ch); + var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); + if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; + // Positions of the first endString after the end of the selection, and the last startString before it. + firstEnd = endLine.indexOf(endString, to.ch); + var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); + lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; + if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; + + self.operation(function() { + self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), + Pos(end, close + endString.length)); + var openEnd = open + startString.length; + if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; + self.replaceRange("", Pos(start, open), Pos(start, openEnd)); + if (lead) for (var i = start + 1; i <= end; ++i) { + var line = self.getLine(i), found = line.indexOf(lead); + if (found == -1 || nonWS.test(line.slice(0, found))) continue; + var foundEnd = found + lead.length; + if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; + self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); + } + }); + return true; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/continuecomment.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/continuecomment.js new file mode 100644 index 0000000000..7ca1b4a9cc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/comment/continuecomment.js @@ -0,0 +1,114 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + var nonspace = /\S/g; + var repeat = String.prototype.repeat || function (n) { return Array(n + 1).join(this); }; + function continueComment(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), mode, inserts = []; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].head + if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass; + var modeHere = cm.getModeAt(pos) + if (!mode) mode = modeHere; + else if (mode != modeHere) return CodeMirror.Pass; + + var insert = null, line, found; + var blockStart = mode.blockCommentStart, lineCmt = mode.lineComment; + if (blockStart && mode.blockCommentContinue) { + line = cm.getLine(pos.line); + var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length); + // 1. if this block comment ended + // 2. if this is actually inside a line comment + if (end != -1 && end == pos.ch - mode.blockCommentEnd.length || + lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 && + /\bcomment\b/.test(cm.getTokenTypeAt({line: pos.line, ch: found + 1}))) { + // ...then don't continue it + } else if (pos.ch >= blockStart.length && + (found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 && + found > end) { + // reuse the existing leading spaces/tabs/mixed + // or build the correct indent using CM's tab/indent options + if (nonspaceAfter(0, line) >= found) { + insert = line.slice(0, found); + } else { + var tabSize = cm.options.tabSize, numTabs; + found = CodeMirror.countColumn(line, found, tabSize); + insert = !cm.options.indentWithTabs ? repeat.call(" ", found) : + repeat.call("\t", (numTabs = Math.floor(found / tabSize))) + + repeat.call(" ", found - tabSize * numTabs); + } + } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 && + found <= pos.ch && + found <= nonspaceAfter(0, line)) { + insert = line.slice(0, found); + } + if (insert != null) insert += mode.blockCommentContinue + } + if (insert == null && lineCmt && continueLineCommentEnabled(cm)) { + if (line == null) line = cm.getLine(pos.line); + found = line.indexOf(lineCmt); + // cursor at pos 0, line comment also at pos 0 => shift it down, don't continue + if (!pos.ch && !found) insert = ""; + // continue only if the line starts with an optional space + line comment + else if (found > -1 && nonspaceAfter(0, line) >= found) { + // don't continue if there's only space(s) after cursor or the end of the line + insert = nonspaceAfter(pos.ch, line) > -1; + // but always continue if the next line starts with a line comment too + if (!insert) { + var next = cm.getLine(pos.line + 1) || '', + nextFound = next.indexOf(lineCmt); + insert = nextFound > -1 && nonspaceAfter(0, next) >= nextFound || null; + } + if (insert) { + insert = line.slice(0, found) + lineCmt + + line.slice(found + lineCmt.length).match(/^\s*/)[0]; + } + } + } + if (insert == null) return CodeMirror.Pass; + inserts[i] = "\n" + insert; + } + + cm.operation(function() { + for (var i = ranges.length - 1; i >= 0; i--) + cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); + }); + } + + function nonspaceAfter(ch, str) { + nonspace.lastIndex = ch; + var m = nonspace.exec(str); + return m ? m.index : -1; + } + + function continueLineCommentEnabled(cm) { + var opt = cm.getOption("continueComments"); + if (opt && typeof opt == "object") + return opt.continueLineComment !== false; + return true; + } + + CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { + if (prev && prev != CodeMirror.Init) + cm.removeKeyMap("continueComment"); + if (val) { + var key = "Enter"; + if (typeof val == "string") + key = val; + else if (typeof val == "object" && val.key) + key = val.key; + var map = {name: "continueComment"}; + map[key] = continueComment; + cm.addKeyMap(map); + } + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.css new file mode 100644 index 0000000000..677c078387 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.css @@ -0,0 +1,32 @@ +.CodeMirror-dialog { + position: absolute; + left: 0; right: 0; + background: inherit; + z-index: 15; + padding: .1em .8em; + overflow: hidden; + color: inherit; +} + +.CodeMirror-dialog-top { + border-bottom: 1px solid #eee; + top: 0; +} + +.CodeMirror-dialog-bottom { + border-top: 1px solid #eee; + bottom: 0; +} + +.CodeMirror-dialog input { + border: none; + outline: none; + background: transparent; + width: 20em; + color: inherit; + font-family: monospace; +} + +.CodeMirror-dialog button { + font-size: 70%; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.js new file mode 100644 index 0000000000..5f1f4aa4cc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/dialog/dialog.js @@ -0,0 +1,163 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Open simple dialogs on top of an editor. Relies on dialog.css. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + function dialogDiv(cm, template, bottom) { + var wrap = cm.getWrapperElement(); + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; + else + dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; + + if (typeof template == "string") { + dialog.innerHTML = template; + } else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + CodeMirror.addClass(wrap, 'dialog-opened'); + return dialog; + } + + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + + CodeMirror.defineExtension("openDialog", function(template, callback, options) { + if (!options) options = {}; + + closeNotification(this, null); + + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + me.focus(); + + if (options.onClose) options.onClose(dialog); + } + } + + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + inp.focus(); + + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) { + inp.select(); + } + } + + if (options.onInput) + CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); + + CodeMirror.on(inp, "keydown", function(e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value, e); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(dialog, "focusout", function (evt) { + if (evt.relatedTarget !== null) close(); + }); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function() { + close(); + me.focus(); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + + button.focus(); + } + return close; + }); + + CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { + closeNotification(this, null); + var dialog = dialogDiv(this, template, options && options.bottom); + var buttons = dialog.getElementsByTagName("button"); + var closed = false, me = this, blurring = 1; + function close() { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + me.focus(); + } + buttons[0].focus(); + for (var i = 0; i < buttons.length; ++i) { + var b = buttons[i]; + (function(callback) { + CodeMirror.on(b, "click", function(e) { + CodeMirror.e_preventDefault(e); + close(); + if (callback) callback(me); + }); + })(callbacks[i]); + CodeMirror.on(b, "blur", function() { + --blurring; + setTimeout(function() { if (blurring <= 0) close(); }, 200); + }); + CodeMirror.on(b, "focus", function() { ++blurring; }); + } + }); + + /* + * openNotification + * Opens a notification, that can be closed with an optional timer + * (default 5000ms timer) and always closes on click. + * + * If a notification is opened while another is opened, it will close the + * currently opened one and open the new one immediately. + */ + CodeMirror.defineExtension("openNotification", function(template, options) { + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + } + + CodeMirror.on(dialog, 'click', function(e) { + CodeMirror.e_preventDefault(e); + close(); + }); + + if (duration) + doneTimer = setTimeout(close, duration); + + return close; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/autorefresh.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/autorefresh.js new file mode 100644 index 0000000000..37014dc31d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/autorefresh.js @@ -0,0 +1,47 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + CodeMirror.defineOption("autoRefresh", false, function(cm, val) { + if (cm.state.autoRefresh) { + stopListening(cm, cm.state.autoRefresh) + cm.state.autoRefresh = null + } + if (val && cm.display.wrapper.offsetHeight == 0) + startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250}) + }) + + function startListening(cm, state) { + function check() { + if (cm.display.wrapper.offsetHeight) { + stopListening(cm, state) + if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight) + cm.refresh() + } else { + state.timeout = setTimeout(check, state.delay) + } + } + state.timeout = setTimeout(check, state.delay) + state.hurry = function() { + clearTimeout(state.timeout) + state.timeout = setTimeout(check, 50) + } + CodeMirror.on(window, "mouseup", state.hurry) + CodeMirror.on(window, "keyup", state.hurry) + } + + function stopListening(_cm, state) { + clearTimeout(state.timeout) + CodeMirror.off(window, "mouseup", state.hurry) + CodeMirror.off(window, "keyup", state.hurry) + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.css new file mode 100644 index 0000000000..437acd89be --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.css @@ -0,0 +1,6 @@ +.CodeMirror-fullscreen { + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + height: auto; + z-index: 9; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.js new file mode 100644 index 0000000000..eda7300f12 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/fullscreen.js @@ -0,0 +1,41 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { + if (old == CodeMirror.Init) old = false; + if (!old == !val) return; + if (val) setFullscreen(cm); + else setNormal(cm); + }); + + function setFullscreen(cm) { + var wrap = cm.getWrapperElement(); + cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, + width: wrap.style.width, height: wrap.style.height}; + wrap.style.width = ""; + wrap.style.height = "auto"; + wrap.className += " CodeMirror-fullscreen"; + document.documentElement.style.overflow = "hidden"; + cm.refresh(); + } + + function setNormal(cm) { + var wrap = cm.getWrapperElement(); + wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); + document.documentElement.style.overflow = ""; + var info = cm.state.fullScreenRestore; + wrap.style.width = info.width; wrap.style.height = info.height; + window.scrollTo(info.scrollLeft, info.scrollTop); + cm.refresh(); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/panel.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/panel.js new file mode 100644 index 0000000000..29f7e0bebb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/panel.js @@ -0,0 +1,133 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function (CodeMirror) { + CodeMirror.defineExtension("addPanel", function (node, options) { + options = options || {}; + + if (!this.state.panels) initPanels(this); + + var info = this.state.panels; + var wrapper = info.wrapper; + var cmWrapper = this.getWrapperElement(); + var replace = options.replace instanceof Panel && !options.replace.cleared; + + if (options.after instanceof Panel && !options.after.cleared) { + wrapper.insertBefore(node, options.before.node.nextSibling); + } else if (options.before instanceof Panel && !options.before.cleared) { + wrapper.insertBefore(node, options.before.node); + } else if (replace) { + wrapper.insertBefore(node, options.replace.node); + options.replace.clear(true); + } else if (options.position == "bottom") { + wrapper.appendChild(node); + } else if (options.position == "before-bottom") { + wrapper.insertBefore(node, cmWrapper.nextSibling); + } else if (options.position == "after-top") { + wrapper.insertBefore(node, cmWrapper); + } else { + wrapper.insertBefore(node, wrapper.firstChild); + } + + var height = (options && options.height) || node.offsetHeight; + + var panel = new Panel(this, node, options, height); + info.panels.push(panel); + + this.setSize(); + if (options.stable && isAtTop(this, node)) + this.scrollTo(null, this.getScrollInfo().top + height); + + return panel; + }); + + function Panel(cm, node, options, height) { + this.cm = cm; + this.node = node; + this.options = options; + this.height = height; + this.cleared = false; + } + + /* when skipRemove is true, clear() was called from addPanel(). + * Thus removePanels() should not be called (issue 5518) */ + Panel.prototype.clear = function (skipRemove) { + if (this.cleared) return; + this.cleared = true; + var info = this.cm.state.panels; + info.panels.splice(info.panels.indexOf(this), 1); + this.cm.setSize(); + if (this.options.stable && isAtTop(this.cm, this.node)) + this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height) + info.wrapper.removeChild(this.node); + if (info.panels.length == 0 && !skipRemove) removePanels(this.cm); + }; + + Panel.prototype.changed = function () { + this.height = this.node.getBoundingClientRect().height; + this.cm.setSize(); + }; + + function initPanels(cm) { + var wrap = cm.getWrapperElement() + var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; + var height = parseInt(style.height); + var info = cm.state.panels = { + setHeight: wrap.style.height, + panels: [], + wrapper: document.createElement("div") + }; + var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo() + wrap.parentNode.insertBefore(info.wrapper, wrap); + info.wrapper.appendChild(wrap); + cm.scrollTo(scrollPos.left, scrollPos.top) + if (hasFocus) cm.focus(); + + cm._setSize = cm.setSize; + if (height != null) cm.setSize = function (width, newHeight) { + if (!newHeight) newHeight = info.wrapper.offsetHeight; + info.setHeight = newHeight; + if (typeof newHeight != "number") { + var px = /^(\d+\.?\d*)px$/.exec(newHeight); + if (px) { + newHeight = Number(px[1]); + } else { + info.wrapper.style.height = newHeight; + newHeight = info.wrapper.offsetHeight; + } + } + var editorheight = newHeight - info.panels + .map(function (p) { return p.node.getBoundingClientRect().height; }) + .reduce(function (a, b) { return a + b; }, 0); + cm._setSize(width, editorheight); + height = newHeight; + }; + } + + function removePanels(cm) { + var info = cm.state.panels; + cm.state.panels = null; + + var wrap = cm.getWrapperElement() + var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo() + info.wrapper.parentNode.replaceChild(wrap, info.wrapper); + cm.scrollTo(scrollPos.left, scrollPos.top) + if (hasFocus) cm.focus(); + wrap.style.height = info.setHeight; + cm.setSize = cm._setSize; + cm.setSize(); + } + + function isAtTop(cm, dom) { + for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling) + if (sibling == cm.getWrapperElement()) return true + return false + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/placeholder.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/placeholder.js new file mode 100644 index 0000000000..cfb8341db2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/placeholder.js @@ -0,0 +1,78 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("placeholder", "", function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.on("blur", onBlur); + cm.on("change", onChange); + cm.on("swapDoc", onChange); + CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = function() { onComposition(cm) }) + onChange(cm); + } else if (!val && prev) { + cm.off("blur", onBlur); + cm.off("change", onChange); + cm.off("swapDoc", onChange); + CodeMirror.off(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose) + clearPlaceholder(cm); + var wrapper = cm.getWrapperElement(); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); + } + + if (val && !cm.hasFocus()) onBlur(cm); + }); + + function clearPlaceholder(cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); + cm.state.placeholder = null; + } + } + function setPlaceholder(cm) { + clearPlaceholder(cm); + var elt = cm.state.placeholder = document.createElement("pre"); + elt.style.cssText = "height: 0; overflow: visible"; + elt.style.direction = cm.getOption("direction"); + elt.className = "CodeMirror-placeholder CodeMirror-line-like"; + var placeHolder = cm.getOption("placeholder") + if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder) + elt.appendChild(placeHolder) + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); + } + + function onComposition(cm) { + setTimeout(function() { + var empty = false + if (cm.lineCount() == 1) { + var input = cm.getInputField() + empty = input.nodeName == "TEXTAREA" ? !cm.getLine(0).length + : !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent) + } + if (empty) setPlaceholder(cm) + else clearPlaceholder(cm) + }, 20) + } + + function onBlur(cm) { + if (isEmpty(cm)) setPlaceholder(cm); + } + function onChange(cm) { + var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); + + if (empty) setPlaceholder(cm); + else clearPlaceholder(cm); + } + + function isEmpty(cm) { + return (cm.lineCount() === 1) && (cm.getLine(0) === ""); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/rulers.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/rulers.js new file mode 100644 index 0000000000..0bb83bb022 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/display/rulers.js @@ -0,0 +1,51 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("rulers", false, function(cm, val) { + if (cm.state.rulerDiv) { + cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv) + cm.state.rulerDiv = null + cm.off("refresh", drawRulers) + } + if (val && val.length) { + cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement("div"), cm.display.lineSpace) + cm.state.rulerDiv.className = "CodeMirror-rulers" + drawRulers(cm) + cm.on("refresh", drawRulers) + } + }); + + function drawRulers(cm) { + cm.state.rulerDiv.textContent = "" + var val = cm.getOption("rulers"); + var cw = cm.defaultCharWidth(); + var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; + cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + "px"; + for (var i = 0; i < val.length; i++) { + var elt = document.createElement("div"); + elt.className = "CodeMirror-ruler"; + var col, conf = val[i]; + if (typeof conf == "number") { + col = conf; + } else { + col = conf.column; + if (conf.className) elt.className += " " + conf.className; + if (conf.color) elt.style.borderColor = conf.color; + if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; + if (conf.width) elt.style.borderLeftWidth = conf.width; + } + elt.style.left = (left + col * cw) + "px"; + cm.state.rulerDiv.appendChild(elt) + } + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closebrackets.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closebrackets.js new file mode 100644 index 0000000000..593d4439fb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closebrackets.js @@ -0,0 +1,201 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + var defaults = { + pairs: "()[]{}''\"\"", + closeBefore: ")]}'\":;>", + triples: "", + explode: "[]{}" + }; + + var Pos = CodeMirror.Pos; + + CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + ensureBound(getOption(val, "pairs")) + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + + var keyMap = {Backspace: handleBackspace, Enter: handleEnter}; + function ensureBound(chars) { + for (var i = 0; i < chars.length; i++) { + var ch = chars.charAt(i), key = "'" + ch + "'" + if (!keyMap[key]) keyMap[key] = handler(ch) + } + } + ensureBound(defaults.pairs + "`") + + function handler(ch) { + return function(cm) { return handleChar(cm, ch); }; + } + + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + for (var i = ranges.length - 1; i >= 0; i--) { + var cur = ranges[i].head; + cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); + } + } + + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; + + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function() { + var linesep = cm.lineSeparator() || "\n"; + cm.replaceSelection(linesep + linesep, null); + moveSel(cm, -1) + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var line = ranges[i].head.line; + cm.indentLine(line, null, true); + cm.indentLine(line + 1, null, true); + } + }); + } + + function moveSel(cm, dir) { + var newRanges = [], ranges = cm.listSelections(), primary = 0 + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i] + if (range.head == cm.getCursor()) primary = i + var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1} + newRanges.push({anchor: pos, head: pos}) + } + cm.setSelections(newRanges, primary) + } + + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))}; + } + + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + + var closeBefore = getOption(conf,"closeBefore"); + + var triples = getOption(conf, "triples"); + + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + + var type; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], cur = range.head, curType; + var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); + if (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) + curType = "both"; + else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) + curType = "skipThree"; + else + curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && + cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) { + if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass; + curType = "addFour"; + } else if (identical) { + var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur) + if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both"; + else return CodeMirror.Pass; + } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType; + else if (type != curType) return CodeMirror.Pass; + } + + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function() { + if (type == "skip") { + moveSel(cm, 1) + } else if (type == "skipThree") { + moveSel(cm, 3) + } else if (type == "surround") { + var sels = cm.getSelections(); + for (var i = 0; i < sels.length; i++) + sels[i] = left + sels[i] + right; + cm.replaceSelections(sels, "around"); + sels = cm.listSelections().slice(); + for (var i = 0; i < sels.length; i++) + sels[i] = contractSelection(sels[i]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + moveSel(cm, -1) + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + moveSel(cm, 1) + } + }); + } + + function charsAround(cm, pos) { + var str = cm.getRange(Pos(pos.line, pos.ch - 1), + Pos(pos.line, pos.ch + 1)); + return str.length == 2 ? str : null; + } + + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)) + return /\bstring/.test(token.type) && token.start == pos.ch && + (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))) + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closetag.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closetag.js new file mode 100644 index 0000000000..7c22a50ecf --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/closetag.js @@ -0,0 +1,185 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Tag-closer extension for CodeMirror. + * + * This extension adds an "autoCloseTags" option that can be set to + * either true to get the default behavior, or an object to further + * configure its behavior. + * + * These are supported options: + * + * `whenClosing` (default true) + * Whether to autoclose when the '/' of a closing tag is typed. + * `whenOpening` (default true) + * Whether to autoclose the tag when the final '>' of an opening + * tag is typed. + * `dontCloseTags` (default is empty tags for HTML, none for XML) + * An array of tag names that should not be autoclosed. + * `indentTags` (default is block tags for HTML, none for XML) + * An array of tag names that should, when opened, cause a + * blank line to be added inside the tag, and the blank line and + * closing line to be indented. + * `emptyTags` (default is none) + * An array of XML tag names that should be autoclosed with '/>'. + * + * See demos/closetag.html for a usage example. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { + if (old != CodeMirror.Init && old) + cm.removeKeyMap("autoCloseTags"); + if (!val) return; + var map = {name: "autoCloseTags"}; + if (typeof val != "object" || val.whenClosing !== false) + map["'/'"] = function(cm) { return autoCloseSlash(cm); }; + if (typeof val != "object" || val.whenOpening !== false) + map["'>'"] = function(cm) { return autoCloseGT(cm); }; + cm.addKeyMap(map); + }); + + var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", + "source", "track", "wbr"]; + var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", + "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; + + function autoCloseGT(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), replacements = []; + var opt = cm.getOption("autoCloseTags"); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var pos = ranges[i].head, tok = cm.getTokenAt(pos); + var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; + var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state) + var tagName = tagInfo && tagInfo.name + if (!tagName) return CodeMirror.Pass + + var html = inner.mode.configuration == "html"; + var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); + var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); + + if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); + var lowerTagName = tagName.toLowerCase(); + // Don't process the '>' at the end of an end-tag or self-closing tag + if (!tagName || + tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || + tok.type == "tag" && tagInfo.close || + tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like + dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || + closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true)) + return CodeMirror.Pass; + + var emptyTags = typeof opt == "object" && opt.emptyTags; + if (emptyTags && indexOf(emptyTags, tagName) > -1) { + replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) }; + continue; + } + + var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; + replacements[i] = {indent: indent, + text: ">" + (indent ? "\n\n" : "") + "", + newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; + } + + var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose); + for (var i = ranges.length - 1; i >= 0; i--) { + var info = replacements[i]; + cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); + var sel = cm.listSelections().slice(0); + sel[i] = {head: info.newPos, anchor: info.newPos}; + cm.setSelections(sel); + if (!dontIndentOnAutoClose && info.indent) { + cm.indentLine(info.newPos.line, null, true); + cm.indentLine(info.newPos.line + 1, null, true); + } + } + } + + function autoCloseCurrent(cm, typingSlash) { + var ranges = cm.listSelections(), replacements = []; + var head = typingSlash ? "/" : "") replacement += ">"; + replacements[i] = replacement; + } + cm.replaceSelections(replacements); + ranges = cm.listSelections(); + if (!dontIndentOnAutoClose) { + for (var i = 0; i < ranges.length; i++) + if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) + cm.indentLine(ranges[i].head.line); + } + } + + function autoCloseSlash(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + return autoCloseCurrent(cm, true); + } + + CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + // If xml-fold is loaded, we use its functionality to try and verify + // whether a given tag is actually unclosed. + function closingTagExists(cm, context, tagName, pos, newTag) { + if (!CodeMirror.scanForClosingTag) return false; + var end = Math.min(cm.lastLine() + 1, pos.line + 500); + var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!nextClose || nextClose.tag != tagName) return false; + // If the immediate wrapping context contains onCx instances of + // the same tag, a closing tag only exists if there are at least + // that many closing tags of that type following. + var onCx = newTag ? 1 : 0 + for (var i = context.length - 1; i >= 0; i--) { + if (context[i] == tagName) ++onCx + else break + } + pos = nextClose.to; + for (var i = 1; i < onCx; i++) { + var next = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!next || next.tag != tagName) return false; + pos = next.to; + } + return true; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/continuelist.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/continuelist.js new file mode 100644 index 0000000000..d8b2e0e1fe --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/continuelist.js @@ -0,0 +1,101 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, + emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, + unorderedListRE = /[*+-]\s/; + + CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), replacements = []; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].head; + + // If we're not in Markdown mode, fall back to normal newlineAndIndent + var eolState = cm.getStateAfter(pos.line); + var inner = CodeMirror.innerMode(cm.getMode(), eolState); + if (inner.mode.name !== "markdown" && inner.mode.helperType !== "markdown") { + cm.execCommand("newlineAndIndent"); + return; + } else { + eolState = inner.state; + } + + var inList = eolState.list !== false; + var inQuote = eolState.quote !== 0; + + var line = cm.getLine(pos.line), match = listRE.exec(line); + var cursorBeforeBullet = /^\s*$/.test(line.slice(0, pos.ch)); + if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) { + cm.execCommand("newlineAndIndent"); + return; + } + if (emptyListRE.test(line)) { + var endOfQuote = inQuote && />\s*$/.test(line) + var endOfList = !/>\s*$/.test(line) + if (endOfQuote || endOfList) cm.replaceRange("", { + line: pos.line, ch: 0 + }, { + line: pos.line, ch: pos.ch + 1 + }); + replacements[i] = "\n"; + } else { + var indent = match[1], after = match[5]; + var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0); + var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace("x", " "); + replacements[i] = "\n" + indent + bullet + after; + + if (numbered) incrementRemainingMarkdownListNumbers(cm, pos); + } + } + + cm.replaceSelections(replacements); + }; + + // Auto-updating Markdown list numbers when a new item is added to the + // middle of a list + function incrementRemainingMarkdownListNumbers(cm, pos) { + var startLine = pos.line, lookAhead = 0, skipCount = 0; + var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1]; + + do { + lookAhead += 1; + var nextLineNumber = startLine + lookAhead; + var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine); + + if (nextItem) { + var nextIndent = nextItem[1]; + var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount); + var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber; + + if (startIndent === nextIndent && !isNaN(nextNumber)) { + if (newNumber === nextNumber) itemNumber = nextNumber + 1; + if (newNumber > nextNumber) itemNumber = newNumber + 1; + cm.replaceRange( + nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]), + { + line: nextLineNumber, ch: 0 + }, { + line: nextLineNumber, ch: nextLine.length + }); + } else { + if (startIndent.length > nextIndent.length) return; + // This doesn't run if the next line immediately indents, as it is + // not clear of the users intention (new indented item or same level) + if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return; + skipCount += 1; + } + } + } while (nextItem); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchbrackets.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchbrackets.js new file mode 100644 index 0000000000..43dc8840f5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchbrackets.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && + (document.documentMode == null || document.documentMode < 8); + + var Pos = CodeMirror.Pos; + + var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<", "<": ">>", ">": "<<"}; + + function bracketRegex(config) { + return config && config.bracketRegex || /[(){}[\]]/ + } + + function findMatchingBracket(cm, where, config) { + var line = cm.getLineHandle(where.line), pos = where.ch - 1; + var afterCursor = config && config.afterCursor + if (afterCursor == null) + afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className) + var re = bracketRegex(config) + + // A cursor is defined as between two characters, but in in vim command mode + // (i.e. not insert mode), the cursor is visually represented as a + // highlighted box on top of the 2nd character. Otherwise, we allow matches + // from before or after the cursor. + var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) || + re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)]; + if (!match) return null; + var dir = match.charAt(1) == ">" ? 1 : -1; + if (config && config.strict && (dir > 0) != (pos == where.ch)) return null; + var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); + + var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config); + if (found == null) return null; + return {from: Pos(where.line, pos), to: found && found.pos, + match: found && found.ch == match.charAt(0), forward: dir > 0}; + } + + // bracketRegex is used to specify which type of bracket to scan + // should be a regexp, e.g. /[[\]]/ + // + // Note: If "where" is on an open bracket, then this bracket is ignored. + // + // Returns false when no bracket was found, null when it reached + // maxScanLines and gave up + function scanForBracket(cm, where, dir, style, config) { + var maxScanLen = (config && config.maxScanLineLength) || 10000; + var maxScanLines = (config && config.maxScanLines) || 1000; + + var stack = []; + var re = bracketRegex(config) + var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) + : Math.max(cm.firstLine() - 1, where.line - maxScanLines); + for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { + var line = cm.getLine(lineNo); + if (!line) continue; + var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; + if (line.length > maxScanLen) continue; + if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); + for (; pos != end; pos += dir) { + var ch = line.charAt(pos); + if (re.test(ch) && (style === undefined || + (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) { + var match = matching[ch]; + if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch); + else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; + else stack.pop(); + } + } + } + return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; + } + + function matchBrackets(cm, autoclear, config) { + // Disable brace matching in long lines, since it'll cause hugely slow updates + var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000, + highlightNonMatching = config && config.highlightNonMatching; + var marks = [], ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); + if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) { + var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; + marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); + if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) + marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); + } + } + + if (marks.length) { + // Kludge to work around the IE bug from issue #1193, where text + // input stops going to the textarea whenever this fires. + if (ie_lt8 && cm.state.focused) cm.focus(); + + var clear = function() { + cm.operation(function() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + }); + }; + if (autoclear) setTimeout(clear, 800); + else return clear; + } + } + + function doMatchBrackets(cm) { + cm.operation(function() { + if (cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); + }); + } + + function clearHighlighted(cm) { + if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + } + + CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchBrackets); + cm.off("focus", doMatchBrackets) + cm.off("blur", clearHighlighted) + clearHighlighted(cm); + } + if (val) { + cm.state.matchBrackets = typeof val == "object" ? val : {}; + cm.on("cursorActivity", doMatchBrackets); + cm.on("focus", doMatchBrackets) + cm.on("blur", clearHighlighted) + } + }); + + CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); + CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig){ + // Backwards-compatibility kludge + if (oldConfig || typeof config == "boolean") { + if (!oldConfig) { + config = config ? {strict: true} : null + } else { + oldConfig.strict = config + config = oldConfig + } + } + return findMatchingBracket(this, pos, config) + }); + CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ + return scanForBracket(this, pos, dir, style, config); + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchtags.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchtags.js new file mode 100644 index 0000000000..2203d9390d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/matchtags.js @@ -0,0 +1,66 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("matchTags", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchTags); + cm.off("viewportChange", maybeUpdateMatch); + clear(cm); + } + if (val) { + cm.state.matchBothTags = typeof val == "object" && val.bothTags; + cm.on("cursorActivity", doMatchTags); + cm.on("viewportChange", maybeUpdateMatch); + doMatchTags(cm); + } + }); + + function clear(cm) { + if (cm.state.tagHit) cm.state.tagHit.clear(); + if (cm.state.tagOther) cm.state.tagOther.clear(); + cm.state.tagHit = cm.state.tagOther = null; + } + + function doMatchTags(cm) { + cm.state.failedTagMatch = false; + cm.operation(function() { + clear(cm); + if (cm.somethingSelected()) return; + var cur = cm.getCursor(), range = cm.getViewport(); + range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to); + var match = CodeMirror.findMatchingTag(cm, cur, range); + if (!match) return; + if (cm.state.matchBothTags) { + var hit = match.at == "open" ? match.open : match.close; + if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"}); + } + var other = match.at == "close" ? match.open : match.close; + if (other) + cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"}); + else + cm.state.failedTagMatch = true; + }); + } + + function maybeUpdateMatch(cm) { + if (cm.state.failedTagMatch) doMatchTags(cm); + } + + CodeMirror.commands.toMatchingTag = function(cm) { + var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); + if (found) { + var other = found.at == "close" ? found.open : found.close; + if (other) cm.extendSelection(other.to, other.from); + } + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/trailingspace.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/trailingspace.js new file mode 100644 index 0000000000..c39c310a99 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/edit/trailingspace.js @@ -0,0 +1,27 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { + if (prev == CodeMirror.Init) prev = false; + if (prev && !val) + cm.removeOverlay("trailingspace"); + else if (!prev && val) + cm.addOverlay({ + token: function(stream) { + for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} + if (i > stream.pos) { stream.pos = i; return null; } + stream.pos = l; + return "trailingspace"; + }, + name: "trailingspace" + }); + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/brace-fold.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/brace-fold.js new file mode 100644 index 0000000000..28cb093f2f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/brace-fold.js @@ -0,0 +1,119 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function bracketFolding(pairs) { + return function(cm, start) { + var line = start.line, lineText = cm.getLine(line); + + function findOpening(pair) { + var tokenType; + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1); + if (found == -1) { + if (pass == 1) break; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) break; + tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); + if (!/^(comment|string)/.test(tokenType)) return {ch: found + 1, tokenType: tokenType, pair: pair}; + at = found - 1; + } + } + + function findRange(found) { + var count = 1, lastLine = cm.lastLine(), end, startCh = found.ch, endCh + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(found.pair[0], pos), nextClose = text.indexOf(found.pair[1], pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == found.tokenType) { + if (pos == nextOpen) ++count; + else if (!--count) { end = i; endCh = pos; break outer; } + } + ++pos; + } + } + + if (end == null || line == end) return null + return {from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh)}; + } + + var found = [] + for (var i = 0; i < pairs.length; i++) { + var open = findOpening(pairs[i]) + if (open) found.push(open) + } + found.sort(function(a, b) { return a.ch - b.ch }) + for (var i = 0; i < found.length; i++) { + var range = findRange(found[i]) + if (range) return range + } + return null + } +} + +CodeMirror.registerHelper("fold", "brace", bracketFolding([["{", "}"], ["[", "]"]])); + +CodeMirror.registerHelper("fold", "brace-paren", bracketFolding([["{", "}"], ["[", "]"], ["(", ")"]])); + +CodeMirror.registerHelper("fold", "import", function(cm, start) { + function hasImport(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type != "keyword" || start.string != "import") return null; + // Now find closing semicolon, return its position + for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { + var text = cm.getLine(i), semi = text.indexOf(";"); + if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)}; + } + } + + var startLine = start.line, has = hasImport(startLine), prev; + if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1)) + return null; + for (var end = has.end;;) { + var next = hasImport(end.line + 1); + if (next == null) break; + end = next.end; + } + return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end}; +}); + +CodeMirror.registerHelper("fold", "include", function(cm, start) { + function hasInclude(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; + } + + var startLine = start.line, has = hasInclude(startLine); + if (has == null || hasInclude(startLine - 1) != null) return null; + for (var end = startLine;;) { + var next = hasInclude(end + 1); + if (next == null) break; + ++end; + } + return {from: CodeMirror.Pos(startLine, has + 1), + to: cm.clipPos(CodeMirror.Pos(end))}; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/comment-fold.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/comment-fold.js new file mode 100644 index 0000000000..836101d8b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/comment-fold.js @@ -0,0 +1,59 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { + return mode.blockCommentStart && mode.blockCommentEnd; +}, function(cm, start) { + var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; + if (!startToken || !endToken) return; + var line = start.line, lineText = cm.getLine(line); + + var startCh; + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); + if (found == -1) { + if (pass == 1) return; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) return; + if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) && + (found == 0 || lineText.slice(found - endToken.length, found) == endToken || + !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) { + startCh = found + startToken.length; + break; + } + at = found - 1; + } + + var depth = 1, lastLine = cm.lastLine(), end, endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (pos == nextOpen) ++depth; + else if (!--depth) { end = i; endCh = pos; break outer; } + ++pos; + } + } + if (end == null || line == end && endCh == startCh) return; + return {from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh)}; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldcode.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldcode.js new file mode 100644 index 0000000000..721bc087e2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldcode.js @@ -0,0 +1,159 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function doFold(cm, pos, options, force) { + if (options && options.call) { + var finder = options; + options = null; + } else { + var finder = getOption(cm, options, "rangeFinder"); + } + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); + var minSize = getOption(cm, options, "minFoldSize"); + + function getRange(allowFolded) { + var range = finder(cm, pos); + if (!range || range.to.line - range.from.line < minSize) return null; + if (force === "fold") return range; + + var marks = cm.findMarksAt(range.from); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + if (!allowFolded) return null; + range.cleared = true; + marks[i].clear(); + } + } + return range; + } + + var range = getRange(true); + if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { + pos = CodeMirror.Pos(pos.line - 1, 0); + range = getRange(false); + } + if (!range || range.cleared || force === "unfold") return; + + var myWidget = makeWidget(cm, options, range); + CodeMirror.on(myWidget, "mousedown", function(e) { + myRange.clear(); + CodeMirror.e_preventDefault(e); + }); + var myRange = cm.markText(range.from, range.to, { + replacedWith: myWidget, + clearOnEnter: getOption(cm, options, "clearOnEnter"), + __isFold: true + }); + myRange.on("clear", function(from, to) { + CodeMirror.signal(cm, "unfold", cm, from, to); + }); + CodeMirror.signal(cm, "fold", cm, range.from, range.to); + } + + function makeWidget(cm, options, range) { + var widget = getOption(cm, options, "widget"); + + if (typeof widget == "function") { + widget = widget(range.from, range.to); + } + + if (typeof widget == "string") { + var text = document.createTextNode(widget); + widget = document.createElement("span"); + widget.appendChild(text); + widget.className = "CodeMirror-foldmarker"; + } else if (widget) { + widget = widget.cloneNode(true) + } + return widget; + } + + // Clumsy backwards-compatible interface + CodeMirror.newFoldFunction = function(rangeFinder, widget) { + return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; + }; + + // New-style interface + CodeMirror.defineExtension("foldCode", function(pos, options, force) { + doFold(this, pos, options, force); + }); + + CodeMirror.defineExtension("isFolded", function(pos) { + var marks = this.findMarksAt(pos); + for (var i = 0; i < marks.length; ++i) + if (marks[i].__isFold) return true; + }); + + CodeMirror.commands.toggleFold = function(cm) { + cm.foldCode(cm.getCursor()); + }; + CodeMirror.commands.fold = function(cm) { + cm.foldCode(cm.getCursor(), null, "fold"); + }; + CodeMirror.commands.unfold = function(cm) { + cm.foldCode(cm.getCursor(), { scanUp: false }, "unfold"); + }; + CodeMirror.commands.foldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, "fold"); + }); + }; + CodeMirror.commands.unfoldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, "unfold"); + }); + }; + + CodeMirror.registerHelper("fold", "combine", function() { + var funcs = Array.prototype.slice.call(arguments, 0); + return function(cm, start) { + for (var i = 0; i < funcs.length; ++i) { + var found = funcs[i](cm, start); + if (found) return found; + } + }; + }); + + CodeMirror.registerHelper("fold", "auto", function(cm, start) { + var helpers = cm.getHelpers(start, "fold"); + for (var i = 0; i < helpers.length; i++) { + var cur = helpers[i](cm, start); + if (cur) return cur; + } + }); + + var defaultOptions = { + rangeFinder: CodeMirror.fold.auto, + widget: "\u2194", + minFoldSize: 0, + scanUp: false, + clearOnEnter: true + }; + + CodeMirror.defineOption("foldOptions", null); + + function getOption(cm, options, name) { + if (options && options[name] !== undefined) + return options[name]; + var editorOptions = cm.options.foldOptions; + if (editorOptions && editorOptions[name] !== undefined) + return editorOptions[name]; + return defaultOptions[name]; + } + + CodeMirror.defineExtension("foldOption", function(options, name) { + return getOption(this, options, name); + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.css new file mode 100644 index 0000000000..ad19ae2d3e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.css @@ -0,0 +1,20 @@ +.CodeMirror-foldmarker { + color: blue; + text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; + font-family: arial; + line-height: .3; + cursor: pointer; +} +.CodeMirror-foldgutter { + width: .7em; +} +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + cursor: pointer; +} +.CodeMirror-foldgutter-open:after { + content: "\25BE"; +} +.CodeMirror-foldgutter-folded:after { + content: "\25B8"; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.js new file mode 100644 index 0000000000..7d46a609b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/foldgutter.js @@ -0,0 +1,163 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./foldcode")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./foldcode"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.clearGutter(cm.state.foldGutter.options.gutter); + cm.state.foldGutter = null; + cm.off("gutterClick", onGutterClick); + cm.off("changes", onChange); + cm.off("viewportChange", onViewportChange); + cm.off("fold", onFold); + cm.off("unfold", onFold); + cm.off("swapDoc", onChange); + } + if (val) { + cm.state.foldGutter = new State(parseOptions(val)); + updateInViewport(cm); + cm.on("gutterClick", onGutterClick); + cm.on("changes", onChange); + cm.on("viewportChange", onViewportChange); + cm.on("fold", onFold); + cm.on("unfold", onFold); + cm.on("swapDoc", onChange); + } + }); + + var Pos = CodeMirror.Pos; + + function State(options) { + this.options = options; + this.from = this.to = 0; + } + + function parseOptions(opts) { + if (opts === true) opts = {}; + if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; + if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; + if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; + return opts; + } + + function isFolded(cm, line) { + var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + var fromPos = marks[i].find(-1); + if (fromPos && fromPos.line === line) + return marks[i]; + } + } + } + + function marker(spec) { + if (typeof spec == "string") { + var elt = document.createElement("div"); + elt.className = spec + " CodeMirror-guttermarker-subtle"; + return elt; + } else { + return spec.cloneNode(true); + } + } + + function updateFoldInfo(cm, from, to) { + var opts = cm.state.foldGutter.options, cur = from - 1; + var minSize = cm.foldOption(opts, "minFoldSize"); + var func = cm.foldOption(opts, "rangeFinder"); + // we can reuse the built-in indicator element if its className matches the new state + var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded); + var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen); + cm.eachLine(from, to, function(line) { + ++cur; + var mark = null; + var old = line.gutterMarkers; + if (old) old = old[opts.gutter]; + if (isFolded(cm, cur)) { + if (clsFolded && old && clsFolded.test(old.className)) return; + mark = marker(opts.indicatorFolded); + } else { + var pos = Pos(cur, 0); + var range = func && func(cm, pos); + if (range && range.to.line - range.from.line >= minSize) { + if (clsOpen && old && clsOpen.test(old.className)) return; + mark = marker(opts.indicatorOpen); + } + } + if (!mark && !old) return; + cm.setGutterMarker(line, opts.gutter, mark); + }); + } + + // copied from CodeMirror/src/util/dom.js + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + function updateInViewport(cm) { + var vp = cm.getViewport(), state = cm.state.foldGutter; + if (!state) return; + cm.operation(function() { + updateFoldInfo(cm, vp.from, vp.to); + }); + state.from = vp.from; state.to = vp.to; + } + + function onGutterClick(cm, line, gutter) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + if (gutter != opts.gutter) return; + var folded = isFolded(cm, line); + if (folded) folded.clear(); + else cm.foldCode(Pos(line, 0), opts); + } + + function onChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + state.from = state.to = 0; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600); + } + + function onViewportChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { + var vp = cm.getViewport(); + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + updateInViewport(cm); + } else { + cm.operation(function() { + if (vp.from < state.from) { + updateFoldInfo(cm, vp.from, state.from); + state.from = vp.from; + } + if (vp.to > state.to) { + updateFoldInfo(cm, state.to, vp.to); + state.to = vp.to; + } + }); + } + }, opts.updateViewportTimeSpan || 400); + } + + function onFold(cm, from) { + var state = cm.state.foldGutter; + if (!state) return; + var line = from.line; + if (line >= state.from && line < state.to) + updateFoldInfo(cm, line, line + 1); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/indent-fold.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/indent-fold.js new file mode 100644 index 0000000000..0cc1126440 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/indent-fold.js @@ -0,0 +1,48 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function lineIndent(cm, lineNo) { + var text = cm.getLine(lineNo) + var spaceTo = text.search(/\S/) + if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1)))) + return -1 + return CodeMirror.countColumn(text, null, cm.getOption("tabSize")) +} + +CodeMirror.registerHelper("fold", "indent", function(cm, start) { + var myIndent = lineIndent(cm, start.line) + if (myIndent < 0) return + var lastLineInFold = null + + // Go through lines until we find a line that definitely doesn't belong in + // the block we're folding, or to the end. + for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { + var indent = lineIndent(cm, i) + if (indent == -1) { + } else if (indent > myIndent) { + // Lines with a greater indent are considered part of the block. + lastLineInFold = i; + } else { + // If this line has non-space, non-comment content, and is + // indented less or equal to the start line, it is the start of + // another block. + break; + } + } + if (lastLineInFold) return { + from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), + to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/markdown-fold.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/markdown-fold.js new file mode 100644 index 0000000000..6a551786d1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/markdown-fold.js @@ -0,0 +1,49 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("fold", "markdown", function(cm, start) { + var maxDepth = 100; + + function isHeader(lineNo) { + var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); + return tokentype && /\bheader\b/.test(tokentype); + } + + function headerLevel(lineNo, line, nextLine) { + var match = line && line.match(/^#+/); + if (match && isHeader(lineNo)) return match[0].length; + match = nextLine && nextLine.match(/^[=\-]+\s*$/); + if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; + return maxDepth; + } + + var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); + var level = headerLevel(start.line, firstLine, nextLine); + if (level === maxDepth) return undefined; + + var lastLineNo = cm.lastLine(); + var end = start.line, nextNextLine = cm.getLine(end + 2); + while (end < lastLineNo) { + if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; + ++end; + nextLine = nextNextLine; + nextNextLine = cm.getLine(end + 2); + } + + return { + from: CodeMirror.Pos(start.line, firstLine.length), + to: CodeMirror.Pos(end, cm.getLine(end).length) + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/xml-fold.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/xml-fold.js new file mode 100644 index 0000000000..13bc3838b2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/fold/xml-fold.js @@ -0,0 +1,184 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } + + var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); + + function Iter(cm, line, ch, range) { + this.line = line; this.ch = ch; + this.cm = cm; this.text = cm.getLine(line); + this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine(); + this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine(); + } + + function tagAt(iter, ch) { + var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); + return type && /\btag\b/.test(type); + } + + function nextLine(iter) { + if (iter.line >= iter.max) return; + iter.ch = 0; + iter.text = iter.cm.getLine(++iter.line); + return true; + } + function prevLine(iter) { + if (iter.line <= iter.min) return; + iter.text = iter.cm.getLine(--iter.line); + iter.ch = iter.text.length; + return true; + } + + function toTagEnd(iter) { + for (;;) { + var gt = iter.text.indexOf(">", iter.ch); + if (gt == -1) { if (nextLine(iter)) continue; else return; } + if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + function toTagStart(iter) { + for (;;) { + var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; + if (lt == -1) { if (prevLine(iter)) continue; else return; } + if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } + xmlTagStart.lastIndex = lt; + iter.ch = lt; + var match = xmlTagStart.exec(iter.text); + if (match && match.index == lt) return match; + } + } + + function toNextTag(iter) { + for (;;) { + xmlTagStart.lastIndex = iter.ch; + var found = xmlTagStart.exec(iter.text); + if (!found) { if (nextLine(iter)) continue; else return; } + if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } + iter.ch = found.index + found[0].length; + return found; + } + } + function toPrevTag(iter) { + for (;;) { + var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; + if (gt == -1) { if (prevLine(iter)) continue; else return; } + if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + + function findMatchingClose(iter, tag) { + var stack = []; + for (;;) { + var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); + if (!next || !(end = toTagEnd(iter))) return; + if (end == "selfClose") continue; + if (next[1]) { // closing tag + for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == next[2])) return { + tag: next[2], + from: Pos(startLine, startCh), + to: Pos(iter.line, iter.ch) + }; + } else { // opening tag + stack.push(next[2]); + } + } + } + function findMatchingOpen(iter, tag) { + var stack = []; + for (;;) { + var prev = toPrevTag(iter); + if (!prev) return; + if (prev == "selfClose") { toTagStart(iter); continue; } + var endLine = iter.line, endCh = iter.ch; + var start = toTagStart(iter); + if (!start) return; + if (start[1]) { // closing tag + stack.push(start[2]); + } else { // opening tag + for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == start[2])) return { + tag: start[2], + from: Pos(iter.line, iter.ch), + to: Pos(endLine, endCh) + }; + } + } + } + + CodeMirror.registerHelper("fold", "xml", function(cm, start) { + var iter = new Iter(cm, start.line, 0); + for (;;) { + var openTag = toNextTag(iter) + if (!openTag || iter.line != start.line) return + var end = toTagEnd(iter) + if (!end) return + if (!openTag[1] && end != "selfClose") { + var startPos = Pos(iter.line, iter.ch); + var endPos = findMatchingClose(iter, openTag[2]); + return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null + } + } + }); + CodeMirror.findMatchingTag = function(cm, pos, range) { + var iter = new Iter(cm, pos.line, pos.ch, range); + if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; + var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); + var start = end && toTagStart(iter); + if (!end || !start || cmp(iter, pos) > 0) return; + var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; + if (end == "selfClose") return {open: here, close: null, at: "open"}; + + if (start[1]) { // closing tag + return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; + } else { // opening tag + iter = new Iter(cm, to.line, to.ch, range); + return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; + } + }; + + CodeMirror.findEnclosingTag = function(cm, pos, range, tag) { + var iter = new Iter(cm, pos.line, pos.ch, range); + for (;;) { + var open = findMatchingOpen(iter, tag); + if (!open) break; + var forward = new Iter(cm, pos.line, pos.ch, range); + var close = findMatchingClose(forward, open.tag); + if (close) return {open: open, close: close}; + } + }; + + // Used by addon/edit/closetag.js + CodeMirror.scanForClosingTag = function(cm, pos, name, end) { + var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); + return findMatchingClose(iter, name); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/anyword-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/anyword-hint.js new file mode 100644 index 0000000000..d27a9ec018 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/anyword-hint.js @@ -0,0 +1,41 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var WORD = /[\w$]+/, RANGE = 500; + + CodeMirror.registerHelper("hint", "anyword", function(editor, options) { + var word = options && options.word || WORD; + var range = options && options.range || RANGE; + var cur = editor.getCursor(), curLine = editor.getLine(cur.line); + var end = cur.ch, start = end; + while (start && word.test(curLine.charAt(start - 1))) --start; + var curWord = start != end && curLine.slice(start, end); + + var list = options && options.list || [], seen = {}; + var re = new RegExp(word.source, "g"); + for (var dir = -1; dir <= 1; dir += 2) { + var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; + for (; line != endLine; line += dir) { + var text = editor.getLine(line), m; + while (m = re.exec(text)) { + if (line == cur.line && m[0] === curWord) continue; + if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { + seen[m[0]] = true; + list.push(m[0]); + } + } + } + } + return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)}; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/css-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/css-hint.js new file mode 100644 index 0000000000..980d1197e5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/css-hint.js @@ -0,0 +1,66 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../mode/css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../mode/css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var pseudoClasses = {"active":1, "after":1, "before":1, "checked":1, "default":1, + "disabled":1, "empty":1, "enabled":1, "first-child":1, "first-letter":1, + "first-line":1, "first-of-type":1, "focus":1, "hover":1, "in-range":1, + "indeterminate":1, "invalid":1, "lang":1, "last-child":1, "last-of-type":1, + "link":1, "not":1, "nth-child":1, "nth-last-child":1, "nth-last-of-type":1, + "nth-of-type":1, "only-of-type":1, "only-child":1, "optional":1, "out-of-range":1, + "placeholder":1, "read-only":1, "read-write":1, "required":1, "root":1, + "selection":1, "target":1, "valid":1, "visited":1 + }; + + CodeMirror.registerHelper("hint", "css", function(cm) { + var cur = cm.getCursor(), token = cm.getTokenAt(cur); + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (inner.mode.name != "css") return; + + if (token.type == "keyword" && "!important".indexOf(token.string) == 0) + return {list: ["!important"], from: CodeMirror.Pos(cur.line, token.start), + to: CodeMirror.Pos(cur.line, token.end)}; + + var start = token.start, end = cur.ch, word = token.string.slice(0, end - start); + if (/[^\w$_-]/.test(word)) { + word = ""; start = end = cur.ch; + } + + var spec = CodeMirror.resolveMode("text/css"); + + var result = []; + function add(keywords) { + for (var name in keywords) + if (!word || name.lastIndexOf(word, 0) == 0) + result.push(name); + } + + var st = inner.state.state; + if (st == "pseudo" || token.type == "variable-3") { + add(pseudoClasses); + } else if (st == "block" || st == "maybeprop") { + add(spec.propertyKeywords); + } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { + add(spec.valueKeywords); + add(spec.colorKeywords); + } else if (st == "media" || st == "media_parens") { + add(spec.mediaTypes); + add(spec.mediaFeatures); + } + + if (result.length) return { + list: result, + from: CodeMirror.Pos(cur.line, start), + to: CodeMirror.Pos(cur.line, end) + }; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/html-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/html-hint.js new file mode 100644 index 0000000000..9878eca6ef --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/html-hint.js @@ -0,0 +1,351 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./xml-hint")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./xml-hint"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); + var targets = ["_blank", "_self", "_top", "_parent"]; + var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; + var methods = ["get", "post", "put", "delete"]; + var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; + var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", + "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", + "orientation:landscape", "device-height: [X]", "device-width: [X]"]; + var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags + + var data = { + a: { + attrs: { + href: null, ping: null, type: null, + media: media, + target: targets, + hreflang: langs + } + }, + abbr: s, + acronym: s, + address: s, + applet: s, + area: { + attrs: { + alt: null, coords: null, href: null, target: null, ping: null, + media: media, hreflang: langs, type: null, + shape: ["default", "rect", "circle", "poly"] + } + }, + article: s, + aside: s, + audio: { + attrs: { + src: null, mediagroup: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["none", "metadata", "auto"], + autoplay: ["", "autoplay"], + loop: ["", "loop"], + controls: ["", "controls"] + } + }, + b: s, + base: { attrs: { href: null, target: targets } }, + basefont: s, + bdi: s, + bdo: s, + big: s, + blockquote: { attrs: { cite: null } }, + body: s, + br: s, + button: { + attrs: { + form: null, formaction: null, name: null, value: null, + autofocus: ["", "autofocus"], + disabled: ["", "autofocus"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + type: ["submit", "reset", "button"] + } + }, + canvas: { attrs: { width: null, height: null } }, + caption: s, + center: s, + cite: s, + code: s, + col: { attrs: { span: null } }, + colgroup: { attrs: { span: null } }, + command: { + attrs: { + type: ["command", "checkbox", "radio"], + label: null, icon: null, radiogroup: null, command: null, title: null, + disabled: ["", "disabled"], + checked: ["", "checked"] + } + }, + data: { attrs: { value: null } }, + datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } }, + datalist: { attrs: { data: null } }, + dd: s, + del: { attrs: { cite: null, datetime: null } }, + details: { attrs: { open: ["", "open"] } }, + dfn: s, + dir: s, + div: s, + dialog: { attrs: { open: null } }, + dl: s, + dt: s, + em: s, + embed: { attrs: { src: null, type: null, width: null, height: null } }, + eventsource: { attrs: { src: null } }, + fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } }, + figcaption: s, + figure: s, + font: s, + footer: s, + form: { + attrs: { + action: null, name: null, + "accept-charset": charsets, + autocomplete: ["on", "off"], + enctype: encs, + method: methods, + novalidate: ["", "novalidate"], + target: targets + } + }, + frame: s, + frameset: s, + h1: s, h2: s, h3: s, h4: s, h5: s, h6: s, + head: { + attrs: {}, + children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] + }, + header: s, + hgroup: s, + hr: s, + html: { + attrs: { manifest: null }, + children: ["head", "body"] + }, + i: s, + iframe: { + attrs: { + src: null, srcdoc: null, name: null, width: null, height: null, + sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], + seamless: ["", "seamless"] + } + }, + img: { + attrs: { + alt: null, src: null, ismap: null, usemap: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"] + } + }, + input: { + attrs: { + alt: null, dirname: null, form: null, formaction: null, + height: null, list: null, max: null, maxlength: null, min: null, + name: null, pattern: null, placeholder: null, size: null, src: null, + step: null, value: null, width: null, + accept: ["audio/*", "video/*", "image/*"], + autocomplete: ["on", "off"], + autofocus: ["", "autofocus"], + checked: ["", "checked"], + disabled: ["", "disabled"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + multiple: ["", "multiple"], + readonly: ["", "readonly"], + required: ["", "required"], + type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", + "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", + "file", "submit", "image", "reset", "button"] + } + }, + ins: { attrs: { cite: null, datetime: null } }, + kbd: s, + keygen: { + attrs: { + challenge: null, form: null, name: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + keytype: ["RSA"] + } + }, + label: { attrs: { "for": null, form: null } }, + legend: s, + li: { attrs: { value: null } }, + link: { + attrs: { + href: null, type: null, + hreflang: langs, + media: media, + sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] + } + }, + map: { attrs: { name: null } }, + mark: s, + menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, + meta: { + attrs: { + content: null, + charset: charsets, + name: ["viewport", "application-name", "author", "description", "generator", "keywords"], + "http-equiv": ["content-language", "content-type", "default-style", "refresh"] + } + }, + meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, + nav: s, + noframes: s, + noscript: s, + object: { + attrs: { + data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, + typemustmatch: ["", "typemustmatch"] + } + }, + ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } }, + optgroup: { attrs: { disabled: ["", "disabled"], label: null } }, + option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } }, + output: { attrs: { "for": null, form: null, name: null } }, + p: s, + param: { attrs: { name: null, value: null } }, + pre: s, + progress: { attrs: { value: null, max: null } }, + q: { attrs: { cite: null } }, + rp: s, + rt: s, + ruby: s, + s: s, + samp: s, + script: { + attrs: { + type: ["text/javascript"], + src: null, + async: ["", "async"], + defer: ["", "defer"], + charset: charsets + } + }, + section: s, + select: { + attrs: { + form: null, name: null, size: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + multiple: ["", "multiple"] + } + }, + small: s, + source: { attrs: { src: null, type: null, media: null } }, + span: s, + strike: s, + strong: s, + style: { + attrs: { + type: ["text/css"], + media: media, + scoped: null + } + }, + sub: s, + summary: s, + sup: s, + table: s, + tbody: s, + td: { attrs: { colspan: null, rowspan: null, headers: null } }, + textarea: { + attrs: { + dirname: null, form: null, maxlength: null, name: null, placeholder: null, + rows: null, cols: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + readonly: ["", "readonly"], + required: ["", "required"], + wrap: ["soft", "hard"] + } + }, + tfoot: s, + th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, + thead: s, + time: { attrs: { datetime: null } }, + title: s, + tr: s, + track: { + attrs: { + src: null, label: null, "default": null, + kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], + srclang: langs + } + }, + tt: s, + u: s, + ul: s, + "var": s, + video: { + attrs: { + src: null, poster: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["auto", "metadata", "none"], + autoplay: ["", "autoplay"], + mediagroup: ["movie"], + muted: ["", "muted"], + controls: ["", "controls"] + } + }, + wbr: s + }; + + var globalAttrs = { + accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], + "class": null, + contenteditable: ["true", "false"], + contextmenu: null, + dir: ["ltr", "rtl", "auto"], + draggable: ["true", "false", "auto"], + dropzone: ["copy", "move", "link", "string:", "file:"], + hidden: ["hidden"], + id: null, + inert: ["inert"], + itemid: null, + itemprop: null, + itemref: null, + itemscope: ["itemscope"], + itemtype: null, + lang: ["en", "es"], + spellcheck: ["true", "false"], + autocorrect: ["true", "false"], + autocapitalize: ["true", "false"], + style: null, + tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], + title: null, + translate: ["yes", "no"], + onclick: null, + rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] + }; + function populate(obj) { + for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr)) + obj.attrs[attr] = globalAttrs[attr]; + } + + populate(s); + for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s) + populate(data[tag]); + + CodeMirror.htmlSchema = data; + function htmlHint(cm, options) { + var local = {schemaInfo: data}; + if (options) for (var opt in options) local[opt] = options[opt]; + return CodeMirror.hint.xml(cm, local); + } + CodeMirror.registerHelper("hint", "html", htmlHint); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/javascript-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/javascript-hint.js new file mode 100644 index 0000000000..9f06b1b546 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/javascript-hint.js @@ -0,0 +1,162 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + var Pos = CodeMirror.Pos; + + function forEach(arr, f) { + for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); + } + + function arrayContains(arr, item) { + if (!Array.prototype.indexOf) { + var i = arr.length; + while (i--) { + if (arr[i] === item) { + return true; + } + } + return false; + } + return arr.indexOf(item) != -1; + } + + function scriptHint(editor, keywords, getToken, options) { + // Find the token at the cursor + var cur = editor.getCursor(), token = getToken(editor, cur); + if (/\b(?:string|comment)\b/.test(token.type)) return; + var innerMode = CodeMirror.innerMode(editor.getMode(), token.state); + if (innerMode.mode.helperType === "json") return; + token.state = innerMode.state; + + // If it's not a 'word-style' token, ignore the token. + if (!/^[\w$_]*$/.test(token.string)) { + token = {start: cur.ch, end: cur.ch, string: "", state: token.state, + type: token.string == "." ? "property" : null}; + } else if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + + var tprop = token; + // If it is a property, find out what it is a property of. + while (tprop.type == "property") { + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (tprop.string != ".") return; + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (!context) var context = []; + context.push(tprop); + } + return {list: getCompletions(token, context, keywords, options), + from: Pos(cur.line, token.start), + to: Pos(cur.line, token.end)}; + } + + function javascriptHint(editor, options) { + return scriptHint(editor, javascriptKeywords, + function (e, cur) {return e.getTokenAt(cur);}, + options); + }; + CodeMirror.registerHelper("hint", "javascript", javascriptHint); + + function getCoffeeScriptToken(editor, cur) { + // This getToken, it is for coffeescript, imitates the behavior of + // getTokenAt method in javascript.js, that is, returning "property" + // type and treat "." as independent token. + var token = editor.getTokenAt(cur); + if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { + token.end = token.start; + token.string = '.'; + token.type = "property"; + } + else if (/^\.[\w$_]*$/.test(token.string)) { + token.type = "property"; + token.start++; + token.string = token.string.replace(/\./, ''); + } + return token; + } + + function coffeescriptHint(editor, options) { + return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); + } + CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); + + var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + + "toUpperCase toLowerCase split concat match replace search").split(" "); + var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); + var funcProps = "prototype apply call bind".split(" "); + var javascriptKeywords = ("break case catch class const continue debugger default delete do else export extends false finally for function " + + "if in import instanceof new null return super switch this throw true try typeof var void while with yield").split(" "); + var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); + + function forAllProps(obj, callback) { + if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) { + for (var name in obj) callback(name) + } else { + for (var o = obj; o; o = Object.getPrototypeOf(o)) + Object.getOwnPropertyNames(o).forEach(callback) + } + } + + function getCompletions(token, context, keywords, options) { + var found = [], start = token.string, global = options && options.globalScope || window; + function maybeAdd(str) { + if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); + } + function gatherCompletions(obj) { + if (typeof obj == "string") forEach(stringProps, maybeAdd); + else if (obj instanceof Array) forEach(arrayProps, maybeAdd); + else if (obj instanceof Function) forEach(funcProps, maybeAdd); + forAllProps(obj, maybeAdd) + } + + if (context && context.length) { + // If this is a property, see if it belongs to some object we can + // find in the current environment. + var obj = context.pop(), base; + if (obj.type && obj.type.indexOf("variable") === 0) { + if (options && options.additionalContext) + base = options.additionalContext[obj.string]; + if (!options || options.useGlobalScope !== false) + base = base || global[obj.string]; + } else if (obj.type == "string") { + base = ""; + } else if (obj.type == "atom") { + base = 1; + } else if (obj.type == "function") { + if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && + (typeof global.jQuery == 'function')) + base = global.jQuery(); + else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) + base = global._(); + } + while (base != null && context.length) + base = base[context.pop().string]; + if (base != null) gatherCompletions(base); + } else { + // If not, just look in the global object, any local scope, and optional additional-context + // (reading into JS mode internals to get at the local and global variables) + for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); + for (var c = token.state.context; c; c = c.prev) + for (var v = c.vars; v; v = v.next) maybeAdd(v.name) + for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); + if (options && options.additionalContext != null) + for (var key in options.additionalContext) + maybeAdd(key); + if (!options || options.useGlobalScope !== false) + gatherCompletions(global); + forEach(keywords, maybeAdd); + } + return found; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.css new file mode 100644 index 0000000000..5617ccca2b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.css @@ -0,0 +1,36 @@ +.CodeMirror-hints { + position: absolute; + z-index: 10; + overflow: hidden; + list-style: none; + + margin: 0; + padding: 2px; + + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + border-radius: 3px; + border: 1px solid silver; + + background: white; + font-size: 90%; + font-family: monospace; + + max-height: 20em; + overflow-y: auto; +} + +.CodeMirror-hint { + margin: 0; + padding: 0 4px; + border-radius: 2px; + white-space: pre; + color: black; + cursor: pointer; +} + +li.CodeMirror-hint-active { + background: #08f; + color: white; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.js new file mode 100644 index 0000000000..2be2c716e0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/show-hint.js @@ -0,0 +1,529 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// declare global: DOMRect + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var HINT_ELEMENT_CLASS = "CodeMirror-hint"; + var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; + + // This is the old interface, kept around for now to stay + // backwards-compatible. + CodeMirror.showHint = function(cm, getHints, options) { + if (!getHints) return cm.showHint(options); + if (options && options.async) getHints.async = true; + var newOpts = {hint: getHints}; + if (options) for (var prop in options) newOpts[prop] = options[prop]; + return cm.showHint(newOpts); + }; + + CodeMirror.defineExtension("showHint", function(options) { + options = parseOptions(this, this.getCursor("start"), options); + var selections = this.listSelections() + if (selections.length > 1) return; + // By default, don't allow completion when something is selected. + // A hint function can have a `supportsSelection` property to + // indicate that it can handle selections. + if (this.somethingSelected()) { + if (!options.hint.supportsSelection) return; + // Don't try with cross-line selections + for (var i = 0; i < selections.length; i++) + if (selections[i].head.line != selections[i].anchor.line) return; + } + + if (this.state.completionActive) this.state.completionActive.close(); + var completion = this.state.completionActive = new Completion(this, options); + if (!completion.options.hint) return; + + CodeMirror.signal(this, "startCompletion", this); + completion.update(true); + }); + + CodeMirror.defineExtension("closeHint", function() { + if (this.state.completionActive) this.state.completionActive.close() + }) + + function Completion(cm, options) { + this.cm = cm; + this.options = options; + this.widget = null; + this.debounce = 0; + this.tick = 0; + this.startPos = this.cm.getCursor("start"); + this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; + + if (this.options.updateOnCursorActivity) { + var self = this; + cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); }); + } + } + + var requestAnimationFrame = window.requestAnimationFrame || function(fn) { + return setTimeout(fn, 1000/60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; + + Completion.prototype = { + close: function() { + if (!this.active()) return; + this.cm.state.completionActive = null; + this.tick = null; + if (this.options.updateOnCursorActivity) { + this.cm.off("cursorActivity", this.activityFunc); + } + + if (this.widget && this.data) CodeMirror.signal(this.data, "close"); + if (this.widget) this.widget.close(); + CodeMirror.signal(this.cm, "endCompletion", this.cm); + }, + + active: function() { + return this.cm.state.completionActive == this; + }, + + pick: function(data, i) { + var completion = data.list[i], self = this; + this.cm.operation(function() { + if (completion.hint) + completion.hint(self.cm, data, completion); + else + self.cm.replaceRange(getText(completion), completion.from || data.from, + completion.to || data.to, "complete"); + CodeMirror.signal(data, "pick", completion); + self.cm.scrollIntoView(); + }); + if (this.options.closeOnPick) { + this.close(); + } + }, + + cursorActivity: function() { + if (this.debounce) { + cancelAnimationFrame(this.debounce); + this.debounce = 0; + } + + var identStart = this.startPos; + if(this.data) { + identStart = this.data.from; + } + + var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line); + if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || + pos.ch < identStart.ch || this.cm.somethingSelected() || + (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { + this.close(); + } else { + var self = this; + this.debounce = requestAnimationFrame(function() {self.update();}); + if (this.widget) this.widget.disable(); + } + }, + + update: function(first) { + if (this.tick == null) return + var self = this, myTick = ++this.tick + fetchHints(this.options.hint, this.cm, this.options, function(data) { + if (self.tick == myTick) self.finishUpdate(data, first) + }) + }, + + finishUpdate: function(data, first) { + if (this.data) CodeMirror.signal(this.data, "update"); + + var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle); + if (this.widget) this.widget.close(); + + this.data = data; + + if (data && data.list.length) { + if (picked && data.list.length == 1) { + this.pick(data, 0); + } else { + this.widget = new Widget(this, data); + CodeMirror.signal(data, "shown"); + } + } + } + }; + + function parseOptions(cm, pos, options) { + var editor = cm.options.hintOptions; + var out = {}; + for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; + if (editor) for (var prop in editor) + if (editor[prop] !== undefined) out[prop] = editor[prop]; + if (options) for (var prop in options) + if (options[prop] !== undefined) out[prop] = options[prop]; + if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos) + return out; + } + + function getText(completion) { + if (typeof completion == "string") return completion; + else return completion.text; + } + + function buildKeyMap(completion, handle) { + var baseMap = { + Up: function() {handle.moveFocus(-1);}, + Down: function() {handle.moveFocus(1);}, + PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, + PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, + Home: function() {handle.setFocus(0);}, + End: function() {handle.setFocus(handle.length - 1);}, + Enter: handle.pick, + Tab: handle.pick, + Esc: handle.close + }; + + var mac = /Mac/.test(navigator.platform); + + if (mac) { + baseMap["Ctrl-P"] = function() {handle.moveFocus(-1);}; + baseMap["Ctrl-N"] = function() {handle.moveFocus(1);}; + } + + var custom = completion.options.customKeys; + var ourMap = custom ? {} : baseMap; + function addBinding(key, val) { + var bound; + if (typeof val != "string") + bound = function(cm) { return val(cm, handle); }; + // This mechanism is deprecated + else if (baseMap.hasOwnProperty(val)) + bound = baseMap[val]; + else + bound = val; + ourMap[key] = bound; + } + if (custom) + for (var key in custom) if (custom.hasOwnProperty(key)) + addBinding(key, custom[key]); + var extra = completion.options.extraKeys; + if (extra) + for (var key in extra) if (extra.hasOwnProperty(key)) + addBinding(key, extra[key]); + return ourMap; + } + + function getHintElement(hintsElement, el) { + while (el && el != hintsElement) { + if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; + el = el.parentNode; + } + } + + function Widget(completion, data) { + this.id = "cm-complete-" + Math.floor(Math.random(1e6)) + this.completion = completion; + this.data = data; + this.picked = false; + var widget = this, cm = completion.cm; + var ownerDocument = cm.getInputField().ownerDocument; + var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; + + var hints = this.hints = ownerDocument.createElement("ul"); + hints.setAttribute("role", "listbox") + hints.setAttribute("aria-expanded", "true") + hints.id = this.id + var theme = completion.cm.options.theme; + hints.className = "CodeMirror-hints " + theme; + this.selectedHint = data.selectedHint || 0; + + var completions = data.list; + for (var i = 0; i < completions.length; ++i) { + var elt = hints.appendChild(ownerDocument.createElement("li")), cur = completions[i]; + var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); + if (cur.className != null) className = cur.className + " " + className; + elt.className = className; + if (i == this.selectedHint) elt.setAttribute("aria-selected", "true") + elt.id = this.id + "-" + i + elt.setAttribute("role", "option") + if (cur.render) cur.render(elt, data, cur); + else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur))); + elt.hintId = i; + } + + var container = completion.options.container || ownerDocument.body; + var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); + var left = pos.left, top = pos.bottom, below = true; + var offsetLeft = 0, offsetTop = 0; + if (container !== ownerDocument.body) { + // We offset the cursor position because left and top are relative to the offsetParent's top left corner. + var isContainerPositioned = ['absolute', 'relative', 'fixed'].indexOf(parentWindow.getComputedStyle(container).position) !== -1; + var offsetParent = isContainerPositioned ? container : container.offsetParent; + var offsetParentPosition = offsetParent.getBoundingClientRect(); + var bodyPosition = ownerDocument.body.getBoundingClientRect(); + offsetLeft = (offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft); + offsetTop = (offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop); + } + hints.style.left = (left - offsetLeft) + "px"; + hints.style.top = (top - offsetTop) + "px"; + + // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. + var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth); + var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight); + container.appendChild(hints); + cm.getInputField().setAttribute("aria-autocomplete", "list") + cm.getInputField().setAttribute("aria-owns", this.id) + cm.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint) + + var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect(); + var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false; + + // Compute in the timeout to avoid reflow on init + var startScroll; + setTimeout(function() { startScroll = cm.getScrollInfo(); }); + + var overlapY = box.bottom - winH; + if (overlapY > 0) { + var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { // Fits above cursor + hints.style.top = (top = pos.top - height - offsetTop) + "px"; + below = false; + } else if (height > winH) { + hints.style.height = (winH - 5) + "px"; + hints.style.top = (top = pos.bottom - box.top - offsetTop) + "px"; + var cursor = cm.getCursor(); + if (data.from.ch != cursor.ch) { + pos = cm.cursorCoords(cursor); + hints.style.left = (left = pos.left - offsetLeft) + "px"; + box = hints.getBoundingClientRect(); + } + } + } + var overlapX = box.right - winW; + if (scrolls) overlapX += cm.display.nativeBarWidth; + if (overlapX > 0) { + if (box.right - box.left > winW) { + hints.style.width = (winW - 5) + "px"; + overlapX -= (box.right - box.left) - winW; + } + hints.style.left = (left = pos.left - overlapX - offsetLeft) + "px"; + } + if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling) + node.style.paddingRight = cm.display.nativeBarWidth + "px" + + cm.addKeyMap(this.keyMap = buildKeyMap(completion, { + moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, + setFocus: function(n) { widget.changeActive(n); }, + menuSize: function() { return widget.screenAmount(); }, + length: completions.length, + close: function() { completion.close(); }, + pick: function() { widget.pick(); }, + data: data + })); + + if (completion.options.closeOnUnfocus) { + var closingOnBlur; + cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); + cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); + } + + cm.on("scroll", this.onScroll = function() { + var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); + if (!startScroll) startScroll = cm.getScrollInfo(); + var newTop = top + startScroll.top - curScroll.top; + var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop); + if (!below) point += hints.offsetHeight; + if (point <= editor.top || point >= editor.bottom) return completion.close(); + hints.style.top = newTop + "px"; + hints.style.left = (left + startScroll.left - curScroll.left) + "px"; + }); + + CodeMirror.on(hints, "dblclick", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} + }); + + CodeMirror.on(hints, "click", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + if (completion.options.completeOnSingleClick) widget.pick(); + } + }); + + CodeMirror.on(hints, "mousedown", function() { + setTimeout(function(){cm.focus();}, 20); + }); + + // The first hint doesn't need to be scrolled to on init + var selectedHintRange = this.getSelectedHintRange(); + if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) { + this.scrollToActive(); + } + + CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]); + return true; + } + + Widget.prototype = { + close: function() { + if (this.completion.widget != this) return; + this.completion.widget = null; + if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints); + this.completion.cm.removeKeyMap(this.keyMap); + var input = this.completion.cm.getInputField() + input.removeAttribute("aria-activedescendant") + input.removeAttribute("aria-owns") + + var cm = this.completion.cm; + if (this.completion.options.closeOnUnfocus) { + cm.off("blur", this.onBlur); + cm.off("focus", this.onFocus); + } + cm.off("scroll", this.onScroll); + }, + + disable: function() { + this.completion.cm.removeKeyMap(this.keyMap); + var widget = this; + this.keyMap = {Enter: function() { widget.picked = true; }}; + this.completion.cm.addKeyMap(this.keyMap); + }, + + pick: function() { + this.completion.pick(this.data, this.selectedHint); + }, + + changeActive: function(i, avoidWrap) { + if (i >= this.data.list.length) + i = avoidWrap ? this.data.list.length - 1 : 0; + else if (i < 0) + i = avoidWrap ? 0 : this.data.list.length - 1; + if (this.selectedHint == i) return; + var node = this.hints.childNodes[this.selectedHint]; + if (node) { + node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); + node.removeAttribute("aria-selected") + } + node = this.hints.childNodes[this.selectedHint = i]; + node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; + node.setAttribute("aria-selected", "true") + this.completion.cm.getInputField().setAttribute("aria-activedescendant", node.id) + this.scrollToActive() + CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); + }, + + scrollToActive: function() { + var selectedHintRange = this.getSelectedHintRange(); + var node1 = this.hints.childNodes[selectedHintRange.from]; + var node2 = this.hints.childNodes[selectedHintRange.to]; + var firstNode = this.hints.firstChild; + if (node1.offsetTop < this.hints.scrollTop) + this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop; + else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) + this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop; + }, + + screenAmount: function() { + return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; + }, + + getSelectedHintRange: function() { + var margin = this.completion.options.scrollMargin || 0; + return { + from: Math.max(0, this.selectedHint - margin), + to: Math.min(this.data.list.length - 1, this.selectedHint + margin), + }; + } + }; + + function applicableHelpers(cm, helpers) { + if (!cm.somethingSelected()) return helpers + var result = [] + for (var i = 0; i < helpers.length; i++) + if (helpers[i].supportsSelection) result.push(helpers[i]) + return result + } + + function fetchHints(hint, cm, options, callback) { + if (hint.async) { + hint(cm, callback, options) + } else { + var result = hint(cm, options) + if (result && result.then) result.then(callback) + else callback(result) + } + } + + function resolveAutoHints(cm, pos) { + var helpers = cm.getHelpers(pos, "hint"), words + if (helpers.length) { + var resolved = function(cm, callback, options) { + var app = applicableHelpers(cm, helpers); + function run(i) { + if (i == app.length) return callback(null) + fetchHints(app[i], cm, options, function(result) { + if (result && result.list.length > 0) callback(result) + else run(i + 1) + }) + } + run(0) + } + resolved.async = true + resolved.supportsSelection = true + return resolved + } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { + return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) } + } else if (CodeMirror.hint.anyword) { + return function(cm, options) { return CodeMirror.hint.anyword(cm, options) } + } else { + return function() {} + } + } + + CodeMirror.registerHelper("hint", "auto", { + resolve: resolveAutoHints + }); + + CodeMirror.registerHelper("hint", "fromList", function(cm, options) { + var cur = cm.getCursor(), token = cm.getTokenAt(cur) + var term, from = CodeMirror.Pos(cur.line, token.start), to = cur + if (token.start < cur.ch && /\w/.test(token.string.charAt(cur.ch - token.start - 1))) { + term = token.string.substr(0, cur.ch - token.start) + } else { + term = "" + from = cur + } + var found = []; + for (var i = 0; i < options.words.length; i++) { + var word = options.words[i]; + if (word.slice(0, term.length) == term) + found.push(word); + } + + if (found.length) return {list: found, from: from, to: to}; + }); + + CodeMirror.commands.autocomplete = CodeMirror.showHint; + + var defaultOptions = { + hint: CodeMirror.hint.auto, + completeSingle: true, + alignWithWord: true, + closeCharacters: /[\s()\[\]{};:>,]/, + closeOnPick: true, + closeOnUnfocus: true, + updateOnCursorActivity: true, + completeOnSingleClick: true, + container: null, + customKeys: null, + extraKeys: null, + paddingForScrollbar: true, + moveOnOverlap: true, + }; + + CodeMirror.defineOption("hintOptions", null); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/sql-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/sql-hint.js new file mode 100644 index 0000000000..efdce813cf --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/sql-hint.js @@ -0,0 +1,304 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../mode/sql/sql"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var tables; + var defaultTable; + var keywords; + var identifierQuote; + var CONS = { + QUERY_DIV: ";", + ALIAS_KEYWORD: "AS" + }; + var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos; + + function isArray(val) { return Object.prototype.toString.call(val) == "[object Array]" } + + function getKeywords(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).keywords; + } + + function getIdentifierQuote(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).identifierQuote || "`"; + } + + function getText(item) { + return typeof item == "string" ? item : item.text; + } + + function wrapTable(name, value) { + if (isArray(value)) value = {columns: value} + if (!value.text) value.text = name + return value + } + + function parseTables(input) { + var result = {} + if (isArray(input)) { + for (var i = input.length - 1; i >= 0; i--) { + var item = input[i] + result[getText(item).toUpperCase()] = wrapTable(getText(item), item) + } + } else if (input) { + for (var name in input) + result[name.toUpperCase()] = wrapTable(name, input[name]) + } + return result + } + + function getTable(name) { + return tables[name.toUpperCase()] + } + + function shallowClone(object) { + var result = {}; + for (var key in object) if (object.hasOwnProperty(key)) + result[key] = object[key]; + return result; + } + + function match(string, word) { + var len = string.length; + var sub = getText(word).substr(0, len); + return string.toUpperCase() === sub.toUpperCase(); + } + + function addMatches(result, search, wordlist, formatter) { + if (isArray(wordlist)) { + for (var i = 0; i < wordlist.length; i++) + if (match(search, wordlist[i])) result.push(formatter(wordlist[i])) + } else { + for (var word in wordlist) if (wordlist.hasOwnProperty(word)) { + var val = wordlist[word] + if (!val || val === true) + val = word + else + val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text + if (match(search, val)) result.push(formatter(val)) + } + } + } + + function cleanName(name) { + // Get rid name from identifierQuote and preceding dot(.) + if (name.charAt(0) == ".") { + name = name.substr(1); + } + // replace duplicated identifierQuotes with single identifierQuotes + // and remove single identifierQuotes + var nameParts = name.split(identifierQuote+identifierQuote); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,"g"), ""); + return nameParts.join(identifierQuote); + } + + function insertIdentifierQuotes(name) { + var nameParts = getText(name).split("."); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = identifierQuote + + // duplicate identifierQuotes + nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) + + identifierQuote; + var escaped = nameParts.join("."); + if (typeof name == "string") return escaped; + name = shallowClone(name); + name.text = escaped; + return name; + } + + function nameCompletion(cur, token, result, editor) { + // Try to complete table, column names and return start position of completion + var useIdentifierQuotes = false; + var nameParts = []; + var start = token.start; + var cont = true; + while (cont) { + cont = (token.string.charAt(0) == "."); + useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote); + + start = token.start; + nameParts.unshift(cleanName(token.string)); + + token = editor.getTokenAt(Pos(cur.line, token.start)); + if (token.string == ".") { + cont = true; + token = editor.getTokenAt(Pos(cur.line, token.start)); + } + } + + // Try to complete table names + var string = nameParts.join("."); + addMatches(result, string, tables, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + + // Try to complete columns from defaultTable + addMatches(result, string, defaultTable, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + + // Try to complete columns + string = nameParts.pop(); + var table = nameParts.join("."); + + var alias = false; + var aliasTable = table; + // Check if table is available. If not, find table by Alias + if (!getTable(table)) { + var oldTable = table; + table = findTableByAlias(table, editor); + if (table !== oldTable) alias = true; + } + + var columns = getTable(table); + if (columns && columns.columns) + columns = columns.columns; + + if (columns) { + addMatches(result, string, columns, function(w) { + var tableInsert = table; + if (alias == true) tableInsert = aliasTable; + if (typeof w == "string") { + w = tableInsert + "." + w; + } else { + w = shallowClone(w); + w.text = tableInsert + "." + w.text; + } + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + } + + return start; + } + + function eachWord(lineText, f) { + var words = lineText.split(/\s+/) + for (var i = 0; i < words.length; i++) + if (words[i]) f(words[i].replace(/[`,;]/g, '')) + } + + function findTableByAlias(alias, editor) { + var doc = editor.doc; + var fullQuery = doc.getValue(); + var aliasUpperCase = alias.toUpperCase(); + var previousWord = ""; + var table = ""; + var separator = []; + var validRange = { + start: Pos(0, 0), + end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) + }; + + //add separator + var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); + while(indexOfSeparator != -1) { + separator.push(doc.posFromIndex(indexOfSeparator)); + indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1); + } + separator.unshift(Pos(0, 0)); + separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); + + //find valid range + var prevItem = null; + var current = editor.getCursor() + for (var i = 0; i < separator.length; i++) { + if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) { + validRange = {start: prevItem, end: separator[i]}; + break; + } + prevItem = separator[i]; + } + + if (validRange.start) { + var query = doc.getRange(validRange.start, validRange.end, false); + + for (var i = 0; i < query.length; i++) { + var lineText = query[i]; + eachWord(lineText, function(word) { + var wordUpperCase = word.toUpperCase(); + if (wordUpperCase === aliasUpperCase && getTable(previousWord)) + table = previousWord; + if (wordUpperCase !== CONS.ALIAS_KEYWORD) + previousWord = word; + }); + if (table) break; + } + } + return table; + } + + CodeMirror.registerHelper("hint", "sql", function(editor, options) { + tables = parseTables(options && options.tables) + var defaultTableName = options && options.defaultTable; + var disableKeywords = options && options.disableKeywords; + defaultTable = defaultTableName && getTable(defaultTableName); + keywords = getKeywords(editor); + identifierQuote = getIdentifierQuote(editor); + + if (defaultTableName && !defaultTable) + defaultTable = findTableByAlias(defaultTableName, editor); + + defaultTable = defaultTable || []; + + if (defaultTable.columns) + defaultTable = defaultTable.columns; + + var cur = editor.getCursor(); + var result = []; + var token = editor.getTokenAt(cur), start, end, search; + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + + if (token.string.match(/^[.`"'\w@][\w$#]*$/g)) { + search = token.string; + start = token.start; + end = token.end; + } else { + start = end = cur.ch; + search = ""; + } + if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) { + start = nameCompletion(cur, token, result, editor); + } else { + var objectOrClass = function(w, className) { + if (typeof w === "object") { + w.className = className; + } else { + w = { text: w, className: className }; + } + return w; + }; + addMatches(result, search, defaultTable, function(w) { + return objectOrClass(w, "CodeMirror-hint-table CodeMirror-hint-default-table"); + }); + addMatches( + result, + search, + tables, function(w) { + return objectOrClass(w, "CodeMirror-hint-table"); + } + ); + if (!disableKeywords) + addMatches(result, search, keywords, function(w) { + return objectOrClass(w.toUpperCase(), "CodeMirror-hint-keyword"); + }); + } + + return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)}; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/xml-hint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/xml-hint.js new file mode 100644 index 0000000000..2b3153124e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/hint/xml-hint.js @@ -0,0 +1,132 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + + function matches(hint, typed, matchInMiddle) { + if (matchInMiddle) return hint.indexOf(typed) >= 0; + else return hint.lastIndexOf(typed, 0) == 0; + } + + function getHints(cm, options) { + var tags = options && options.schemaInfo; + var quote = (options && options.quoteChar) || '"'; + var matchInMiddle = options && options.matchInMiddle; + if (!tags) return; + var cur = cm.getCursor(), token = cm.getTokenAt(cur); + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (!inner.mode.xmlCurrentTag) return + var result = [], replaceToken = false, prefix; + var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); + var tagName = tag && /^\w/.test(token.string), tagStart; + + if (tagName) { + var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); + var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; + if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); + } else if (tag && token.string == "<") { + tagType = "open"; + } else if (tag && token.string == ""); + } else { + // Attribute completion + var curTag = tagInfo && tags[tagInfo.name], attrs = curTag && curTag.attrs; + var globalAttrs = tags["!attrs"]; + if (!attrs && !globalAttrs) return; + if (!attrs) { + attrs = globalAttrs; + } else if (globalAttrs) { // Combine tag-local and global attributes + var set = {}; + for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; + for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; + attrs = set; + } + if (token.type == "string" || token.string == "=") { // A value + var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), + Pos(cur.line, token.type == "string" ? token.start : token.end)); + var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues; + if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; + if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget + if (token.type == "string") { + prefix = token.string; + var n = 0; + if (/['"]/.test(token.string.charAt(0))) { + quote = token.string.charAt(0); + prefix = token.string.slice(1); + n++; + } + var len = token.string.length; + if (/['"]/.test(token.string.charAt(len - 1))) { + quote = token.string.charAt(len - 1); + prefix = token.string.substr(n, len - 2); + } + if (n) { // an opening quote + var line = cm.getLine(cur.line); + if (line.length > token.end && line.charAt(token.end) == quote) token.end++; // include a closing quote + } + replaceToken = true; + } + var returnHintsFromAtValues = function(atValues) { + if (atValues) + for (var i = 0; i < atValues.length; ++i) if (!prefix || matches(atValues[i], prefix, matchInMiddle)) + result.push(quote + atValues[i] + quote); + return returnHints(); + }; + if (atValues && atValues.then) return atValues.then(returnHintsFromAtValues); + return returnHintsFromAtValues(atValues); + } else { // An attribute name + if (token.type == "attribute") { + prefix = token.string; + replaceToken = true; + } + for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || matches(attr, prefix, matchInMiddle))) + result.push(attr); + } + } + function returnHints() { + return { + list: result, + from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, + to: replaceToken ? Pos(cur.line, token.end) : cur + }; + } + return returnHints(); + } + + CodeMirror.registerHelper("hint", "xml", getHints); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/coffeescript-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/coffeescript-lint.js new file mode 100644 index 0000000000..a54c703516 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/coffeescript-lint.js @@ -0,0 +1,47 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js + +// declare global: coffeelint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("lint", "coffeescript", function(text) { + var found = []; + if (!window.coffeelint) { + if (window.console) { + window.console.error("Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run."); + } + return found; + } + var parseError = function(err) { + var loc = err.lineNumber; + found.push({from: CodeMirror.Pos(loc-1, 0), + to: CodeMirror.Pos(loc, 0), + severity: err.level, + message: err.message}); + }; + try { + var res = coffeelint.lint(text); + for(var i = 0; i < res.length; i++) { + parseError(res[i]); + } + } catch(e) { + found.push({from: CodeMirror.Pos(e.location.first_line, 0), + to: CodeMirror.Pos(e.location.last_line, e.location.last_column), + severity: 'error', + message: e.message}); + } + return found; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/css-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/css-lint.js new file mode 100644 index 0000000000..6058a73eb1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/css-lint.js @@ -0,0 +1,40 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on csslint.js from https://github.com/stubbornella/csslint + +// declare global: CSSLint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("lint", "css", function(text, options) { + var found = []; + if (!window.CSSLint) { + if (window.console) { + window.console.error("Error: window.CSSLint not defined, CodeMirror CSS linting cannot run."); + } + return found; + } + var results = CSSLint.verify(text, options), messages = results.messages, message = null; + for ( var i = 0; i < messages.length; i++) { + message = messages[i]; + var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity : message.type + }); + } + return found; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/html-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/html-lint.js new file mode 100644 index 0000000000..5295c33331 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/html-lint.js @@ -0,0 +1,59 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on htmlhint.js from http://htmlhint.com/js/htmlhint.js + +// declare global: HTMLHint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("htmlhint")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "htmlhint"], mod); + else // Plain browser env + mod(CodeMirror, window.HTMLHint); +})(function(CodeMirror, HTMLHint) { + "use strict"; + + var defaultRules = { + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "doctype-first": false, + "tag-pair": true, + "spec-char-escape": true, + "id-unique": true, + "src-not-empty": true, + "attr-no-duplication": true + }; + + CodeMirror.registerHelper("lint", "html", function(text, options) { + var found = []; + if (HTMLHint && !HTMLHint.verify) { + if(typeof HTMLHint.default !== 'undefined') { + HTMLHint = HTMLHint.default; + } else { + HTMLHint = HTMLHint.HTMLHint; + } + } + if (!HTMLHint) HTMLHint = window.HTMLHint; + if (!HTMLHint) { + if (window.console) { + window.console.error("Error: HTMLHint not found, not defined on window, or not available through define/require, CodeMirror HTML linting cannot run."); + } + return found; + } + var messages = HTMLHint.verify(text, options && options.rules || defaultRules); + for (var i = 0; i < messages.length; i++) { + var message = messages[i]; + var startLine = message.line - 1, endLine = message.line - 1, startCol = message.col - 1, endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity : message.type + }); + } + return found; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/javascript-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/javascript-lint.js new file mode 100644 index 0000000000..e5bc752308 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/javascript-lint.js @@ -0,0 +1,65 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on jshint.js from https://github.com/jshint/jshint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + // declare global: JSHINT + + function validator(text, options) { + if (!window.JSHINT) { + if (window.console) { + window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run."); + } + return []; + } + if (!options.indent) // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation + options.indent = 1; // JSHint default value is 4 + JSHINT(text, options, options.globals); + var errors = JSHINT.data().errors, result = []; + if (errors) parseErrors(errors, result); + return result; + } + + CodeMirror.registerHelper("lint", "javascript", validator); + + function parseErrors(errors, output) { + for ( var i = 0; i < errors.length; i++) { + var error = errors[i]; + if (error) { + if (error.line <= 0) { + if (window.console) { + window.console.warn("Cannot display JSHint error (invalid line " + error.line + ")", error); + } + continue; + } + + var start = error.character - 1, end = start + 1; + if (error.evidence) { + var index = error.evidence.substring(start).search(/.\b/); + if (index > -1) { + end += index; + } + } + + // Convert to format expected by validation service + var hint = { + message: error.reason, + severity: error.code ? (error.code.startsWith('W') ? "warning" : "error") : "error", + from: CodeMirror.Pos(error.line - 1, start), + to: CodeMirror.Pos(error.line - 1, end) + }; + + output.push(hint); + } + } + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/json-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/json-lint.js new file mode 100644 index 0000000000..ac1d6ec28c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/json-lint.js @@ -0,0 +1,40 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on jsonlint.js from https://github.com/zaach/jsonlint + +// declare global: jsonlint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("lint", "json", function(text) { + var found = []; + if (!window.jsonlint) { + if (window.console) { + window.console.error("Error: window.jsonlint not defined, CodeMirror JSON linting cannot run."); + } + return found; + } + // for jsonlint's web dist jsonlint is exported as an object with a single property parser, of which parseError + // is a subproperty + var jsonlint = window.jsonlint.parser || window.jsonlint + jsonlint.parseError = function(str, hash) { + var loc = hash.loc; + found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), + to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), + message: str}); + }; + try { jsonlint.parse(text); } + catch(e) {} + return found; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.css new file mode 100644 index 0000000000..e1560db981 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.css @@ -0,0 +1,79 @@ +/* The lint marker gutter */ +.CodeMirror-lint-markers { + width: 16px; +} + +.CodeMirror-lint-tooltip { + background-color: #ffd; + border: 1px solid black; + border-radius: 4px 4px 4px 4px; + color: black; + font-family: monospace; + font-size: 10pt; + overflow: hidden; + padding: 2px 5px; + position: fixed; + white-space: pre; + white-space: pre-wrap; + z-index: 100; + max-width: 600px; + opacity: 0; + transition: opacity .4s; + -moz-transition: opacity .4s; + -webkit-transition: opacity .4s; + -o-transition: opacity .4s; + -ms-transition: opacity .4s; +} + +.CodeMirror-lint-mark { + background-position: left bottom; + background-repeat: repeat-x; +} + +.CodeMirror-lint-mark-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII="); +} + +.CodeMirror-lint-mark-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg=="); +} + +.CodeMirror-lint-marker { + background-position: center center; + background-repeat: no-repeat; + cursor: pointer; + display: inline-block; + height: 16px; + width: 16px; + vertical-align: middle; + position: relative; +} + +.CodeMirror-lint-message { + padding-left: 18px; + background-position: top left; + background-repeat: no-repeat; +} + +.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII="); +} + +.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII="); +} + +.CodeMirror-lint-marker-multiple { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC"); + background-repeat: no-repeat; + background-position: right bottom; + width: 100%; height: 100%; +} + +.CodeMirror-lint-line-error { + background-color: rgba(183, 76, 81, 0.08); +} + +.CodeMirror-lint-line-warning { + background-color: rgba(255, 211, 0, 0.1); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.js new file mode 100644 index 0000000000..1613deb9dd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/lint.js @@ -0,0 +1,291 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var GUTTER_ID = "CodeMirror-lint-markers"; + var LINT_LINE_ID = "CodeMirror-lint-line-"; + + function showTooltip(cm, e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip cm-s-" + cm.options.theme; + tt.appendChild(content.cloneNode(true)); + if (cm.state.lint.options.selfContain) + cm.getWrapperElement().appendChild(tt); + else + document.body.appendChild(tt); + + function position(e) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = (e.clientX + 5) + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function() { rm(tt); }, 600); + } + + function showTooltipFor(cm, e, content, node) { + var tooltip = showTooltip(cm, e, content); + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { hideTooltip(tooltip); tooltip = null; } + } + var poll = setInterval(function() { + if (tooltip) for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { hide(); break; } + } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); + } + + function LintState(cm, conf, hasGutter) { + this.marked = []; + if (conf instanceof Function) conf = {getAnnotations: conf}; + if (!conf || conf === true) conf = {}; + this.options = {}; + this.linterOptions = conf.options || {}; + for (var prop in defaults) this.options[prop] = defaults[prop]; + for (var prop in conf) { + if (defaults.hasOwnProperty(prop)) { + if (conf[prop] != null) this.options[prop] = conf[prop]; + } else if (!conf.options) { + this.linterOptions[prop] = conf[prop]; + } + } + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function(e) { onMouseOver(cm, e); }; + this.waitingFor = 0 + } + + var defaults = { + highlightLines: false, + tooltips: true, + delay: 500, + lintOnChange: true, + getAnnotations: null, + async: false, + selfContain: null, + formatAnnotation: null, + onUpdateLinting: null + } + + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + if (state.options.highlightLines) clearErrorLines(cm); + for (var i = 0; i < state.marked.length; ++i) + state.marked[i].clear(); + state.marked.length = 0; + } + + function clearErrorLines(cm) { + cm.eachLine(function(line) { + var has = line.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(line.wrapClass); + if (has) cm.removeLineClass(line, "wrap", has[0]); + }) + } + + function makeMarker(cm, labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), inner = marker; + marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"; + } + + if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { + showTooltipFor(cm, e, labels, inner); + }); + + return marker; + } + + function getMaxSeverity(a, b) { + if (a == "error") return a; + else return b; + } + + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity; + if (typeof ann.messageHTML != 'undefined') { + tip.innerHTML = ann.messageHTML; + } else { + tip.appendChild(document.createTextNode(ann.message)); + } + return tip; + } + + function lintAsync(cm, getAnnotations) { + var state = cm.state.lint + var id = ++state.waitingFor + function abort() { + id = -1 + cm.off("change", abort) + } + cm.on("change", abort) + getAnnotations(cm.getValue(), function(annotations, arg2) { + cm.off("change", abort) + if (state.waitingFor != id) return + if (arg2 && annotations instanceof CodeMirror) annotations = arg2 + cm.operation(function() {updateLinting(cm, annotations)}) + }, state.linterOptions, cm); + } + + function startLinting(cm) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + /* + * Passing rules in `options` property prevents JSHint (and other linters) from complaining + * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc. + */ + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations) + } else { + var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm); + if (!annotations) return; + if (annotations.then) annotations.then(function(issues) { + cm.operation(function() {updateLinting(cm, issues)}) + }); + else cm.operation(function() {updateLinting(cm, annotations)}) + } + } + + function updateLinting(cm, annotationsNotSorted) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + clearMarks(cm); + + var annotations = groupByLine(annotationsNotSorted); + + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + + // filter out duplicate messages + var message = []; + anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) }); + + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + // use original annotations[line] to show multiple messages + if (state.hasGutter) + cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1, + options.tooltips)); + + if (options.highlightLines) + cm.addLineClass(line, "wrap", LINT_LINE_ID + maxSeverity); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay); + } + + function popupTooltips(cm, annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(cm, e, tooltip, target); + } + + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); + + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + var ann = spans[i].__annotation; + if (ann) annotations.push(ann); + } + if (annotations.length) popupTooltips(cm, annotations, e); + } + + CodeMirror.defineOption("lint", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) + cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + + if (val) { + var gutters = cm.getOption("gutters"), hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, val, hasLintGutter); + if (state.options.lintOnChange) + cm.on("change", onChange); + if (state.options.tooltips != false && state.options.tooltips != "gutter") + CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + + startLinting(cm); + } + }); + + CodeMirror.defineExtension("performLint", function() { + startLinting(this); + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/yaml-lint.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/yaml-lint.js new file mode 100644 index 0000000000..b4ac5abc4e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/lint/yaml-lint.js @@ -0,0 +1,41 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +// Depends on js-yaml.js from https://github.com/nodeca/js-yaml + +// declare global: jsyaml + +CodeMirror.registerHelper("lint", "yaml", function(text) { + var found = []; + if (!window.jsyaml) { + if (window.console) { + window.console.error("Error: window.jsyaml not defined, CodeMirror YAML linting cannot run."); + } + return found; + } + try { jsyaml.loadAll(text); } + catch(e) { + var loc = e.mark, + // js-yaml YAMLException doesn't always provide an accurate lineno + // e.g., when there are multiple yaml docs + // --- + // --- + // foo:bar + from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0), + to = from; + found.push({ from: from, to: to, message: e.message }); + } + return found; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.css new file mode 100644 index 0000000000..dadd7f59c7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.css @@ -0,0 +1,119 @@ +.CodeMirror-merge { + position: relative; + border: 1px solid #ddd; + white-space: pre; +} + +.CodeMirror-merge, .CodeMirror-merge .CodeMirror { + height: 350px; +} + +.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } +.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } +.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } +.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } + +.CodeMirror-merge-pane { + display: inline-block; + white-space: normal; + vertical-align: top; +} +.CodeMirror-merge-pane-rightmost { + position: absolute; + right: 0px; + z-index: 1; +} + +.CodeMirror-merge-gap { + z-index: 2; + display: inline-block; + height: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + position: relative; + background: #f8f8f8; +} + +.CodeMirror-merge-scrolllock-wrap { + position: absolute; + bottom: 0; left: 50%; +} +.CodeMirror-merge-scrolllock { + position: relative; + left: -50%; + cursor: pointer; + color: #555; + line-height: 1; +} +.CodeMirror-merge-scrolllock:after { + content: "\21db\00a0\00a0\21da"; +} +.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after { + content: "\21db\21da"; +} + +.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { + position: absolute; + left: 0; top: 0; + right: 0; bottom: 0; + line-height: 1; +} + +.CodeMirror-merge-copy { + position: absolute; + cursor: pointer; + color: #44c; + z-index: 3; +} + +.CodeMirror-merge-copy-reverse { + position: absolute; + cursor: pointer; + color: #44c; +} + +.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } +.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } + +.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-chunk { background: #ffffe0; } +.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } +.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } +.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk { background: #eef; } +.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } +.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } +.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } +.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } +.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } + +.CodeMirror-merge-collapsed-widget:before { + content: "(...)"; +} +.CodeMirror-merge-collapsed-widget { + cursor: pointer; + color: #88b; + background: #eef; + border: 1px solid #ddf; + font-size: 90%; + padding: 0 3px; + border-radius: 4px; +} +.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.js new file mode 100644 index 0000000000..35292c0218 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/merge/merge.js @@ -0,0 +1,1018 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); // Note non-packaged dependency diff_match_patch + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "diff_match_patch"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + var svgNS = "http://www.w3.org/2000/svg"; + + function DiffView(mv, type) { + this.mv = mv; + this.type = type; + this.classes = type == "left" + ? {chunk: "CodeMirror-merge-l-chunk", + start: "CodeMirror-merge-l-chunk-start", + end: "CodeMirror-merge-l-chunk-end", + insert: "CodeMirror-merge-l-inserted", + del: "CodeMirror-merge-l-deleted", + connect: "CodeMirror-merge-l-connect"} + : {chunk: "CodeMirror-merge-r-chunk", + start: "CodeMirror-merge-r-chunk-start", + end: "CodeMirror-merge-r-chunk-end", + insert: "CodeMirror-merge-r-inserted", + del: "CodeMirror-merge-r-deleted", + connect: "CodeMirror-merge-r-connect"}; + } + + DiffView.prototype = { + constructor: DiffView, + init: function(pane, orig, options) { + this.edit = this.mv.edit; + ;(this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this); + this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options))); + if (this.mv.options.connect == "align") { + if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit) + this.orig.state.trackAlignable = new TrackAlignable(this.orig) + } + this.lockButton.title = this.edit.phrase("Toggle locked scrolling"); + this.lockButton.setAttribute("aria-label", this.lockButton.title); + + this.orig.state.diffViews = [this]; + var classLocation = options.chunkClassLocation || "background"; + if (Object.prototype.toString.call(classLocation) != "[object Array]") classLocation = [classLocation] + this.classes.classLocation = classLocation + + this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace); + this.chunks = getChunks(this.diff); + this.diffOutOfDate = this.dealigned = false; + this.needsScrollSync = null + + this.showDifferences = options.showDifferences !== false; + }, + registerEvents: function(otherDv) { + this.forceUpdate = registerUpdate(this); + setScrollLock(this, true, false); + registerScroll(this, otherDv); + }, + setShowDifferences: function(val) { + val = val !== false; + if (val != this.showDifferences) { + this.showDifferences = val; + this.forceUpdate("full"); + } + } + }; + + function ensureDiff(dv) { + if (dv.diffOutOfDate) { + dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace); + dv.chunks = getChunks(dv.diff); + dv.diffOutOfDate = false; + CodeMirror.signal(dv.edit, "updateDiff", dv.diff); + } + } + + var updating = false; + function registerUpdate(dv) { + var edit = {from: 0, to: 0, marked: []}; + var orig = {from: 0, to: 0, marked: []}; + var debounceChange, updatingFast = false; + function update(mode) { + updating = true; + updatingFast = false; + if (mode == "full") { + if (dv.svg) clear(dv.svg); + if (dv.copyButtons) clear(dv.copyButtons); + clearMarks(dv.edit, edit.marked, dv.classes); + clearMarks(dv.orig, orig.marked, dv.classes); + edit.from = edit.to = orig.from = orig.to = 0; + } + ensureDiff(dv); + if (dv.showDifferences) { + updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes); + updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes); + } + + if (dv.mv.options.connect == "align") + alignChunks(dv); + makeConnections(dv); + if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync) + + updating = false; + } + function setDealign(fast) { + if (updating) return; + dv.dealigned = true; + set(fast); + } + function set(fast) { + if (updating || updatingFast) return; + clearTimeout(debounceChange); + if (fast === true) updatingFast = true; + debounceChange = setTimeout(update, fast === true ? 20 : 250); + } + function change(_cm, change) { + if (!dv.diffOutOfDate) { + dv.diffOutOfDate = true; + edit.from = edit.to = orig.from = orig.to = 0; + } + // Update faster when a line was added/removed + setDealign(change.text.length - 1 != change.to.line - change.from.line); + } + function swapDoc() { + dv.diffOutOfDate = true; + dv.dealigned = true; + update("full"); + } + dv.edit.on("change", change); + dv.orig.on("change", change); + dv.edit.on("swapDoc", swapDoc); + dv.orig.on("swapDoc", swapDoc); + if (dv.mv.options.connect == "align") { + CodeMirror.on(dv.edit.state.trackAlignable, "realign", setDealign) + CodeMirror.on(dv.orig.state.trackAlignable, "realign", setDealign) + } + dv.edit.on("viewportChange", function() { set(false); }); + dv.orig.on("viewportChange", function() { set(false); }); + update(); + return update; + } + + function registerScroll(dv, otherDv) { + dv.edit.on("scroll", function() { + syncScroll(dv, true) && makeConnections(dv); + }); + dv.orig.on("scroll", function() { + syncScroll(dv, false) && makeConnections(dv); + if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv); + }); + } + + function syncScroll(dv, toOrig) { + // Change handler will do a refresh after a timeout when diff is out of date + if (dv.diffOutOfDate) { + if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig + return false + } + dv.needsScrollSync = null + if (!dv.lockScroll) return true; + var editor, other, now = +new Date; + if (toOrig) { editor = dv.edit; other = dv.orig; } + else { editor = dv.orig; other = dv.edit; } + // Don't take action if the position of this editor was recently set + // (to prevent feedback loops) + if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false; + + var sInfo = editor.getScrollInfo(); + if (dv.mv.options.connect == "align") { + targetPos = sInfo.top; + } else { + var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen; + var mid = editor.lineAtHeight(midY, "local"); + var around = chunkBoundariesAround(dv.chunks, mid, toOrig); + var off = getOffsets(editor, toOrig ? around.edit : around.orig); + var offOther = getOffsets(other, toOrig ? around.orig : around.edit); + var ratio = (midY - off.top) / (off.bot - off.top); + var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); + + var botDist, mix; + // Some careful tweaking to make sure no space is left out of view + // when scrolling to top or bottom. + if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { + targetPos = targetPos * mix + sInfo.top * (1 - mix); + } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { + var otherInfo = other.getScrollInfo(); + var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; + if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) + targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); + } + } + + other.scrollTo(sInfo.left, targetPos); + other.state.scrollSetAt = now; + other.state.scrollSetBy = dv; + return true; + } + + function getOffsets(editor, around) { + var bot = around.after; + if (bot == null) bot = editor.lastLine() + 1; + return {top: editor.heightAtLine(around.before || 0, "local"), + bot: editor.heightAtLine(bot, "local")}; + } + + function setScrollLock(dv, val, action) { + dv.lockScroll = val; + if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); + (val ? CodeMirror.addClass : CodeMirror.rmClass)(dv.lockButton, "CodeMirror-merge-scrolllock-enabled"); + } + + // Updating the marks for editor content + + function removeClass(editor, line, classes) { + var locs = classes.classLocation + for (var i = 0; i < locs.length; i++) { + editor.removeLineClass(line, locs[i], classes.chunk); + editor.removeLineClass(line, locs[i], classes.start); + editor.removeLineClass(line, locs[i], classes.end); + } + } + + function clearMarks(editor, arr, classes) { + for (var i = 0; i < arr.length; ++i) { + var mark = arr[i]; + if (mark instanceof CodeMirror.TextMarker) + mark.clear(); + else if (mark.parent) + removeClass(editor, mark, classes); + } + arr.length = 0; + } + + // FIXME maybe add a margin around viewport to prevent too many updates + function updateMarks(editor, diff, state, type, classes) { + var vp = editor.getViewport(); + editor.operation(function() { + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + clearMarks(editor, state.marked, classes); + markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); + state.from = vp.from; state.to = vp.to; + } else { + if (vp.from < state.from) { + markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); + state.from = vp.from; + } + if (vp.to > state.to) { + markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); + state.to = vp.to; + } + } + }); + } + + function addClass(editor, lineNr, classes, main, start, end) { + var locs = classes.classLocation, line = editor.getLineHandle(lineNr); + for (var i = 0; i < locs.length; i++) { + if (main) editor.addLineClass(line, locs[i], classes.chunk); + if (start) editor.addLineClass(line, locs[i], classes.start); + if (end) editor.addLineClass(line, locs[i], classes.end); + } + return line; + } + + function markChanges(editor, diff, type, marks, from, to, classes) { + var pos = Pos(0, 0); + var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1)); + var cls = type == DIFF_DELETE ? classes.del : classes.insert; + function markChunk(start, end) { + var bfrom = Math.max(from, start), bto = Math.min(to, end); + for (var i = bfrom; i < bto; ++i) + marks.push(addClass(editor, i, classes, true, i == start, i == end - 1)); + // When the chunk is empty, make sure a horizontal line shows up + if (start == end && bfrom == end && bto == end) { + if (bfrom) + marks.push(addClass(editor, bfrom - 1, classes, false, false, true)); + else + marks.push(addClass(editor, bfrom, classes, false, true, false)); + } + } + + var chunkStart = 0, pending = false; + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], tp = part[0], str = part[1]; + if (tp == DIFF_EQUAL) { + var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); + moveOver(pos, str); + var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); + if (cleanTo > cleanFrom) { + if (pending) { markChunk(chunkStart, cleanFrom); pending = false } + chunkStart = cleanTo; + } + } else { + pending = true + if (tp == type) { + var end = moveOver(pos, str, true); + var a = posMax(top, pos), b = posMin(bot, end); + if (!posEq(a, b)) + marks.push(editor.markText(a, b, {className: cls})); + pos = end; + } + } + } + if (pending) markChunk(chunkStart, pos.line + 1); + } + + // Updating the gap between editor and original + + function makeConnections(dv) { + if (!dv.showDifferences) return; + + if (dv.svg) { + clear(dv.svg); + var w = dv.gap.offsetWidth; + attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); + } + if (dv.copyButtons) clear(dv.copyButtons); + + var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); + var outerTop = dv.mv.wrap.getBoundingClientRect().top + var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top + var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top; + for (var i = 0; i < dv.chunks.length; i++) { + var ch = dv.chunks[i]; + if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && + ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from) + drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w); + } + } + + function getMatchingOrigLine(editLine, chunks) { + var editStart = 0, origStart = 0; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null; + if (chunk.editFrom > editLine) break; + editStart = chunk.editTo; + origStart = chunk.origTo; + } + return origStart + (editLine - editStart); + } + + // Combines information about chunks and widgets/markers to return + // an array of lines, in a single editor, that probably need to be + // aligned with their counterparts in the editor next to it. + function alignableFor(cm, chunks, isOrig) { + var tracker = cm.state.trackAlignable + var start = cm.firstLine(), trackI = 0 + var result = [] + for (var i = 0;; i++) { + var chunk = chunks[i] + var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom + for (; trackI < tracker.alignable.length; trackI += 2) { + var n = tracker.alignable[trackI] + 1 + if (n <= start) continue + if (n <= chunkStart) result.push(n) + else break + } + if (!chunk) break + result.push(start = isOrig ? chunk.origTo : chunk.editTo) + } + return result + } + + // Given information about alignable lines in two editors, fill in + // the result (an array of three-element arrays) to reflect the + // lines that need to be aligned with each other. + function mergeAlignable(result, origAlignable, chunks, setIndex) { + var rI = 0, origI = 0, chunkI = 0, diff = 0 + outer: for (;; rI++) { + var nextR = result[rI], nextO = origAlignable[origI] + if (!nextR && nextO == null) break + + var rLine = nextR ? nextR[0] : 1e9, oLine = nextO == null ? 1e9 : nextO + while (chunkI < chunks.length) { + var chunk = chunks[chunkI] + if (chunk.origFrom <= oLine && chunk.origTo > oLine) { + origI++ + rI-- + continue outer; + } + if (chunk.editTo > rLine) { + if (chunk.editFrom <= rLine) continue outer; + break + } + diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom) + chunkI++ + } + if (rLine == oLine - diff) { + nextR[setIndex] = oLine + origI++ + } else if (rLine < oLine - diff) { + nextR[setIndex] = rLine + diff + } else { + var record = [oLine - diff, null, null] + record[setIndex] = oLine + result.splice(rI, 0, record) + origI++ + } + } + } + + function findAlignedLines(dv, other) { + var alignable = alignableFor(dv.edit, dv.chunks, false), result = [] + if (other) for (var i = 0, j = 0; i < other.chunks.length; i++) { + var n = other.chunks[i].editTo + while (j < alignable.length && alignable[j] < n) j++ + if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n) + } + for (var i = 0; i < alignable.length; i++) + result.push([alignable[i], null, null]) + + mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1) + if (other) + mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2) + + return result + } + + function alignChunks(dv, force) { + if (!dv.dealigned && !force) return; + if (!dv.orig.curOp) return dv.orig.operation(function() { + alignChunks(dv, force); + }); + + dv.dealigned = false; + var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left; + if (other) { + ensureDiff(other); + other.dealigned = false; + } + var linesToAlign = findAlignedLines(dv, other); + + // Clear old aligners + var aligners = dv.mv.aligners; + for (var i = 0; i < aligners.length; i++) + aligners[i].clear(); + aligners.length = 0; + + var cm = [dv.edit, dv.orig], scroll = [], offset = [] + if (other) cm.push(other.orig); + for (var i = 0; i < cm.length; i++) { + scroll.push(cm[i].getScrollInfo().top); + offset.push(-cm[i].getScrollerElement().getBoundingClientRect().top) + } + + if (offset[0] != offset[1] || cm.length == 3 && offset[1] != offset[2]) + alignLines(cm, offset, [0, 0, 0], aligners) + for (var ln = 0; ln < linesToAlign.length; ln++) + alignLines(cm, offset, linesToAlign[ln], aligners); + + for (var i = 0; i < cm.length; i++) + cm[i].scrollTo(null, scroll[i]); + } + + function alignLines(cm, cmOffset, lines, aligners) { + var maxOffset = -1e8, offset = []; + for (var i = 0; i < cm.length; i++) if (lines[i] != null) { + var off = cm[i].heightAtLine(lines[i], "local") - cmOffset[i]; + offset[i] = off; + maxOffset = Math.max(maxOffset, off); + } + for (var i = 0; i < cm.length; i++) if (lines[i] != null) { + var diff = maxOffset - offset[i]; + if (diff > 1) + aligners.push(padAbove(cm[i], lines[i], diff)); + } + } + + function padAbove(cm, line, size) { + var above = true; + if (line > cm.lastLine()) { + line--; + above = false; + } + var elt = document.createElement("div"); + elt.className = "CodeMirror-merge-spacer"; + elt.style.height = size + "px"; elt.style.minWidth = "1px"; + return cm.addLineWidget(line, elt, {height: size, above: above, mergeSpacer: true, handleMouseEvents: true}); + } + + function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) { + var flip = dv.type == "left"; + var top = dv.orig.heightAtLine(chunk.origFrom, "local", true) - sTopOrig; + if (dv.svg) { + var topLpx = top; + var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local", true) - sTopEdit; + if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; } + var botLpx = dv.orig.heightAtLine(chunk.origTo, "local", true) - sTopOrig; + var botRpx = dv.edit.heightAtLine(chunk.editTo, "local", true) - sTopEdit; + if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; } + var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx; + var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx; + attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), + "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", + "class", dv.classes.connect); + } + if (dv.copyButtons) { + var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", + "CodeMirror-merge-copy")); + var editOriginals = dv.mv.options.allowEditingOriginals; + copy.title = dv.edit.phrase(editOriginals ? "Push to left" : "Revert chunk"); + copy.chunk = chunk; + copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit) + "px"; + copy.setAttribute("role", "button"); + copy.setAttribute("tabindex", "0"); + copy.setAttribute("aria-label", copy.title); + + if (editOriginals) { + var topReverse = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit; + var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", + "CodeMirror-merge-copy-reverse")); + copyReverse.title = "Push to right"; + copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo, + origFrom: chunk.editFrom, origTo: chunk.editTo}; + copyReverse.style.top = topReverse + "px"; + dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; + copyReverse.setAttribute("role", "button"); + copyReverse.setAttribute("tabindex", "0"); + copyReverse.setAttribute("aria-label", copyReverse.title); + } + } + } + + function copyChunk(dv, to, from, chunk) { + if (dv.diffOutOfDate) return; + var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0) + var origEnd = Pos(chunk.origTo, 0) + var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0) + var editEnd = Pos(chunk.editTo, 0) + var handler = dv.mv.options.revertChunk + if (handler) + handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd) + else + to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd) + } + + // Merge view, containing 0, 1, or 2 diff views. + + var MergeView = CodeMirror.MergeView = function(node, options) { + if (!(this instanceof MergeView)) return new MergeView(node, options); + + this.options = options; + var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight; + + var hasLeft = origLeft != null, hasRight = origRight != null; + var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); + var wrap = [], left = this.left = null, right = this.right = null; + var self = this; + + if (hasLeft) { + left = this.left = new DiffView(this, "left"); + var leftPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-left"); + wrap.push(leftPane); + wrap.push(buildGap(left)); + } + + var editPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-editor"); + wrap.push(editPane); + + if (hasRight) { + right = this.right = new DiffView(this, "right"); + wrap.push(buildGap(right)); + var rightPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-right"); + wrap.push(rightPane); + } + + (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; + + wrap.push(elt("div", null, null, "height: 0; clear: both;")); + + var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); + this.edit = CodeMirror(editPane, copyObj(options)); + + if (left) left.init(leftPane, origLeft, options); + if (right) right.init(rightPane, origRight, options); + if (options.collapseIdentical) + this.editor().operation(function() { + collapseIdenticalStretches(self, options.collapseIdentical); + }); + if (options.connect == "align") { + this.aligners = []; + alignChunks(this.left || this.right, true); + } + if (left) left.registerEvents(right) + if (right) right.registerEvents(left) + + + var onResize = function() { + if (left) makeConnections(left); + if (right) makeConnections(right); + }; + CodeMirror.on(window, "resize", onResize); + var resizeInterval = setInterval(function() { + for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} + if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); } + }, 5000); + }; + + function buildGap(dv) { + var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); + lock.setAttribute("role", "button"); + lock.setAttribute("tabindex", "0"); + var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); + CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); + CodeMirror.on(lock, "keyup", function(e) { e.key === "Enter" && setScrollLock(dv, !dv.lockScroll); }); + var gapElts = [lockWrap]; + if (dv.mv.options.revertButtons !== false) { + dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); + function copyButtons(e) { + var node = e.target || e.srcElement; + if (!node.chunk) return; + if (node.className == "CodeMirror-merge-copy-reverse") { + copyChunk(dv, dv.orig, dv.edit, node.chunk); + return; + } + copyChunk(dv, dv.edit, dv.orig, node.chunk); + } + CodeMirror.on(dv.copyButtons, "click", copyButtons); + CodeMirror.on(dv.copyButtons, "keyup", function(e) { e.key === "Enter" && copyButtons(e); }); + gapElts.unshift(dv.copyButtons); + } + if (dv.mv.options.connect != "align") { + var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); + if (svg && !svg.createSVGRect) svg = null; + dv.svg = svg; + if (svg) gapElts.push(svg); + } + + return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); + } + + MergeView.prototype = { + constructor: MergeView, + editor: function() { return this.edit; }, + rightOriginal: function() { return this.right && this.right.orig; }, + leftOriginal: function() { return this.left && this.left.orig; }, + setShowDifferences: function(val) { + if (this.right) this.right.setShowDifferences(val); + if (this.left) this.left.setShowDifferences(val); + }, + rightChunks: function() { + if (this.right) { ensureDiff(this.right); return this.right.chunks; } + }, + leftChunks: function() { + if (this.left) { ensureDiff(this.left); return this.left.chunks; } + } + }; + + function asString(obj) { + if (typeof obj == "string") return obj; + else return obj.getValue(); + } + + // Operations on diffs + var dmp; + function getDiff(a, b, ignoreWhitespace) { + if (!dmp) dmp = new diff_match_patch(); + + var diff = dmp.diff_main(a, b); + // The library sometimes leaves in empty parts, which confuse the algorithm + for (var i = 0; i < diff.length; ++i) { + var part = diff[i]; + if (ignoreWhitespace ? !/[^ \t]/.test(part[1]) : !part[1]) { + diff.splice(i--, 1); + } else if (i && diff[i - 1][0] == part[0]) { + diff.splice(i--, 1); + diff[i][1] += part[1]; + } + } + return diff; + } + + function getChunks(diff) { + var chunks = []; + if (!diff.length) return chunks; + var startEdit = 0, startOrig = 0; + var edit = Pos(0, 0), orig = Pos(0, 0); + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], tp = part[0]; + if (tp == DIFF_EQUAL) { + var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0; + var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff; + moveOver(edit, part[1], null, orig); + var endOff = endOfLineClean(diff, i) ? 1 : 0; + var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff; + if (cleanToEdit > cleanFromEdit) { + if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig, + editFrom: startEdit, editTo: cleanFromEdit}); + startEdit = cleanToEdit; startOrig = cleanToOrig; + } + } else { + moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); + } + } + if (startEdit <= edit.line || startOrig <= orig.line) + chunks.push({origFrom: startOrig, origTo: orig.line + 1, + editFrom: startEdit, editTo: edit.line + 1}); + return chunks; + } + + function endOfLineClean(diff, i) { + if (i == diff.length - 1) return true; + var next = diff[i + 1][1]; + if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false; + if (i == diff.length - 2) return true; + next = diff[i + 2][1]; + return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10; + } + + function startOfLineClean(diff, i) { + if (i == 0) return true; + var last = diff[i - 1][1]; + if (last.charCodeAt(last.length - 1) != 10) return false; + if (i == 1) return true; + last = diff[i - 2][1]; + return last.charCodeAt(last.length - 1) == 10; + } + + function chunkBoundariesAround(chunks, n, nInEdit) { + var beforeE, afterE, beforeO, afterO; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom; + var toLocal = nInEdit ? chunk.editTo : chunk.origTo; + if (afterE == null) { + if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; } + else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; } + } + if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; } + else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; } + } + return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}}; + } + + function collapseSingle(cm, from, to) { + cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + var widget = document.createElement("span"); + widget.className = "CodeMirror-merge-collapsed-widget"; + widget.title = cm.phrase("Identical text collapsed. Click to expand."); + var mark = cm.markText(Pos(from, 0), Pos(to - 1), { + inclusiveLeft: true, + inclusiveRight: true, + replacedWith: widget, + clearOnEnter: true + }); + function clear() { + mark.clear(); + cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + } + if (mark.explicitlyCleared) clear(); + CodeMirror.on(widget, "click", clear); + mark.on("clear", clear); + CodeMirror.on(widget, "click", clear); + return {mark: mark, clear: clear}; + } + + function collapseStretch(size, editors) { + var marks = []; + function clear() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + } + for (var i = 0; i < editors.length; i++) { + var editor = editors[i]; + var mark = collapseSingle(editor.cm, editor.line, editor.line + size); + marks.push(mark); + mark.mark.on("clear", clear); + } + return marks[0].mark; + } + + function unclearNearChunks(dv, margin, off, clear) { + for (var i = 0; i < dv.chunks.length; i++) { + var chunk = dv.chunks[i]; + for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) { + var pos = l + off; + if (pos >= 0 && pos < clear.length) clear[pos] = false; + } + } + } + + function collapseIdenticalStretches(mv, margin) { + if (typeof margin != "number") margin = 2; + var clear = [], edit = mv.editor(), off = edit.firstLine(); + for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true); + if (mv.left) unclearNearChunks(mv.left, margin, off, clear); + if (mv.right) unclearNearChunks(mv.right, margin, off, clear); + + for (var i = 0; i < clear.length; i++) { + if (clear[i]) { + var line = i + off; + for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {} + if (size > margin) { + var editors = [{line: line, cm: edit}]; + if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig}); + if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig}); + var mark = collapseStretch(size, editors); + if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark); + } + } + } + } + + // General utilities + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") e.appendChild(document.createTextNode(content)); + else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function clear(node) { + for (var count = node.childNodes.length; count > 0; --count) + node.removeChild(node.firstChild); + } + + function attrs(elt) { + for (var i = 1; i < arguments.length; i += 2) + elt.setAttribute(arguments[i], arguments[i+1]); + } + + function copyObj(obj, target) { + if (!target) target = {}; + for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; + return target; + } + + function moveOver(pos, str, copy, other) { + var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0; + for (;;) { + var nl = str.indexOf("\n", at); + if (nl == -1) break; + ++out.line; + if (other) ++other.line; + at = nl + 1; + } + out.ch = (at ? 0 : out.ch) + (str.length - at); + if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); + return out; + } + + // Tracks collapsed markers and line widgets, in order to be able to + // accurately align the content of two editors. + + var F_WIDGET = 1, F_WIDGET_BELOW = 2, F_MARKER = 4 + + function TrackAlignable(cm) { + this.cm = cm + this.alignable = [] + this.height = cm.doc.height + var self = this + cm.on("markerAdded", function(_, marker) { + if (!marker.collapsed) return + var found = marker.find(1) + if (found != null) self.set(found.line, F_MARKER) + }) + cm.on("markerCleared", function(_, marker, _min, max) { + if (max != null && marker.collapsed) + self.check(max, F_MARKER, self.hasMarker) + }) + cm.on("markerChanged", this.signal.bind(this)) + cm.on("lineWidgetAdded", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW) + else self.set(lineNo, F_WIDGET) + }) + cm.on("lineWidgetCleared", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow) + else self.check(lineNo, F_WIDGET, self.hasWidget) + }) + cm.on("lineWidgetChanged", this.signal.bind(this)) + cm.on("change", function(_, change) { + var start = change.from.line, nBefore = change.to.line - change.from.line + var nAfter = change.text.length - 1, end = start + nAfter + if (nBefore || nAfter) self.map(start, nBefore, nAfter) + self.check(end, F_MARKER, self.hasMarker) + if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker) + }) + cm.on("viewportChange", function() { + if (self.cm.doc.height != self.height) self.signal() + }) + } + + TrackAlignable.prototype = { + signal: function() { + CodeMirror.signal(this, "realign") + this.height = this.cm.doc.height + }, + + set: function(n, flags) { + var pos = -1 + for (; pos < this.alignable.length; pos += 2) { + var diff = this.alignable[pos] - n + if (diff == 0) { + if ((this.alignable[pos + 1] & flags) == flags) return + this.alignable[pos + 1] |= flags + this.signal() + return + } + if (diff > 0) break + } + this.signal() + this.alignable.splice(pos, 0, n, flags) + }, + + find: function(n) { + for (var i = 0; i < this.alignable.length; i += 2) + if (this.alignable[i] == n) return i + return -1 + }, + + check: function(n, flag, pred) { + var found = this.find(n) + if (found == -1 || !(this.alignable[found + 1] & flag)) return + if (!pred.call(this, n)) { + this.signal() + var flags = this.alignable[found + 1] & ~flag + if (flags) this.alignable[found + 1] = flags + else this.alignable.splice(found, 2) + } + }, + + hasMarker: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.markedSpans) for (var i = 0; i < handle.markedSpans.length; i++) + if (handle.markedSpans[i].marker.collapsed && handle.markedSpans[i].to != null) + return true + return false + }, + + hasWidget: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++) + if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + + hasWidgetBelow: function(n) { + if (n == this.cm.lastLine()) return false + var handle = this.cm.getLineHandle(n + 1) + if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++) + if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + + map: function(from, nBefore, nAfter) { + var diff = nAfter - nBefore, to = from + nBefore, widgetFrom = -1, widgetTo = -1 + for (var i = 0; i < this.alignable.length; i += 2) { + var n = this.alignable[i] + if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i + if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i + if (n <= from) continue + else if (n < to) this.alignable.splice(i--, 2) + else this.alignable[i] += diff + } + if (widgetFrom > -1) { + var flags = this.alignable[widgetFrom + 1] + if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2) + else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW + } + if (widgetTo > -1 && nAfter) + this.set(from + nAfter, F_WIDGET_BELOW) + } + } + + function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; } + function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; } + function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } + + function findPrevDiff(chunks, start, isOrig) { + for (var i = chunks.length - 1; i >= 0; i--) { + var chunk = chunks[i]; + var to = (isOrig ? chunk.origTo : chunk.editTo) - 1; + if (to < start) return to; + } + } + + function findNextDiff(chunks, start, isOrig) { + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var from = (isOrig ? chunk.origFrom : chunk.editFrom); + if (from > start) return from; + } + } + + function goNearbyDiff(cm, dir) { + var found = null, views = cm.state.diffViews, line = cm.getCursor().line; + if (views) for (var i = 0; i < views.length; i++) { + var dv = views[i], isOrig = cm == dv.orig; + ensureDiff(dv); + var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig); + if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found))) + found = pos; + } + if (found != null) + cm.setCursor(found, 0); + else + return CodeMirror.Pass; + } + + CodeMirror.commands.goNextDiff = function(cm) { + return goNearbyDiff(cm, 1); + }; + CodeMirror.commands.goPrevDiff = function(cm) { + return goNearbyDiff(cm, -1); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/loadmode.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/loadmode.js new file mode 100644 index 0000000000..fc695d0c37 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/loadmode.js @@ -0,0 +1,66 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), "cjs"); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); }); + else // Plain browser env + mod(CodeMirror, "plain"); +})(function(CodeMirror, env) { + if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; + + var loading = {}; + function splitCallback(cont, n) { + var countDown = n; + return function() { if (--countDown == 0) cont(); }; + } + function ensureDeps(mode, cont, options) { + var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.dependencies; + if (!deps) return cont(); + var missing = []; + for (var i = 0; i < deps.length; ++i) { + if (!CodeMirror.modes.hasOwnProperty(deps[i])) + missing.push(deps[i]); + } + if (!missing.length) return cont(); + var split = splitCallback(cont, missing.length); + for (var i = 0; i < missing.length; ++i) + CodeMirror.requireMode(missing[i], split, options); + } + + CodeMirror.requireMode = function(mode, cont, options) { + if (typeof mode != "string") mode = mode.name; + if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options); + if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); + + var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode); + if (options && options.loadMode) { + options.loadMode(file, function() { ensureDeps(mode, cont, options) }) + } else if (env == "plain") { + var script = document.createElement("script"); + script.src = file; + var others = document.getElementsByTagName("script")[0]; + var list = loading[mode] = [cont]; + CodeMirror.on(script, "load", function() { + ensureDeps(mode, function() { + for (var i = 0; i < list.length; ++i) list[i](); + }, options); + }); + others.parentNode.insertBefore(script, others); + } else if (env == "cjs") { + require(file); + cont(); + } else if (env == "amd") { + requirejs([file], cont); + } + }; + + CodeMirror.autoLoadMode = function(instance, mode, options) { + if (!CodeMirror.modes.hasOwnProperty(mode)) + CodeMirror.requireMode(mode, function() { + instance.setOption("mode", instance.getOption("mode")); + }, options); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex.js new file mode 100644 index 0000000000..6140bc4f96 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex.js @@ -0,0 +1,136 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.multiplexingMode = function(outer /*, others */) { + // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects + var others = Array.prototype.slice.call(arguments, 1); + + function indexOf(string, pattern, from, returnEnd) { + if (typeof pattern == "string") { + var found = string.indexOf(pattern, from); + return returnEnd && found > -1 ? found + pattern.length : found; + } + var m = pattern.exec(from ? string.slice(from) : string); + return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1; + } + + return { + startState: function() { + return { + outer: CodeMirror.startState(outer), + innerActive: null, + inner: null, + startingInner: false + }; + }, + + copyState: function(state) { + return { + outer: CodeMirror.copyState(outer, state.outer), + innerActive: state.innerActive, + inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner), + startingInner: state.startingInner + }; + }, + + token: function(stream, state) { + if (!state.innerActive) { + var cutOff = Infinity, oldContent = stream.string; + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + var found = indexOf(oldContent, other.open, stream.pos); + if (found == stream.pos) { + if (!other.parseDelimiters) stream.match(other.open); + state.startingInner = !!other.parseDelimiters + state.innerActive = other; + + // Get the outer indent, making sure to handle CodeMirror.Pass + var outerIndent = 0; + if (outer.indent) { + var possibleOuterIndent = outer.indent(state.outer, "", ""); + if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent; + } + + state.inner = CodeMirror.startState(other.mode, outerIndent); + return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open"); + } else if (found != -1 && found < cutOff) { + cutOff = found; + } + } + if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); + var outerToken = outer.token(stream, state.outer); + if (cutOff != Infinity) stream.string = oldContent; + return outerToken; + } else { + var curInner = state.innerActive, oldContent = stream.string; + if (!curInner.close && stream.sol()) { + state.innerActive = state.inner = null; + return this.token(stream, state); + } + var found = curInner.close && !state.startingInner ? + indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1; + if (found == stream.pos && !curInner.parseDelimiters) { + stream.match(curInner.close); + state.innerActive = state.inner = null; + return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close"); + } + if (found > -1) stream.string = oldContent.slice(0, found); + var innerToken = curInner.mode.token(stream, state.inner); + if (found > -1) stream.string = oldContent; + else if (stream.pos > stream.start) state.startingInner = false + + if (found == stream.pos && curInner.parseDelimiters) + state.innerActive = state.inner = null; + + if (curInner.innerStyle) { + if (innerToken) innerToken = innerToken + " " + curInner.innerStyle; + else innerToken = curInner.innerStyle; + } + + return innerToken; + } + }, + + indent: function(state, textAfter, line) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (!mode.indent) return CodeMirror.Pass; + return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line); + }, + + blankLine: function(state) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (mode.blankLine) { + mode.blankLine(state.innerActive ? state.inner : state.outer); + } + if (!state.innerActive) { + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + if (other.open === "\n") { + state.innerActive = other; + state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "", "") : 0); + } + } + } else if (state.innerActive.close === "\n") { + state.innerActive = state.inner = null; + } + }, + + electricChars: outer.electricChars, + + innerMode: function(state) { + return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; + } + }; +}; + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex_test.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex_test.js new file mode 100644 index 0000000000..8503988672 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/multiplex_test.js @@ -0,0 +1,49 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + CodeMirror.defineMode("markdown_with_stex", function(){ + var inner = CodeMirror.getMode({}, "stex"); + var outer = CodeMirror.getMode({}, "markdown"); + + var innerOptions = { + open: '$', + close: '$', + mode: inner, + delimStyle: 'delim', + innerStyle: 'inner' + }; + + return CodeMirror.multiplexingMode(outer, innerOptions); + }); + + var mode = CodeMirror.getMode({}, "markdown_with_stex"); + + function MT(name) { + test.mode( + name, + mode, + Array.prototype.slice.call(arguments, 1), + 'multiplexing'); + } + + MT( + "stexInsideMarkdown", + "[strong **Equation:**] [delim&delim-open $][inner&tag \\pi][delim&delim-close $]"); + + CodeMirror.defineMode("identical_delim_multiplex", function() { + return CodeMirror.multiplexingMode(CodeMirror.getMode({indentUnit: 2}, "javascript"), { + open: "#", + close: "#", + mode: CodeMirror.getMode({}, "markdown"), + parseDelimiters: true, + innerStyle: "q" + }); + }); + + var mode2 = CodeMirror.getMode({}, "identical_delim_multiplex"); + + test.mode("identical_delimiters_with_parseDelimiters", mode2, [ + "[keyword let] [def x] [operator =] [q #foo][q&em *bar*][q #];" + ], "multiplexing") +})(); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/overlay.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/overlay.js new file mode 100644 index 0000000000..016e3c28cc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/overlay.js @@ -0,0 +1,90 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Utility function that allows modes to be combined. The mode given +// as the base argument takes care of most of the normal mode +// functionality, but a second (typically simple) mode is used, which +// can override the style of text. Both modes get to parse all of the +// text, but when both assign a non-null style to a piece of code, the +// overlay wins, unless the combine argument was true and not overridden, +// or state.overlay.combineTokens was true, in which case the styles are +// combined. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.overlayMode = function(base, overlay, combine) { + return { + startState: function() { + return { + base: CodeMirror.startState(base), + overlay: CodeMirror.startState(overlay), + basePos: 0, baseCur: null, + overlayPos: 0, overlayCur: null, + streamSeen: null + }; + }, + copyState: function(state) { + return { + base: CodeMirror.copyState(base, state.base), + overlay: CodeMirror.copyState(overlay, state.overlay), + basePos: state.basePos, baseCur: null, + overlayPos: state.overlayPos, overlayCur: null + }; + }, + + token: function(stream, state) { + if (stream != state.streamSeen || + Math.min(state.basePos, state.overlayPos) < stream.start) { + state.streamSeen = stream; + state.basePos = state.overlayPos = stream.start; + } + + if (stream.start == state.basePos) { + state.baseCur = base.token(stream, state.base); + state.basePos = stream.pos; + } + if (stream.start == state.overlayPos) { + stream.pos = stream.start; + state.overlayCur = overlay.token(stream, state.overlay); + state.overlayPos = stream.pos; + } + stream.pos = Math.min(state.basePos, state.overlayPos); + + // state.overlay.combineTokens always takes precedence over combine, + // unless set to null + if (state.overlayCur == null) return state.baseCur; + else if (state.baseCur != null && + state.overlay.combineTokens || + combine && state.overlay.combineTokens == null) + return state.baseCur + " " + state.overlayCur; + else return state.overlayCur; + }, + + indent: base.indent && function(state, textAfter, line) { + return base.indent(state.base, textAfter, line); + }, + electricChars: base.electricChars, + + innerMode: function(state) { return {state: state.base, mode: base}; }, + + blankLine: function(state) { + var baseToken, overlayToken; + if (base.blankLine) baseToken = base.blankLine(state.base); + if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay); + + return overlayToken == null ? + baseToken : + (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken); + } + }; +}; + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/simple.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/simple.js new file mode 100644 index 0000000000..0d8cbdebd8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/mode/simple.js @@ -0,0 +1,216 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode = function(name, states) { + CodeMirror.defineMode(name, function(config) { + return CodeMirror.simpleMode(config, states); + }); + }; + + CodeMirror.simpleMode = function(config, states) { + ensureState(states, "start"); + var states_ = {}, meta = states.meta || {}, hasIndentation = false; + for (var state in states) if (state != meta && states.hasOwnProperty(state)) { + var list = states_[state] = [], orig = states[state]; + for (var i = 0; i < orig.length; i++) { + var data = orig[i]; + list.push(new Rule(data, states)); + if (data.indent || data.dedent) hasIndentation = true; + } + } + var mode = { + startState: function() { + return {state: "start", pending: null, + local: null, localState: null, + indent: hasIndentation ? [] : null}; + }, + copyState: function(state) { + var s = {state: state.state, pending: state.pending, + local: state.local, localState: null, + indent: state.indent && state.indent.slice(0)}; + if (state.localState) + s.localState = CodeMirror.copyState(state.local.mode, state.localState); + if (state.stack) + s.stack = state.stack.slice(0); + for (var pers = state.persistentStates; pers; pers = pers.next) + s.persistentStates = {mode: pers.mode, + spec: pers.spec, + state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), + next: s.persistentStates}; + return s; + }, + token: tokenFunction(states_, config), + innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, + indent: indentFunction(states_, meta) + }; + if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) + mode[prop] = meta[prop]; + return mode; + }; + + function ensureState(states, name) { + if (!states.hasOwnProperty(name)) + throw new Error("Undefined state " + name + " in simple mode"); + } + + function toRegex(val, caret) { + if (!val) return /(?:)/; + var flags = ""; + if (val instanceof RegExp) { + if (val.ignoreCase) flags = "i"; + if (val.unicode) flags += "u" + val = val.source; + } else { + val = String(val); + } + return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); + } + + function asToken(val) { + if (!val) return null; + if (val.apply) return val + if (typeof val == "string") return val.replace(/\./g, " "); + var result = []; + for (var i = 0; i < val.length; i++) + result.push(val[i] && val[i].replace(/\./g, " ")); + return result; + } + + function Rule(data, states) { + if (data.next || data.push) ensureState(states, data.next || data.push); + this.regex = toRegex(data.regex); + this.token = asToken(data.token); + this.data = data; + } + + function tokenFunction(states, config) { + return function(stream, state) { + if (state.pending) { + var pend = state.pending.shift(); + if (state.pending.length == 0) state.pending = null; + stream.pos += pend.text.length; + return pend.token; + } + + if (state.local) { + if (state.local.end && stream.match(state.local.end)) { + var tok = state.local.endToken || null; + state.local = state.localState = null; + return tok; + } else { + var tok = state.local.mode.token(stream, state.localState), m; + if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) + stream.pos = stream.start + m.index; + return tok; + } + } + + var curState = states[state.state]; + for (var i = 0; i < curState.length; i++) { + var rule = curState[i]; + var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); + if (matches) { + if (rule.data.next) { + state.state = rule.data.next; + } else if (rule.data.push) { + (state.stack || (state.stack = [])).push(state.state); + state.state = rule.data.push; + } else if (rule.data.pop && state.stack && state.stack.length) { + state.state = state.stack.pop(); + } + + if (rule.data.mode) + enterLocalMode(config, state, rule.data.mode, rule.token); + if (rule.data.indent) + state.indent.push(stream.indentation() + config.indentUnit); + if (rule.data.dedent) + state.indent.pop(); + var token = rule.token + if (token && token.apply) token = token(matches) + if (matches.length > 2 && rule.token && typeof rule.token != "string") { + for (var j = 2; j < matches.length; j++) + if (matches[j]) + (state.pending || (state.pending = [])).push({text: matches[j], token: rule.token[j - 1]}); + stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); + return token[0]; + } else if (token && token.join) { + return token[0]; + } else { + return token; + } + } + } + stream.next(); + return null; + }; + } + + function cmp(a, b) { + if (a === b) return true; + if (!a || typeof a != "object" || !b || typeof b != "object") return false; + var props = 0; + for (var prop in a) if (a.hasOwnProperty(prop)) { + if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; + props++; + } + for (var prop in b) if (b.hasOwnProperty(prop)) props--; + return props == 0; + } + + function enterLocalMode(config, state, spec, token) { + var pers; + if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) + if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; + var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); + var lState = pers ? pers.state : CodeMirror.startState(mode); + if (spec.persistent && !pers) + state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; + + state.localState = lState; + state.local = {mode: mode, + end: spec.end && toRegex(spec.end), + endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), + endToken: token && token.join ? token[token.length - 1] : token}; + } + + function indexOf(val, arr) { + for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; + } + + function indentFunction(states, meta) { + return function(state, textAfter, line) { + if (state.local && state.local.mode.indent) + return state.local.mode.indent(state.localState, textAfter, line); + if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) + return CodeMirror.Pass; + + var pos = state.indent.length - 1, rules = states[state.state]; + scan: for (;;) { + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { + var m = rule.regex.exec(textAfter); + if (m && m[0]) { + pos--; + if (rule.next || rule.push) rules = states[rule.next || rule.push]; + textAfter = textAfter.slice(m[0].length); + continue scan; + } + } + } + break; + } + return pos < 0 ? 0 : state.indent[pos]; + }; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/colorize.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/colorize.js new file mode 100644 index 0000000000..3be5411506 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/colorize.js @@ -0,0 +1,40 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./runmode")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./runmode"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; + + function textContent(node, out) { + if (node.nodeType == 3) return out.push(node.nodeValue); + for (var ch = node.firstChild; ch; ch = ch.nextSibling) { + textContent(ch, out); + if (isBlock.test(node.nodeType)) out.push("\n"); + } + } + + CodeMirror.colorize = function(collection, defaultMode) { + if (!collection) collection = document.body.getElementsByTagName("pre"); + + for (var i = 0; i < collection.length; ++i) { + var node = collection[i]; + var mode = node.getAttribute("data-lang") || defaultMode; + if (!mode) continue; + + var text = []; + textContent(node, text); + node.innerHTML = ""; + CodeMirror.runMode(text.join(""), mode, node); + + node.className += " cm-s-default"; + } + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode-standalone.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode-standalone.js new file mode 100644 index 0000000000..76cf3d758d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode-standalone.js @@ -0,0 +1,334 @@ +(function () { + 'use strict'; + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + var modeMethods = { + __proto__: null, + modes: modes, + mimeModes: mimeModes, + defineMode: defineMode, + defineMIME: defineMIME, + resolveMode: resolveMode, + getMode: getMode, + modeExtensions: modeExtensions, + extendMode: extendMode, + copyState: copyState, + innerMode: innerMode, + startState: startState + }; + + // declare global: globalThis, CodeMirror + + // Create a minimal CodeMirror needed to use runMode, and assign to root. + var root = typeof globalThis !== 'undefined' ? globalThis : window; + root.CodeMirror = {}; + + // Copy StringStream and mode methods into CodeMirror object. + CodeMirror.StringStream = StringStream; + for (var exported in modeMethods) { CodeMirror[exported] = modeMethods[exported]; } + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min; + CodeMirror.splitLines = function(string) { return string.split(/\r?\n|\r/) }; + CodeMirror.countColumn = countColumn; + + CodeMirror.defaults = { indentUnit: 2 }; + + // CodeMirror, copyright (c) by Marijn Haverbeke and others + // Distributed under an MIT license: https://codemirror.net/LICENSE + + (function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + { mod(require("../../lib/codemirror")); } + else if (typeof define == "function" && define.amd) // AMD + { define(["../../lib/codemirror"], mod); } + else // Plain browser env + { mod(CodeMirror); } + })(function(CodeMirror) { + + CodeMirror.runMode = function(string, modespec, callback, options) { + var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); + var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; + + // Create a tokenizing callback function if passed-in callback is a DOM element. + if (callback.appendChild) { + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + var node = callback, col = 0; + node.innerHTML = ""; + callback = function(text, style) { + if (text == "\n") { + // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. + // Emitting a carriage return makes everything ok. + node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); + col = 0; + return; + } + var content = ""; + // replace tabs + for (var pos = 0;;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) { content += " "; } + pos = idx + 1; + } + } + // Create a node with token style and append it to the callback DOM element. + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + + var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) { callback("\n"); } + var stream = new CodeMirror.StringStream(lines[i], null, { + lookAhead: function(n) { return lines[i + n] }, + baseToken: function() {} + }); + if (!stream.string && mode.blankLine) { mode.blankLine(state); } + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state, mode); + stream.start = stream.pos; + } + } + }; + + }); + +}()); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.js new file mode 100644 index 0000000000..f5d58e2428 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.js @@ -0,0 +1,76 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.runMode = function(string, modespec, callback, options) { + var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); + var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; + + // Create a tokenizing callback function if passed-in callback is a DOM element. + if (callback.appendChild) { + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + var node = callback, col = 0; + node.innerHTML = ""; + callback = function(text, style) { + if (text == "\n") { + // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. + // Emitting a carriage return makes everything ok. + node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); + col = 0; + return; + } + var content = ""; + // replace tabs + for (var pos = 0;;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) content += " "; + pos = idx + 1; + } + } + // Create a node with token style and append it to the callback DOM element. + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + + var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) callback("\n"); + var stream = new CodeMirror.StringStream(lines[i], null, { + lookAhead: function(n) { return lines[i + n] }, + baseToken: function() {} + }); + if (!stream.string && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state, mode); + stream.start = stream.pos; + } + } +}; + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.node.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.node.js new file mode 100644 index 0000000000..ddd255ab41 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/runmode/runmode.node.js @@ -0,0 +1,329 @@ +'use strict'; + +function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target +} + +// Counts the column offset in a string, taking tabs into account. +// Used mostly to find indentation. +function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } +} + +function nothing() {} + +function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst +} + +// STRING STREAM + +// Fed to the mode parsers, provides helper functions to make +// parsers more succinct. + +var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; +}; + +StringStream.prototype.eol = function () {return this.pos >= this.string.length}; +StringStream.prototype.sol = function () {return this.pos == this.lineStart}; +StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; +StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } +}; +StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} +}; +StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start +}; +StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start +}; +StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; +StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} +}; +StringStream.prototype.backUp = function (n) {this.pos -= n;}; +StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } +}; +StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; +StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } +}; +StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) +}; +StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) +}; + +// Known modes, by name and by MIME +var modes = {}, mimeModes = {}; + +// Extra arguments are stored as the mode's dependencies, which is +// used by (legacy) mechanisms like loadmode.js to automatically +// load a mode. (Preferred mechanism is the require/define calls.) +function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; +} + +function defineMIME(mime, spec) { + mimeModes[mime] = spec; +} + +// Given a MIME type, a {name, ...options} config object, or a name +// string, return a mode config object. +function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } +} + +// Given a mode spec (anything that resolveMode accepts), find and +// initialize an actual mode object. +function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj +} + +// This can be used to attach properties to mode objects from +// outside the actual mode definition. +var modeExtensions = {}; +function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); +} + +function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate +} + +// Given a mode and a state (for that mode), find the inner mode and +// state at the position that the state refers to. +function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} +} + +function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true +} + +var modeMethods = { + __proto__: null, + modes: modes, + mimeModes: mimeModes, + defineMode: defineMode, + defineMIME: defineMIME, + resolveMode: resolveMode, + getMode: getMode, + modeExtensions: modeExtensions, + extendMode: extendMode, + copyState: copyState, + innerMode: innerMode, + startState: startState +}; + +// Copy StringStream and mode methods into exports (CodeMirror) object. +exports.StringStream = StringStream; +exports.countColumn = countColumn; +for (var exported in modeMethods) { exports[exported] = modeMethods[exported]; } + +// Shim library CodeMirror with the minimal CodeMirror defined above. +require.cache[require.resolve("../../lib/codemirror")] = require.cache[require.resolve("./runmode.node")]; +require.cache[require.resolve("../../addon/runmode/runmode")] = require.cache[require.resolve("./runmode.node")]; + +// Minimal default mode. +exports.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); +exports.defineMIME("text/plain", "null"); + +exports.registerHelper = exports.registerGlobalHelper = Math.min; +exports.splitLines = function(string) { return string.split(/\r?\n|\r/) }; + +exports.defaults = { indentUnit: 2 }; + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + { mod(require("../../lib/codemirror")); } + else if (typeof define == "function" && define.amd) // AMD + { define(["../../lib/codemirror"], mod); } + else // Plain browser env + { mod(CodeMirror); } +})(function(CodeMirror) { + +CodeMirror.runMode = function(string, modespec, callback, options) { + var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); + var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; + + // Create a tokenizing callback function if passed-in callback is a DOM element. + if (callback.appendChild) { + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + var node = callback, col = 0; + node.innerHTML = ""; + callback = function(text, style) { + if (text == "\n") { + // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. + // Emitting a carriage return makes everything ok. + node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); + col = 0; + return; + } + var content = ""; + // replace tabs + for (var pos = 0;;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) { content += " "; } + pos = idx + 1; + } + } + // Create a node with token style and append it to the callback DOM element. + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + + var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) { callback("\n"); } + var stream = new CodeMirror.StringStream(lines[i], null, { + lookAhead: function(n) { return lines[i + n] }, + baseToken: function() {} + }); + if (!stream.string && mode.blankLine) { mode.blankLine(state); } + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state, mode); + stream.start = stream.pos; + } + } +}; + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/annotatescrollbar.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/annotatescrollbar.js new file mode 100644 index 0000000000..c12e44cda5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/annotatescrollbar.js @@ -0,0 +1,128 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineExtension("annotateScrollbar", function(options) { + if (typeof options == "string") options = {className: options}; + return new Annotation(this, options); + }); + + CodeMirror.defineOption("scrollButtonHeight", 0); + + function Annotation(cm, options) { + this.cm = cm; + this.options = options; + this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight"); + this.annotations = []; + this.doRedraw = this.doUpdate = null; + this.div = cm.getWrapperElement().appendChild(document.createElement("div")); + this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none"; + this.computeScale(); + + function scheduleRedraw(delay) { + clearTimeout(self.doRedraw); + self.doRedraw = setTimeout(function() { self.redraw(); }, delay); + } + + var self = this; + cm.on("refresh", this.resizeHandler = function() { + clearTimeout(self.doUpdate); + self.doUpdate = setTimeout(function() { + if (self.computeScale()) scheduleRedraw(20); + }, 100); + }); + cm.on("markerAdded", this.resizeHandler); + cm.on("markerCleared", this.resizeHandler); + if (options.listenForChanges !== false) + cm.on("changes", this.changeHandler = function() { + scheduleRedraw(250); + }); + } + + Annotation.prototype.computeScale = function() { + var cm = this.cm; + var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) / + cm.getScrollerElement().scrollHeight + if (hScale != this.hScale) { + this.hScale = hScale; + return true; + } + }; + + Annotation.prototype.update = function(annotations) { + this.annotations = annotations; + this.redraw(); + }; + + Annotation.prototype.redraw = function(compute) { + if (compute !== false) this.computeScale(); + var cm = this.cm, hScale = this.hScale; + + var frag = document.createDocumentFragment(), anns = this.annotations; + + var wrapping = cm.getOption("lineWrapping"); + var singleLineH = wrapping && cm.defaultTextHeight() * 1.5; + var curLine = null, curLineObj = null; + + function getY(pos, top) { + if (curLine != pos.line) { + curLine = pos.line + curLineObj = cm.getLineHandle(pos.line) + var visual = cm.getLineHandleVisualStart(curLineObj) + if (visual != curLineObj) { + curLine = cm.getLineNumber(visual) + curLineObj = visual + } + } + if ((curLineObj.widgets && curLineObj.widgets.length) || + (wrapping && curLineObj.height > singleLineH)) + return cm.charCoords(pos, "local")[top ? "top" : "bottom"]; + var topY = cm.heightAtLine(curLineObj, "local"); + return topY + (top ? 0 : curLineObj.height); + } + + var lastLine = cm.lastLine() + if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) { + var ann = anns[i]; + if (ann.to.line > lastLine) continue; + var top = nextTop || getY(ann.from, true) * hScale; + var bottom = getY(ann.to, false) * hScale; + while (i < anns.length - 1) { + if (anns[i + 1].to.line > lastLine) break; + nextTop = getY(anns[i + 1].from, true) * hScale; + if (nextTop > bottom + .9) break; + ann = anns[++i]; + bottom = getY(ann.to, false) * hScale; + } + if (bottom == top) continue; + var height = Math.max(bottom - top, 3); + + var elt = frag.appendChild(document.createElement("div")); + elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + + (top + this.buttonHeight) + "px; height: " + height + "px"; + elt.className = this.options.className; + if (ann.id) { + elt.setAttribute("annotation-id", ann.id); + } + } + this.div.textContent = ""; + this.div.appendChild(frag); + }; + + Annotation.prototype.clear = function() { + this.cm.off("refresh", this.resizeHandler); + this.cm.off("markerAdded", this.resizeHandler); + this.cm.off("markerCleared", this.resizeHandler); + if (this.changeHandler) this.cm.off("changes", this.changeHandler); + this.div.parentNode.removeChild(this.div); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/scrollpastend.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/scrollpastend.js new file mode 100644 index 0000000000..2ed9d95e84 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/scrollpastend.js @@ -0,0 +1,48 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("change", onChange); + cm.off("refresh", updateBottomMargin); + cm.display.lineSpace.parentNode.style.paddingBottom = ""; + cm.state.scrollPastEndPadding = null; + } + if (val) { + cm.on("change", onChange); + cm.on("refresh", updateBottomMargin); + updateBottomMargin(cm); + } + }); + + function onChange(cm, change) { + if (CodeMirror.changeEnd(change).line == cm.lastLine()) + updateBottomMargin(cm); + } + + function updateBottomMargin(cm) { + var padding = ""; + if (cm.lineCount() > 1) { + var totalH = cm.display.scroller.clientHeight - 30, + lastLineH = cm.getLineHandle(cm.lastLine()).height; + padding = (totalH - lastLineH) + "px"; + } + if (cm.state.scrollPastEndPadding != padding) { + cm.state.scrollPastEndPadding = padding; + cm.display.lineSpace.parentNode.style.paddingBottom = padding; + cm.off("refresh", updateBottomMargin); + cm.setSize(); + cm.on("refresh", updateBottomMargin); + } + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.css new file mode 100644 index 0000000000..5eea7aa1b3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.css @@ -0,0 +1,66 @@ +.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { + position: absolute; + background: #ccc; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #bbb; + border-radius: 2px; +} + +.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { + position: absolute; + z-index: 6; + background: #eee; +} + +.CodeMirror-simplescroll-horizontal { + bottom: 0; left: 0; + height: 8px; +} +.CodeMirror-simplescroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-simplescroll-vertical { + right: 0; top: 0; + width: 8px; +} +.CodeMirror-simplescroll-vertical div { + right: 0; + width: 100%; +} + + +.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { + display: none; +} + +.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + position: absolute; + background: #bcd; + border-radius: 3px; +} + +.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { + position: absolute; + z-index: 6; +} + +.CodeMirror-overlayscroll-horizontal { + bottom: 0; left: 0; + height: 6px; +} +.CodeMirror-overlayscroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-overlayscroll-vertical { + right: 0; top: 0; + width: 6px; +} +.CodeMirror-overlayscroll-vertical div { + right: 0; + width: 100%; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.js new file mode 100644 index 0000000000..750a2bd399 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/scroll/simplescrollbars.js @@ -0,0 +1,152 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function Bar(cls, orientation, scroll) { + this.orientation = orientation; + this.scroll = scroll; + this.screen = this.total = this.size = 1; + this.pos = 0; + + this.node = document.createElement("div"); + this.node.className = cls + "-" + orientation; + this.inner = this.node.appendChild(document.createElement("div")); + + var self = this; + CodeMirror.on(this.inner, "mousedown", function(e) { + if (e.which != 1) return; + CodeMirror.e_preventDefault(e); + var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; + var start = e[axis], startpos = self.pos; + function done() { + CodeMirror.off(document, "mousemove", move); + CodeMirror.off(document, "mouseup", done); + } + function move(e) { + if (e.which != 1) return done(); + self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); + } + CodeMirror.on(document, "mousemove", move); + CodeMirror.on(document, "mouseup", done); + }); + + CodeMirror.on(this.node, "click", function(e) { + CodeMirror.e_preventDefault(e); + var innerBox = self.inner.getBoundingClientRect(), where; + if (self.orientation == "horizontal") + where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; + else + where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; + self.moveTo(self.pos + where * self.screen); + }); + + function onWheel(e) { + var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; + var oldPos = self.pos; + self.moveTo(self.pos + moved); + if (self.pos != oldPos) CodeMirror.e_preventDefault(e); + } + CodeMirror.on(this.node, "mousewheel", onWheel); + CodeMirror.on(this.node, "DOMMouseScroll", onWheel); + } + + Bar.prototype.setPos = function(pos, force) { + if (pos < 0) pos = 0; + if (pos > this.total - this.screen) pos = this.total - this.screen; + if (!force && pos == this.pos) return false; + this.pos = pos; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = + (pos * (this.size / this.total)) + "px"; + return true + }; + + Bar.prototype.moveTo = function(pos) { + if (this.setPos(pos)) this.scroll(pos, this.orientation); + } + + var minButtonSize = 10; + + Bar.prototype.update = function(scrollSize, clientSize, barSize) { + var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize + if (sizeChanged) { + this.screen = clientSize; + this.total = scrollSize; + this.size = barSize; + } + + var buttonSize = this.screen * (this.size / this.total); + if (buttonSize < minButtonSize) { + this.size -= minButtonSize - buttonSize; + buttonSize = minButtonSize; + } + this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = + buttonSize + "px"; + this.setPos(this.pos, sizeChanged); + }; + + function SimpleScrollbars(cls, place, scroll) { + this.addClass = cls; + this.horiz = new Bar(cls, "horizontal", scroll); + place(this.horiz.node); + this.vert = new Bar(cls, "vertical", scroll); + place(this.vert.node); + this.width = null; + } + + SimpleScrollbars.prototype.update = function(measure) { + if (this.width == null) { + var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; + if (style) this.width = parseInt(style.height); + } + var width = this.width || 0; + + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + this.vert.node.style.display = needsV ? "block" : "none"; + this.horiz.node.style.display = needsH ? "block" : "none"; + + if (needsV) { + this.vert.update(measure.scrollHeight, measure.clientHeight, + measure.viewHeight - (needsH ? width : 0)); + this.vert.node.style.bottom = needsH ? width + "px" : "0"; + } + if (needsH) { + this.horiz.update(measure.scrollWidth, measure.clientWidth, + measure.viewWidth - (needsV ? width : 0) - measure.barLeft); + this.horiz.node.style.right = needsV ? width + "px" : "0"; + this.horiz.node.style.left = measure.barLeft + "px"; + } + + return {right: needsV ? width : 0, bottom: needsH ? width : 0}; + }; + + SimpleScrollbars.prototype.setScrollTop = function(pos) { + this.vert.setPos(pos); + }; + + SimpleScrollbars.prototype.setScrollLeft = function(pos) { + this.horiz.setPos(pos); + }; + + SimpleScrollbars.prototype.clear = function() { + var parent = this.horiz.node.parentNode; + parent.removeChild(this.horiz.node); + parent.removeChild(this.vert.node); + }; + + CodeMirror.scrollbarModel.simple = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); + }; + CodeMirror.scrollbarModel.overlay = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/jump-to-line.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/jump-to-line.js new file mode 100644 index 0000000000..990c235ef1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/jump-to-line.js @@ -0,0 +1,53 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Defines jumpToLine command. Uses dialog.js if present. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + // default search panel location + CodeMirror.defineOption("search", {bottom: false}); + + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom}); + else f(prompt(shortText, deflt)); + } + + function getJumpDialog(cm) { + return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ''; + } + + function interpretLine(cm, string) { + var num = Number(string) + if (/^[-+]/.test(string)) return cm.getCursor().line + num + else return num - 1 + } + + CodeMirror.commands.jumpToLine = function(cm) { + var cur = cm.getCursor(); + dialog(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), (cur.line + 1) + ":" + cur.ch, function(posStr) { + if (!posStr) return; + + var match; + if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), Number(match[2])) + } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { + var line = Math.round(cm.lineCount() * Number(match[1]) / 100); + if (/^[-+]/.test(match[1])) line = cur.line + line + 1; + cm.setCursor(line - 1, cur.ch); + } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), cur.ch); + } + }); + }; + + CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js new file mode 100644 index 0000000000..9b181ebc01 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js @@ -0,0 +1,167 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Highlighting text that matches the selection +// +// Defines an option highlightSelectionMatches, which, when enabled, +// will style strings that match the selection throughout the +// document. +// +// The option can be set to true to simply enable it, or to a +// {minChars, style, wordsOnly, showToken, delay} object to explicitly +// configure it. minChars is the minimum amount of characters that should be +// selected for the behavior to occur, and style is the token style to +// apply to the matches. This will be prefixed by "cm-" to create an +// actual CSS class name. If wordsOnly is enabled, the matches will be +// highlighted only if the selected text is a word. showToken, when enabled, +// will cause the current token to be highlighted when nothing is selected. +// delay is used to specify how much time to wait, in milliseconds, before +// highlighting the matches. If annotateScrollbar is enabled, the occurrences +// will be highlighted on the scrollbar via the matchesonscrollbar addon. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./matchesonscrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./matchesonscrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaults = { + style: "matchhighlight", + minChars: 2, + delay: 100, + wordsOnly: false, + annotateScrollbar: false, + showToken: false, + trim: true + } + + function State(options) { + this.options = {} + for (var name in defaults) + this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name] + this.overlay = this.timeout = null; + this.matchesonscroll = null; + this.active = false; + } + + CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + removeOverlay(cm); + clearTimeout(cm.state.matchHighlighter.timeout); + cm.state.matchHighlighter = null; + cm.off("cursorActivity", cursorActivity); + cm.off("focus", onFocus) + } + if (val) { + var state = cm.state.matchHighlighter = new State(val); + if (cm.hasFocus()) { + state.active = true + highlightMatches(cm) + } else { + cm.on("focus", onFocus) + } + cm.on("cursorActivity", cursorActivity); + } + }); + + function cursorActivity(cm) { + var state = cm.state.matchHighlighter; + if (state.active || cm.hasFocus()) scheduleHighlight(cm, state) + } + + function onFocus(cm) { + var state = cm.state.matchHighlighter + if (!state.active) { + state.active = true + scheduleHighlight(cm, state) + } + } + + function scheduleHighlight(cm, state) { + clearTimeout(state.timeout); + state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay); + } + + function addOverlay(cm, query, hasBoundary, style) { + var state = cm.state.matchHighlighter; + cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style)); + if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) { + var searchFor = hasBoundary ? new RegExp((/\w/.test(query.charAt(0)) ? "\\b" : "") + + query.replace(/[\\\[.+*?(){|^$]/g, "\\$&") + + (/\w/.test(query.charAt(query.length - 1)) ? "\\b" : "")) : query; + state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false, + {className: "CodeMirror-selection-highlight-scrollbar"}); + } + } + + function removeOverlay(cm) { + var state = cm.state.matchHighlighter; + if (state.overlay) { + cm.removeOverlay(state.overlay); + state.overlay = null; + if (state.matchesonscroll) { + state.matchesonscroll.clear(); + state.matchesonscroll = null; + } + } + } + + function highlightMatches(cm) { + cm.operation(function() { + var state = cm.state.matchHighlighter; + removeOverlay(cm); + if (!cm.somethingSelected() && state.options.showToken) { + var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken; + var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; + while (start && re.test(line.charAt(start - 1))) --start; + while (end < line.length && re.test(line.charAt(end))) ++end; + if (start < end) + addOverlay(cm, line.slice(start, end), re, state.options.style); + return; + } + var from = cm.getCursor("from"), to = cm.getCursor("to"); + if (from.line != to.line) return; + if (state.options.wordsOnly && !isWord(cm, from, to)) return; + var selection = cm.getRange(from, to) + if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "") + if (selection.length >= state.options.minChars) + addOverlay(cm, selection, false, state.options.style); + }); + } + + function isWord(cm, from, to) { + var str = cm.getRange(from, to); + if (str.match(/^\w+$/) !== null) { + if (from.ch > 0) { + var pos = {line: from.line, ch: from.ch - 1}; + var chr = cm.getRange(pos, from); + if (chr.match(/\W/) === null) return false; + } + if (to.ch < cm.getLine(from.line).length) { + var pos = {line: to.line, ch: to.ch + 1}; + var chr = cm.getRange(to, pos); + if (chr.match(/\W/) === null) return false; + } + return true; + } else return false; + } + + function boundariesAround(stream, re) { + return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && + (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); + } + + function makeOverlay(query, hasBoundary, style) { + return {token: function(stream) { + if (stream.match(query) && + (!hasBoundary || boundariesAround(stream, hasBoundary))) + return style; + stream.next(); + stream.skipTo(query.charAt(0)) || stream.skipToEnd(); + }}; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css new file mode 100644 index 0000000000..77932cc908 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css @@ -0,0 +1,8 @@ +.CodeMirror-search-match { + background: gold; + border-top: 1px solid orange; + border-bottom: 1px solid orange; + -moz-box-sizing: border-box; + box-sizing: border-box; + opacity: .5; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js new file mode 100644 index 0000000000..8a4a827584 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js @@ -0,0 +1,97 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { + if (typeof options == "string") options = {className: options}; + if (!options) options = {}; + return new SearchAnnotation(this, query, caseFold, options); + }); + + function SearchAnnotation(cm, query, caseFold, options) { + this.cm = cm; + this.options = options; + var annotateOptions = {listenForChanges: false}; + for (var prop in options) annotateOptions[prop] = options[prop]; + if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; + this.annotation = cm.annotateScrollbar(annotateOptions); + this.query = query; + this.caseFold = caseFold; + this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; + this.matches = []; + this.update = null; + + this.findMatches(); + this.annotation.update(this.matches); + + var self = this; + cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); + } + + var MAX_MATCHES = 1000; + + SearchAnnotation.prototype.findMatches = function() { + if (!this.gap) return; + for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + if (match.from.line >= this.gap.to) break; + if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); + } + var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline}); + var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES; + while (cursor.findNext()) { + var match = {from: cursor.from(), to: cursor.to()}; + if (match.from.line >= this.gap.to) break; + this.matches.splice(i++, 0, match); + if (this.matches.length > maxMatches) break; + } + this.gap = null; + }; + + function offsetLine(line, changeStart, sizeChange) { + if (line <= changeStart) return line; + return Math.max(changeStart, line + sizeChange); + } + + SearchAnnotation.prototype.onChange = function(change) { + var startLine = change.from.line; + var endLine = CodeMirror.changeEnd(change).line; + var sizeChange = endLine - change.to.line; + if (this.gap) { + this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); + this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); + } else { + this.gap = {from: change.from.line, to: endLine + 1}; + } + + if (sizeChange) for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + var newFrom = offsetLine(match.from.line, startLine, sizeChange); + if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); + var newTo = offsetLine(match.to.line, startLine, sizeChange); + if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); + } + clearTimeout(this.update); + var self = this; + this.update = setTimeout(function() { self.updateAfterChange(); }, 250); + }; + + SearchAnnotation.prototype.updateAfterChange = function() { + this.findMatches(); + this.annotation.update(this.matches); + }; + + SearchAnnotation.prototype.clear = function() { + this.cm.off("change", this.changeHandler); + this.annotation.clear(); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js new file mode 100644 index 0000000000..24a0855e9e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js @@ -0,0 +1,292 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Define search commands. Depends on dialog.js or another +// implementation of the openDialog method. + +// Replace works a little oddly -- it will do the replace on the next +// Ctrl-G (or whatever is bound to findNext) press. You prevent a +// replace by making sure the match is no longer selected when hitting +// Ctrl-G. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + // default search panel location + CodeMirror.defineOption("search", {bottom: false}); + + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") + query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); + else if (!query.global) + query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + + return {token: function(stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length || 1; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + }}; + } + + function SearchState() { + this.posFrom = this.posTo = this.lastQuery = this.query = null; + this.overlay = null; + } + + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + + function getSearchCursor(cm, query, pos) { + // Heuristic: if the query string is all lowercase, do a case insensitive search. + return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true}); + } + + function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { + cm.openDialog(text, onEnter, { + value: deflt, + selectValueOnOpen: true, + closeOnEnter: false, + onClose: function() { clearSearch(cm); }, + onKeyDown: onKeyDown, + bottom: cm.options.search.bottom + }); + } + + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom}); + else f(prompt(shortText, deflt)); + } + + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs); + else if (confirm(shortText)) fs[0](); + } + + function parseString(string) { + return string.replace(/\\([nrt\\])/g, function(match, ch) { + if (ch == "n") return "\n" + if (ch == "r") return "\r" + if (ch == "t") return "\t" + if (ch == "\\") return "\\" + return match + }) + } + + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } + catch(e) {} // Not a regular expression after all, do a string search + } else { + query = parseString(query) + } + if (typeof query == "string" ? query == "" : query.test("")) + query = /x^/; + return query; + } + + function startSearch(cm, state, query) { + state.queryText = query; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + } + + function doSearch(cm, rev, persistent, immediate) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + var q = cm.getSelection() || state.lastQuery; + if (q instanceof RegExp && q.source == "x^") q = null + if (persistent && cm.openDialog) { + var hiding = null + var searchNext = function(query, event) { + CodeMirror.e_stop(event); + if (!query) return; + if (query != state.queryText) { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + } + if (hiding) hiding.style.opacity = 1 + findNext(cm, event.shiftKey, function(_, to) { + var dialog + if (to.line < 3 && document.querySelector && + (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && + dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) + (hiding = dialog).style.opacity = .4 + }) + }; + persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) { + var keyName = CodeMirror.keyName(event) + var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption("keyMap")][keyName] + if (cmd == "findNext" || cmd == "findPrev" || + cmd == "findPersistentNext" || cmd == "findPersistentPrev") { + CodeMirror.e_stop(event); + startSearch(cm, getSearchState(cm), query); + cm.execCommand(cmd); + } else if (cmd == "find" || cmd == "findPersistent") { + CodeMirror.e_stop(event); + searchNext(query, event); + } + }); + if (immediate && q) { + startSearch(cm, state, q); + findNext(cm, rev); + } + } else { + dialog(cm, getQueryDialog(cm), "Search for:", q, function(query) { + if (query && !state.query) cm.operation(function() { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + } + + function findNext(cm, rev, callback) {cm.operation(function() { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20); + state.posFrom = cursor.from(); state.posTo = cursor.to(); + if (callback) callback(cursor.from(), cursor.to()) + });} + + function clearSearch(cm) {cm.operation(function() { + var state = getSearchState(cm); + state.lastQuery = state.query; + if (!state.query) return; + state.query = state.queryText = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + });} + + function el(tag, attrs) { + var element = tag ? document.createElement(tag) : document.createDocumentFragment(); + for (var key in attrs) { + element[key] = attrs[key]; + } + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i] + element.appendChild(typeof child == "string" ? document.createTextNode(child) : child); + } + return element; + } + + function getQueryDialog(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("Search:")), " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"}), " ", + el("span", {style: "color: #888", className: "CodeMirror-search-hint"}, + cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplaceQueryDialog(cm) { + return el("", null, " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"}), " ", + el("span", {style: "color: #888", className: "CodeMirror-search-hint"}, + cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplacementQueryDialog(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("With:")), " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"})); + } + function getDoReplaceConfirm(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("Replace?")), " ", + el("button", {}, cm.phrase("Yes")), " ", + el("button", {}, cm.phrase("No")), " ", + el("button", {}, cm.phrase("All")), " ", + el("button", {}, cm.phrase("Stop"))); + } + + function replaceAll(cm, query, text) { + cm.operation(function() { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + } else cursor.replace(text); + } + }); + } + + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + var query = cm.getSelection() || getSearchState(cm).lastQuery; + var dialogText = all ? cm.phrase("Replace all:") : cm.phrase("Replace:") + var fragment = el("", null, + el("span", {className: "CodeMirror-search-label"}, dialogText), + getReplaceQueryDialog(cm)) + dialog(cm, fragment, dialogText, query, function(query) { + if (!query) return; + query = parseQuery(query); + dialog(cm, getReplacementQueryDialog(cm), cm.phrase("Replace with:"), "", function(text) { + text = parseString(text) + if (all) { + replaceAll(cm, query, text) + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query, cm.getCursor("from")); + var advance = function() { + var start = cursor.from(), match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query); + if (!(match = cursor.findNext()) || + (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); + confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase("Replace?"), + [function() {doReplace(match);}, advance, + function() {replaceAll(cm, query, text)}]); + }; + var doReplace = function(match) { + cursor.replace(typeof query == "string" ? text : + text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + advance(); + }; + advance(); + } + }); + }); + } + + CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; + CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);}; + CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);}; + CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);}; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js new file mode 100644 index 0000000000..230017b781 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js @@ -0,0 +1,305 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + var Pos = CodeMirror.Pos + + function regexpFlags(regexp) { + var flags = regexp.flags + return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + + (regexp.global ? "g" : "") + + (regexp.multiline ? "m" : "") + } + + function ensureFlags(regexp, flags) { + var current = regexpFlags(regexp), target = current + for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) + target += flags.charAt(i) + return current == target ? regexp : new RegExp(regexp.source, target) + } + + function maybeMultiline(regexp) { + return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source) + } + + function searchRegexpForward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { + regexp.lastIndex = ch + var string = doc.getLine(line), match = regexp.exec(string) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpForwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start) + + regexp = ensureFlags(regexp, "gm") + var string, chunk = 1 + for (var line = start.line, last = doc.lastLine(); line <= last;) { + // This grows the search buffer in exponentially-sized chunks + // between matches, so that nearby matches are fast and don't + // require concatenating the whole document (in case we're + // searching for something that has tons of matches), but at the + // same time, the amount of retries is limited. + for (var i = 0; i < chunk; i++) { + if (line > last) break + var curLine = doc.getLine(line++) + string = string == null ? curLine : string + "\n" + curLine + } + chunk = chunk * 2 + regexp.lastIndex = start.ch + var match = regexp.exec(string) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + function lastMatchIn(string, regexp, endMargin) { + var match, from = 0 + while (from <= string.length) { + regexp.lastIndex = from + var newMatch = regexp.exec(string) + if (!newMatch) break + var end = newMatch.index + newMatch[0].length + if (end > string.length - endMargin) break + if (!match || end > match.index + match[0].length) + match = newMatch + from = newMatch.index + 1 + } + return match + } + + function searchRegexpBackward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { + var string = doc.getLine(line) + var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpBackwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start) + regexp = ensureFlags(regexp, "gm") + var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch + for (var line = start.line, first = doc.firstLine(); line >= first;) { + for (var i = 0; i < chunkSize && line >= first; i++) { + var curLine = doc.getLine(line--) + string = string == null ? curLine : curLine + "\n" + string + } + chunkSize *= 2 + + var match = lastMatchIn(string, regexp, endMargin) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = line + before.length, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + var doFold, noFold + if (String.prototype.normalize) { + doFold = function(str) { return str.normalize("NFD").toLowerCase() } + noFold = function(str) { return str.normalize("NFD") } + } else { + doFold = function(str) { return str.toLowerCase() } + noFold = function(str) { return str } + } + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos, foldFunc) { + if (orig.length == folded.length) return pos + for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { + if (min == max) return min + var mid = (min + max) >> 1 + var len = foldFunc(orig.slice(0, mid)).length + if (len == pos) return mid + else if (len > pos) max = mid + else min = mid + 1 + } + } + + function searchStringForward(doc, query, start, caseFold) { + // Empty string would match anything and never progress, so we + // define it to match nothing instead. + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { + var orig = doc.getLine(line).slice(ch), string = fold(orig) + if (lines.length == 1) { + var found = string.indexOf(lines[0]) + if (found == -1) continue search + var start = adjustPos(orig, string, found, fold) + ch + return {from: Pos(line, adjustPos(orig, string, found, fold) + ch), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)} + } else { + var cutFrom = string.length - lines[0].length + if (string.slice(cutFrom) != lines[0]) continue search + for (var i = 1; i < lines.length - 1; i++) + if (fold(doc.getLine(line + i)) != lines[i]) continue search + var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1] + if (endString.slice(0, lastLine.length) != lastLine) continue search + return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), + to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))} + } + } + } + + function searchStringBackward(doc, query, start, caseFold) { + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { + var orig = doc.getLine(line) + if (ch > -1) orig = orig.slice(0, ch) + var string = fold(orig) + if (lines.length == 1) { + var found = string.lastIndexOf(lines[0]) + if (found == -1) continue search + return {from: Pos(line, adjustPos(orig, string, found, fold)), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))} + } else { + var lastLine = lines[lines.length - 1] + if (string.slice(0, lastLine.length) != lastLine) continue search + for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) + if (fold(doc.getLine(start + i)) != lines[i]) continue search + var top = doc.getLine(line + 1 - lines.length), topString = fold(top) + if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search + return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), + to: Pos(line, adjustPos(orig, string, lastLine.length, fold))} + } + } + } + + function SearchCursor(doc, query, pos, options) { + this.atOccurrence = false + this.afterEmptyMatch = false + this.doc = doc + pos = pos ? doc.clipPos(pos) : Pos(0, 0) + this.pos = {from: pos, to: pos} + + var caseFold + if (typeof options == "object") { + caseFold = options.caseFold + } else { // Backwards compat for when caseFold was the 4th argument + caseFold = options + options = null + } + + if (typeof query == "string") { + if (caseFold == null) caseFold = false + this.matches = function(reverse, pos) { + return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold) + } + } else { + query = ensureFlags(query, "gm") + if (!options || options.multiline !== false) + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos) + } + else + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos) + } + } + } + + SearchCursor.prototype = { + findNext: function() {return this.find(false)}, + findPrevious: function() {return this.find(true)}, + + find: function(reverse) { + var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + if (this.afterEmptyMatch && this.atOccurrence) { + // do not return the same 0 width match twice + head = Pos(head.line, head.ch) + if (reverse) { + head.ch--; + if (head.ch < 0) { + head.line--; + head.ch = (this.doc.getLine(head.line) || "").length; + } + } else { + head.ch++; + if (head.ch > (this.doc.getLine(head.line) || "").length) { + head.ch = 0; + head.line++; + } + } + if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) { + return this.atOccurrence = false + } + } + var result = this.matches(reverse, head) + this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0 + + if (result) { + this.pos = result + this.atOccurrence = true + return this.pos.match || true + } else { + var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0) + this.pos = {from: end, to: end} + return this.atOccurrence = false + } + }, + + from: function() {if (this.atOccurrence) return this.pos.from}, + to: function() {if (this.atOccurrence) return this.pos.to}, + + replace: function(newText, origin) { + if (!this.atOccurrence) return + var lines = CodeMirror.splitLines(newText) + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin) + this.pos.to = Pos(this.pos.from.line + lines.length - 1, + lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)) + } + } + + CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold) + }) + CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold) + }) + + CodeMirror.defineExtension("selectMatches", function(query, caseFold) { + var ranges = [] + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold) + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break + ranges.push({anchor: cur.from(), head: cur.to()}) + } + if (ranges.length) + this.setSelections(ranges, 0) + }) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js new file mode 100644 index 0000000000..c7b14ce07f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var WRAP_CLASS = "CodeMirror-activeline"; + var BACK_CLASS = "CodeMirror-activeline-background"; + var GUTT_CLASS = "CodeMirror-activeline-gutter"; + + CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { + var prev = old == CodeMirror.Init ? false : old; + if (val == prev) return + if (prev) { + cm.off("beforeSelectionChange", selectionChange); + clearActiveLines(cm); + delete cm.state.activeLines; + } + if (val) { + cm.state.activeLines = []; + updateActiveLines(cm, cm.listSelections()); + cm.on("beforeSelectionChange", selectionChange); + } + }); + + function clearActiveLines(cm) { + for (var i = 0; i < cm.state.activeLines.length; i++) { + cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS); + } + } + + function sameArray(a, b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) + if (a[i] != b[i]) return false; + return true; + } + + function updateActiveLines(cm, ranges) { + var active = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var option = cm.getOption("styleActiveLine"); + if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty()) + continue + var line = cm.getLineHandleVisualStart(range.head.line); + if (active[active.length - 1] != line) active.push(line); + } + if (sameArray(cm.state.activeLines, active)) return; + cm.operation(function() { + clearActiveLines(cm); + for (var i = 0; i < active.length; i++) { + cm.addLineClass(active[i], "wrap", WRAP_CLASS); + cm.addLineClass(active[i], "background", BACK_CLASS); + cm.addLineClass(active[i], "gutter", GUTT_CLASS); + } + cm.state.activeLines = active; + }); + } + + function selectionChange(cm, sel) { + updateActiveLines(cm, sel.ranges); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js new file mode 100644 index 0000000000..adfaa62d1a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js @@ -0,0 +1,119 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Because sometimes you need to mark the selected *text*. +// +// Adds an option 'styleSelectedText' which, when enabled, gives +// selected text the CSS class given as option value, or +// "CodeMirror-selectedtext" when the value is not a string. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.state.markedSelection = []; + cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; + reset(cm); + cm.on("cursorActivity", onCursorActivity); + cm.on("change", onChange); + } else if (!val && prev) { + cm.off("cursorActivity", onCursorActivity); + cm.off("change", onChange); + clear(cm); + cm.state.markedSelection = cm.state.markedSelectionStyle = null; + } + }); + + function onCursorActivity(cm) { + if (cm.state.markedSelection) + cm.operation(function() { update(cm); }); + } + + function onChange(cm) { + if (cm.state.markedSelection && cm.state.markedSelection.length) + cm.operation(function() { clear(cm); }); + } + + var CHUNK_SIZE = 8; + var Pos = CodeMirror.Pos; + var cmp = CodeMirror.cmpPos; + + function coverRange(cm, from, to, addAt) { + if (cmp(from, to) == 0) return; + var array = cm.state.markedSelection; + var cls = cm.state.markedSelectionStyle; + for (var line = from.line;;) { + var start = line == from.line ? from : Pos(line, 0); + var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; + var end = atEnd ? to : Pos(endLine, 0); + var mark = cm.markText(start, end, {className: cls}); + if (addAt == null) array.push(mark); + else array.splice(addAt++, 0, mark); + if (atEnd) break; + line = endLine; + } + } + + function clear(cm) { + var array = cm.state.markedSelection; + for (var i = 0; i < array.length; ++i) array[i].clear(); + array.length = 0; + } + + function reset(cm) { + clear(cm); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) + coverRange(cm, ranges[i].from(), ranges[i].to()); + } + + function update(cm) { + if (!cm.somethingSelected()) return clear(cm); + if (cm.listSelections().length > 1) return reset(cm); + + var from = cm.getCursor("start"), to = cm.getCursor("end"); + + var array = cm.state.markedSelection; + if (!array.length) return coverRange(cm, from, to); + + var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); + if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE || + cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) + return reset(cm); + + while (cmp(from, coverStart.from) > 0) { + array.shift().clear(); + coverStart = array[0].find(); + } + if (cmp(from, coverStart.from) < 0) { + if (coverStart.to.line - from.line < CHUNK_SIZE) { + array.shift().clear(); + coverRange(cm, from, coverStart.to, 0); + } else { + coverRange(cm, from, coverStart.from, 0); + } + } + + while (cmp(to, coverEnd.to) < 0) { + array.pop().clear(); + coverEnd = array[array.length - 1].find(); + } + if (cmp(to, coverEnd.to) > 0) { + if (to.line - coverEnd.from.line < CHUNK_SIZE) { + array.pop().clear(); + coverRange(cm, coverEnd.from, to); + } else { + coverRange(cm, coverEnd.to, to); + } + } + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js new file mode 100644 index 0000000000..f0bd61a33e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js @@ -0,0 +1,98 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("selectionPointer", false, function(cm, val) { + var data = cm.state.selectionPointer; + if (data) { + CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.off(window, "scroll", data.windowScroll); + cm.off("cursorActivity", reset); + cm.off("scroll", reset); + cm.state.selectionPointer = null; + cm.display.lineDiv.style.cursor = ""; + } + if (val) { + data = cm.state.selectionPointer = { + value: typeof val == "string" ? val : "default", + mousemove: function(event) { mousemove(cm, event); }, + mouseout: function(event) { mouseout(cm, event); }, + windowScroll: function() { reset(cm); }, + rects: null, + mouseX: null, mouseY: null, + willUpdate: false + }; + CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.on(window, "scroll", data.windowScroll); + cm.on("cursorActivity", reset); + cm.on("scroll", reset); + } + }); + + function mousemove(cm, event) { + var data = cm.state.selectionPointer; + if (event.buttons == null ? event.which : event.buttons) { + data.mouseX = data.mouseY = null; + } else { + data.mouseX = event.clientX; + data.mouseY = event.clientY; + } + scheduleUpdate(cm); + } + + function mouseout(cm, event) { + if (!cm.getWrapperElement().contains(event.relatedTarget)) { + var data = cm.state.selectionPointer; + data.mouseX = data.mouseY = null; + scheduleUpdate(cm); + } + } + + function reset(cm) { + cm.state.selectionPointer.rects = null; + scheduleUpdate(cm); + } + + function scheduleUpdate(cm) { + if (!cm.state.selectionPointer.willUpdate) { + cm.state.selectionPointer.willUpdate = true; + setTimeout(function() { + update(cm); + cm.state.selectionPointer.willUpdate = false; + }, 50); + } + } + + function update(cm) { + var data = cm.state.selectionPointer; + if (!data) return; + if (data.rects == null && data.mouseX != null) { + data.rects = []; + if (cm.somethingSelected()) { + for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) + data.rects.push(sel.getBoundingClientRect()); + } + } + var inside = false; + if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { + var rect = data.rects[i]; + if (rect.left <= data.mouseX && rect.right >= data.mouseX && + rect.top <= data.mouseY && rect.bottom >= data.mouseY) + inside = true; + } + var cursor = inside ? data.value : ""; + if (cm.display.lineDiv.style.cursor != cursor) + cm.display.lineDiv.style.cursor = cursor; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css new file mode 100644 index 0000000000..c4b8a2f77e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css @@ -0,0 +1,87 @@ +.CodeMirror-Tern-completion { + padding-left: 22px; + position: relative; + line-height: 1.5; +} +.CodeMirror-Tern-completion:before { + position: absolute; + left: 2px; + bottom: 2px; + border-radius: 50%; + font-size: 12px; + font-weight: bold; + height: 15px; + width: 15px; + line-height: 16px; + text-align: center; + color: white; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.CodeMirror-Tern-completion-unknown:before { + content: "?"; + background: #4bb; +} +.CodeMirror-Tern-completion-object:before { + content: "O"; + background: #77c; +} +.CodeMirror-Tern-completion-fn:before { + content: "F"; + background: #7c7; +} +.CodeMirror-Tern-completion-array:before { + content: "A"; + background: #c66; +} +.CodeMirror-Tern-completion-number:before { + content: "1"; + background: #999; +} +.CodeMirror-Tern-completion-string:before { + content: "S"; + background: #999; +} +.CodeMirror-Tern-completion-bool:before { + content: "B"; + background: #999; +} + +.CodeMirror-Tern-completion-guess { + color: #999; +} + +.CodeMirror-Tern-tooltip { + border: 1px solid silver; + border-radius: 3px; + color: #444; + padding: 2px 5px; + font-size: 90%; + font-family: monospace; + background-color: white; + white-space: pre-wrap; + + max-width: 40em; + position: absolute; + z-index: 10; + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + + transition: opacity 1s; + -moz-transition: opacity 1s; + -webkit-transition: opacity 1s; + -o-transition: opacity 1s; + -ms-transition: opacity 1s; +} + +.CodeMirror-Tern-hint-doc { + max-width: 25em; + margin-top: -3px; +} + +.CodeMirror-Tern-fname { color: black; } +.CodeMirror-Tern-farg { color: #70a; } +.CodeMirror-Tern-farg-current { text-decoration: underline; } +.CodeMirror-Tern-type { color: #07c; } +.CodeMirror-Tern-fhint-guess { opacity: .7; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js new file mode 100644 index 0000000000..a88371747c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js @@ -0,0 +1,750 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Glue code between CodeMirror and Tern. +// +// Create a CodeMirror.TernServer to wrap an actual Tern server, +// register open documents (CodeMirror.Doc instances) with it, and +// call its methods to activate the assisting functions that Tern +// provides. +// +// Options supported (all optional): +// * defs: An array of JSON definition data structures. +// * plugins: An object mapping plugin names to configuration +// options. +// * getFile: A function(name, c) that can be used to access files in +// the project that haven't been loaded yet. Simply do c(null) to +// indicate that a file is not available. +// * fileFilter: A function(value, docName, doc) that will be applied +// to documents before passing them on to Tern. +// * switchToDoc: A function(name, doc) that should, when providing a +// multi-file view, switch the view or focus to the named file. +// * showError: A function(editor, message) that can be used to +// override the way errors are displayed. +// * completionTip: Customize the content in tooltips for completions. +// Is passed a single argument—the completion's data as returned by +// Tern—and may return a string, DOM node, or null to indicate that +// no tip should be shown. By default the docstring is shown. +// * typeTip: Like completionTip, but for the tooltips shown for type +// queries. +// * responseFilter: A function(doc, query, request, error, data) that +// will be applied to the Tern responses before treating them +// +// +// It is possible to run the Tern server in a web worker by specifying +// these additional options: +// * useWorker: Set to true to enable web worker mode. You'll probably +// want to feature detect the actual value you use here, for example +// !!window.Worker. +// * workerScript: The main script of the worker. Point this to +// wherever you are hosting worker.js from this directory. +// * workerDeps: An array of paths pointing (relative to workerScript) +// to the Acorn and Tern libraries and any Tern plugins you want to +// load. Or, if you minified those into a single script and included +// them in the workerScript, simply leave this undefined. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + // declare global: tern + + CodeMirror.TernServer = function(options) { + var self = this; + this.options = options || {}; + var plugins = this.options.plugins || (this.options.plugins = {}); + if (!plugins.doc_comment) plugins.doc_comment = true; + this.docs = Object.create(null); + if (this.options.useWorker) { + this.server = new WorkerServer(this); + } else { + this.server = new tern.Server({ + getFile: function(name, c) { return getFile(self, name, c); }, + async: true, + defs: this.options.defs || [], + plugins: plugins + }); + } + this.trackChange = function(doc, change) { trackChange(self, doc, change); }; + + this.cachedArgHints = null; + this.activeArgHints = null; + this.jumpStack = []; + + this.getHint = function(cm, c) { return hint(self, cm, c); }; + this.getHint.async = true; + }; + + CodeMirror.TernServer.prototype = { + addDoc: function(name, doc) { + var data = {doc: doc, name: name, changed: null}; + this.server.addFile(name, docValue(this, data)); + CodeMirror.on(doc, "change", this.trackChange); + return this.docs[name] = data; + }, + + delDoc: function(id) { + var found = resolveDoc(this, id); + if (!found) return; + CodeMirror.off(found.doc, "change", this.trackChange); + delete this.docs[found.name]; + this.server.delFile(found.name); + }, + + hideDoc: function(id) { + closeArgHints(this); + var found = resolveDoc(this, id); + if (found && found.changed) sendDoc(this, found); + }, + + complete: function(cm) { + cm.showHint({hint: this.getHint}); + }, + + showType: function(cm, pos, c) { showContextInfo(this, cm, pos, "type", c); }, + + showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, "documentation", c); }, + + updateArgHints: function(cm) { updateArgHints(this, cm); }, + + jumpToDef: function(cm) { jumpToDef(this, cm); }, + + jumpBack: function(cm) { jumpBack(this, cm); }, + + rename: function(cm) { rename(this, cm); }, + + selectName: function(cm) { selectName(this, cm); }, + + request: function (cm, query, c, pos) { + var self = this; + var doc = findDoc(this, cm.getDoc()); + var request = buildRequest(this, doc, query, pos); + var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type] + if (extraOptions) for (var prop in extraOptions) request.query[prop] = extraOptions[prop]; + + this.server.request(request, function (error, data) { + if (!error && self.options.responseFilter) + data = self.options.responseFilter(doc, query, request, error, data); + c(error, data); + }); + }, + + destroy: function () { + closeArgHints(this) + if (this.worker) { + this.worker.terminate(); + this.worker = null; + } + } + }; + + var Pos = CodeMirror.Pos; + var cls = "CodeMirror-Tern-"; + var bigDoc = 250; + + function getFile(ts, name, c) { + var buf = ts.docs[name]; + if (buf) + c(docValue(ts, buf)); + else if (ts.options.getFile) + ts.options.getFile(name, c); + else + c(null); + } + + function findDoc(ts, doc, name) { + for (var n in ts.docs) { + var cur = ts.docs[n]; + if (cur.doc == doc) return cur; + } + if (!name) for (var i = 0;; ++i) { + n = "[doc" + (i || "") + "]"; + if (!ts.docs[n]) { name = n; break; } + } + return ts.addDoc(name, doc); + } + + function resolveDoc(ts, id) { + if (typeof id == "string") return ts.docs[id]; + if (id instanceof CodeMirror) id = id.getDoc(); + if (id instanceof CodeMirror.Doc) return findDoc(ts, id); + } + + function trackChange(ts, doc, change) { + var data = findDoc(ts, doc); + + var argHints = ts.cachedArgHints; + if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0) + ts.cachedArgHints = null; + + var changed = data.changed; + if (changed == null) + data.changed = changed = {from: change.from.line, to: change.from.line}; + var end = change.from.line + (change.text.length - 1); + if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); + if (end >= changed.to) changed.to = end + 1; + if (changed.from > change.from.line) changed.from = change.from.line; + + if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { + if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); + }, 200); + } + + function sendDoc(ts, doc) { + ts.server.request({files: [{type: "full", name: doc.name, text: docValue(ts, doc)}]}, function(error) { + if (error) window.console.error(error); + else doc.changed = null; + }); + } + + // Completion + + function hint(ts, cm, c) { + ts.request(cm, {type: "completions", types: true, docs: true, urls: true}, function(error, data) { + if (error) return showError(ts, cm, error); + var completions = [], after = ""; + var from = data.start, to = data.end; + if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && + cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") + after = "\"]"; + + for (var i = 0; i < data.completions.length; ++i) { + var completion = data.completions[i], className = typeToIcon(completion.type); + if (data.guess) className += " " + cls + "guess"; + completions.push({text: completion.name + after, + displayText: completion.displayName || completion.name, + className: className, + data: completion}); + } + + var obj = {from: from, to: to, list: completions}; + var tooltip = null; + CodeMirror.on(obj, "close", function() { remove(tooltip); }); + CodeMirror.on(obj, "update", function() { remove(tooltip); }); + CodeMirror.on(obj, "select", function(cur, node) { + remove(tooltip); + var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; + if (content) { + tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, + node.getBoundingClientRect().top + window.pageYOffset, content, cm, cls + "hint-doc"); + } + }); + c(obj); + }); + } + + function typeToIcon(type) { + var suffix; + if (type == "?") suffix = "unknown"; + else if (type == "number" || type == "string" || type == "bool") suffix = type; + else if (/^fn\(/.test(type)) suffix = "fn"; + else if (/^\[/.test(type)) suffix = "array"; + else suffix = "object"; + return cls + "completion " + cls + "completion-" + suffix; + } + + // Type queries + + function showContextInfo(ts, cm, pos, queryName, c) { + ts.request(cm, queryName, function(error, data) { + if (error) return showError(ts, cm, error); + if (ts.options.typeTip) { + var tip = ts.options.typeTip(data); + } else { + var tip = elt("span", null, elt("strong", null, data.type || "not found")); + if (data.doc) + tip.appendChild(document.createTextNode(" — " + data.doc)); + if (data.url) { + tip.appendChild(document.createTextNode(" ")); + var child = tip.appendChild(elt("a", null, "[docs]")); + child.href = data.url; + child.target = "_blank"; + } + } + tempTooltip(cm, tip, ts); + if (c) c(); + }, pos); + } + + // Maintaining argument hints + + function updateArgHints(ts, cm) { + closeArgHints(ts); + + if (cm.somethingSelected()) return; + var state = cm.getTokenAt(cm.getCursor()).state; + var inner = CodeMirror.innerMode(cm.getMode(), state); + if (inner.mode.name != "javascript") return; + var lex = inner.state.lexical; + if (lex.info != "call") return; + + var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); + for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { + var str = cm.getLine(line), extra = 0; + for (var pos = 0;;) { + var tab = str.indexOf("\t", pos); + if (tab == -1) break; + extra += tabSize - (tab + extra) % tabSize - 1; + pos = tab + 1; + } + ch = lex.column - extra; + if (str.charAt(ch) == "(") {found = true; break;} + } + if (!found) return; + + var start = Pos(line, ch); + var cache = ts.cachedArgHints; + if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) + return showArgHints(ts, cm, argPos); + + ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { + if (error || !data.type || !(/^fn\(/).test(data.type)) return; + ts.cachedArgHints = { + start: start, + type: parseFnType(data.type), + name: data.exprName || data.name || "fn", + guess: data.guess, + doc: cm.getDoc() + }; + showArgHints(ts, cm, argPos); + }); + } + + function showArgHints(ts, cm, pos) { + closeArgHints(ts); + + var cache = ts.cachedArgHints, tp = cache.type; + var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, + elt("span", cls + "fname", cache.name), "("); + for (var i = 0; i < tp.args.length; ++i) { + if (i) tip.appendChild(document.createTextNode(", ")); + var arg = tp.args[i]; + tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); + if (arg.type != "?") { + tip.appendChild(document.createTextNode(":\u00a0")); + tip.appendChild(elt("span", cls + "type", arg.type)); + } + } + tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); + if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); + var place = cm.cursorCoords(null, "page"); + var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip, cm) + setTimeout(function() { + tooltip.clear = onEditorActivity(cm, function() { + if (ts.activeArgHints == tooltip) closeArgHints(ts) }) + }, 20) + } + + function parseFnType(text) { + var args = [], pos = 3; + + function skipMatching(upto) { + var depth = 0, start = pos; + for (;;) { + var next = text.charAt(pos); + if (upto.test(next) && !depth) return text.slice(start, pos); + if (/[{\[\(]/.test(next)) ++depth; + else if (/[}\]\)]/.test(next)) --depth; + ++pos; + } + } + + // Parse arguments + if (text.charAt(pos) != ")") for (;;) { + var name = text.slice(pos).match(/^([^, \(\[\{]+): /); + if (name) { + pos += name[0].length; + name = name[1]; + } + args.push({name: name, type: skipMatching(/[\),]/)}); + if (text.charAt(pos) == ")") break; + pos += 2; + } + + var rettype = text.slice(pos).match(/^\) -> (.*)$/); + + return {args: args, rettype: rettype && rettype[1]}; + } + + // Moving to the definition of something + + function jumpToDef(ts, cm) { + function inner(varName) { + var req = {type: "definition", variable: varName || null}; + var doc = findDoc(ts, cm.getDoc()); + ts.server.request(buildRequest(ts, doc, req), function(error, data) { + if (error) return showError(ts, cm, error); + if (!data.file && data.url) { window.open(data.url); return; } + + if (data.file) { + var localDoc = ts.docs[data.file], found; + if (localDoc && (found = findContext(localDoc.doc, data))) { + ts.jumpStack.push({file: doc.name, + start: cm.getCursor("from"), + end: cm.getCursor("to")}); + moveTo(ts, doc, localDoc, found.start, found.end); + return; + } + } + showError(ts, cm, "Could not find a definition."); + }); + } + + if (!atInterestingExpression(cm)) + dialog(cm, "Jump to variable", function(name) { if (name) inner(name); }); + else + inner(); + } + + function jumpBack(ts, cm) { + var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file]; + if (!doc) return; + moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); + } + + function moveTo(ts, curDoc, doc, start, end) { + doc.doc.setSelection(start, end); + if (curDoc != doc && ts.options.switchToDoc) { + closeArgHints(ts); + ts.options.switchToDoc(doc.name, doc.doc); + } + } + + // The {line,ch} representation of positions makes this rather awkward. + function findContext(doc, data) { + var before = data.context.slice(0, data.contextOffset).split("\n"); + var startLine = data.start.line - (before.length - 1); + var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); + + var text = doc.getLine(startLine).slice(start.ch); + for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) + text += "\n" + doc.getLine(cur); + if (text.slice(0, data.context.length) == data.context) return data; + + var cursor = doc.getSearchCursor(data.context, 0, false); + var nearest, nearestDist = Infinity; + while (cursor.findNext()) { + var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000; + if (!dist) dist = Math.abs(from.ch - start.ch); + if (dist < nearestDist) { nearest = from; nearestDist = dist; } + } + if (!nearest) return null; + + if (before.length == 1) + nearest.ch += before[0].length; + else + nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); + if (data.start.line == data.end.line) + var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); + else + var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); + return {start: nearest, end: end}; + } + + function atInterestingExpression(cm) { + var pos = cm.getCursor("end"), tok = cm.getTokenAt(pos); + if (tok.start < pos.ch && tok.type == "comment") return false; + return /[\w)\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); + } + + // Variable renaming + + function rename(ts, cm) { + var token = cm.getTokenAt(cm.getCursor()); + if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); + dialog(cm, "New name for " + token.string, function(newName) { + ts.request(cm, {type: "rename", newName: newName, fullDocs: true}, function(error, data) { + if (error) return showError(ts, cm, error); + applyChanges(ts, data.changes); + }); + }); + } + + function selectName(ts, cm) { + var name = findDoc(ts, cm.doc).name; + ts.request(cm, {type: "refs"}, function(error, data) { + if (error) return showError(ts, cm, error); + var ranges = [], cur = 0; + var curPos = cm.getCursor(); + for (var i = 0; i < data.refs.length; i++) { + var ref = data.refs[i]; + if (ref.file == name) { + ranges.push({anchor: ref.start, head: ref.end}); + if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0) + cur = ranges.length - 1; + } + } + cm.setSelections(ranges, cur); + }); + } + + var nextChangeOrig = 0; + function applyChanges(ts, changes) { + var perFile = Object.create(null); + for (var i = 0; i < changes.length; ++i) { + var ch = changes[i]; + (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); + } + for (var file in perFile) { + var known = ts.docs[file], chs = perFile[file];; + if (!known) continue; + chs.sort(function(a, b) { return cmpPos(b.start, a.start); }); + var origin = "*rename" + (++nextChangeOrig); + for (var i = 0; i < chs.length; ++i) { + var ch = chs[i]; + known.doc.replaceRange(ch.text, ch.start, ch.end, origin); + } + } + } + + // Generic request-building helper + + function buildRequest(ts, doc, query, pos) { + var files = [], offsetLines = 0, allowFragments = !query.fullDocs; + if (!allowFragments) delete query.fullDocs; + if (typeof query == "string") query = {type: query}; + query.lineCharPositions = true; + if (query.end == null) { + query.end = pos || doc.doc.getCursor("end"); + if (doc.doc.somethingSelected()) + query.start = doc.doc.getCursor("start"); + } + var startPos = query.start || query.end; + + if (doc.changed) { + if (doc.doc.lineCount() > bigDoc && allowFragments !== false && + doc.changed.to - doc.changed.from < 100 && + doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { + files.push(getFragmentAround(doc, startPos, query.end)); + query.file = "#0"; + var offsetLines = files[0].offsetLines; + if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); + query.end = Pos(query.end.line - offsetLines, query.end.ch); + } else { + files.push({type: "full", + name: doc.name, + text: docValue(ts, doc)}); + query.file = doc.name; + doc.changed = null; + } + } else { + query.file = doc.name; + } + for (var name in ts.docs) { + var cur = ts.docs[name]; + if (cur.changed && cur != doc) { + files.push({type: "full", name: cur.name, text: docValue(ts, cur)}); + cur.changed = null; + } + } + + return {query: query, files: files}; + } + + function getFragmentAround(data, start, end) { + var doc = data.doc; + var minIndent = null, minLine = null, endLine, tabSize = 4; + for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { + var line = doc.getLine(p), fn = line.search(/\bfunction\b/); + if (fn < 0) continue; + var indent = CodeMirror.countColumn(line, null, tabSize); + if (minIndent != null && minIndent <= indent) continue; + minIndent = indent; + minLine = p; + } + if (minLine == null) minLine = min; + var max = Math.min(doc.lastLine(), end.line + 20); + if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) + endLine = max; + else for (endLine = end.line + 1; endLine < max; ++endLine) { + var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); + if (indent <= minIndent) break; + } + var from = Pos(minLine, 0); + + return {type: "part", + name: data.name, + offsetLines: from.line, + text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0))}; + } + + // Generic utilities + + var cmpPos = CodeMirror.cmpPos; + + function elt(tagname, cls /*, ... elts*/) { + var e = document.createElement(tagname); + if (cls) e.className = cls; + for (var i = 2; i < arguments.length; ++i) { + var elt = arguments[i]; + if (typeof elt == "string") elt = document.createTextNode(elt); + e.appendChild(elt); + } + return e; + } + + function dialog(cm, text, f) { + if (cm.openDialog) + cm.openDialog(text + ": ", f); + else + f(prompt(text, "")); + } + + // Tooltips + + function tempTooltip(cm, content, ts) { + if (cm.state.ternTooltip) remove(cm.state.ternTooltip); + var where = cm.cursorCoords(); + var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content, cm); + function maybeClear() { + old = true; + if (!mouseOnTip) clear(); + } + function clear() { + cm.state.ternTooltip = null; + if (tip.parentNode) fadeOut(tip) + clearActivity() + } + var mouseOnTip = false, old = false; + CodeMirror.on(tip, "mousemove", function() { mouseOnTip = true; }); + CodeMirror.on(tip, "mouseout", function(e) { + var related = e.relatedTarget || e.toElement + if (!related || !CodeMirror.contains(tip, related)) { + if (old) clear(); + else mouseOnTip = false; + } + }); + setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700); + var clearActivity = onEditorActivity(cm, clear) + } + + function onEditorActivity(cm, f) { + cm.on("cursorActivity", f) + cm.on("blur", f) + cm.on("scroll", f) + cm.on("setDoc", f) + return function() { + cm.off("cursorActivity", f) + cm.off("blur", f) + cm.off("scroll", f) + cm.off("setDoc", f) + } + } + + function makeTooltip(x, y, content, cm, className) { + var node = elt("div", cls + "tooltip" + " " + (className || ""), content); + node.style.left = x + "px"; + node.style.top = y + "px"; + var container = ((cm.options || {}).hintOptions || {}).container || document.body; + container.appendChild(node); + + var pos = cm.cursorCoords(); + var winW = window.innerWidth; + var winH = window.innerHeight; + var box = node.getBoundingClientRect(); + var hints = document.querySelector(".CodeMirror-hints"); + var overlapY = box.bottom - winH; + var overlapX = box.right - winW; + + if (hints && overlapX > 0) { + node.style.left = 0; + var box = node.getBoundingClientRect(); + node.style.left = (x = x - hints.offsetWidth - box.width) + "px"; + overlapX = box.right - winW; + } + if (overlapY > 0) { + var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { // Fits above cursor + node.style.top = (pos.top - height) + "px"; + } else if (height > winH) { + node.style.height = (winH - 5) + "px"; + node.style.top = (pos.bottom - box.top) + "px"; + } + } + if (overlapX > 0) { + if (box.right - box.left > winW) { + node.style.width = (winW - 5) + "px"; + overlapX -= (box.right - box.left) - winW; + } + node.style.left = (x - overlapX) + "px"; + } + + return node; + } + + function remove(node) { + var p = node && node.parentNode; + if (p) p.removeChild(node); + } + + function fadeOut(tooltip) { + tooltip.style.opacity = "0"; + setTimeout(function() { remove(tooltip); }, 1100); + } + + function showError(ts, cm, msg) { + if (ts.options.showError) + ts.options.showError(cm, msg); + else + tempTooltip(cm, String(msg), ts); + } + + function closeArgHints(ts) { + if (ts.activeArgHints) { + if (ts.activeArgHints.clear) ts.activeArgHints.clear() + remove(ts.activeArgHints) + ts.activeArgHints = null + } + } + + function docValue(ts, doc) { + var val = doc.doc.getValue(); + if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); + return val; + } + + // Worker wrapper + + function WorkerServer(ts) { + var worker = ts.worker = new Worker(ts.options.workerScript); + worker.postMessage({type: "init", + defs: ts.options.defs, + plugins: ts.options.plugins, + scripts: ts.options.workerDeps}); + var msgId = 0, pending = {}; + + function send(data, c) { + if (c) { + data.id = ++msgId; + pending[msgId] = c; + } + worker.postMessage(data); + } + worker.onmessage = function(e) { + var data = e.data; + if (data.type == "getFile") { + getFile(ts, data.name, function(err, text) { + send({type: "getFile", err: String(err), text: text, id: data.id}); + }); + } else if (data.type == "debug") { + window.console.log(data.message); + } else if (data.id && pending[data.id]) { + pending[data.id](data.err, data.body); + delete pending[data.id]; + } + }; + worker.onerror = function(e) { + for (var id in pending) pending[id](e); + pending = {}; + }; + + this.addFile = function(name, text) { send({type: "add", name: name, text: text}); }; + this.delFile = function(name) { send({type: "del", name: name}); }; + this.request = function(body, c) { send({type: "req", body: body}, c); }; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js new file mode 100644 index 0000000000..e134ad47d6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js @@ -0,0 +1,44 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// declare global: tern, server + +var server; + +this.onmessage = function(e) { + var data = e.data; + switch (data.type) { + case "init": return startServer(data.defs, data.plugins, data.scripts); + case "add": return server.addFile(data.name, data.text); + case "del": return server.delFile(data.name); + case "req": return server.request(data.body, function(err, reqData) { + postMessage({id: data.id, body: reqData, err: err && String(err)}); + }); + case "getFile": + var c = pending[data.id]; + delete pending[data.id]; + return c(data.err, data.text); + default: throw new Error("Unknown message type: " + data.type); + } +}; + +var nextId = 0, pending = {}; +function getFile(file, c) { + postMessage({type: "getFile", name: file, id: ++nextId}); + pending[nextId] = c; +} + +function startServer(defs, plugins, scripts) { + if (scripts) importScripts.apply(null, scripts); + + server = new tern.Server({ + getFile: getFile, + async: true, + defs: defs, + plugins: plugins + }); +} + +this.console = { + log: function(v) { postMessage({type: "debug", message: v}); } +}; diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js new file mode 100644 index 0000000000..516368c80d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + + function findParagraph(cm, pos, options) { + var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); + for (var start = pos.line, first = cm.firstLine(); start > first; --start) { + var line = cm.getLine(start); + if (startRE && startRE.test(line)) break; + if (!/\S/.test(line)) { ++start; break; } + } + var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); + for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { + var line = cm.getLine(end); + if (endRE && endRE.test(line)) { ++end; break; } + if (!/\S/.test(line)) break; + } + return {from: start, to: end}; + } + + function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBreak) { + var at = column + while (at < text.length && text.charAt(at) == " ") at++ + for (; at > 0; --at) + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + + if (!forceBreak && at <= text.match(/^[ \t]*/)[0].length) { + // didn't find a break point before column, in non-forceBreak mode try to + // find one after 'column'. + for (at = column + 1; at < text.length - 1; ++at) { + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + } + } + + for (var first = true;; first = false) { + var endOfText = at; + if (killTrailingSpace) + while (text.charAt(endOfText - 1) == " ") --endOfText; + if (endOfText == 0 && first) at = column; + else return {from: endOfText, to: at}; + } + } + + function wrapRange(cm, from, to, options) { + from = cm.clipPos(from); to = cm.clipPos(to); + var column = options.column || 80; + var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; + var forceBreak = options.forceBreak !== false; + var killTrailing = options.killTrailingSpace !== false; + var changes = [], curLine = "", curNo = from.line; + var lines = cm.getRange(from, to, false); + if (!lines.length) return null; + var leadingSpace = lines[0].match(/^[ \t]*/)[0]; + if (leadingSpace.length >= column) column = leadingSpace.length + 1 + + for (var i = 0; i < lines.length; ++i) { + var text = lines[i], oldLen = curLine.length, spaceInserted = 0; + if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { + curLine += " "; + spaceInserted = 1; + } + var spaceTrimmed = ""; + if (i) { + spaceTrimmed = text.match(/^\s*/)[0]; + text = text.slice(spaceTrimmed.length); + } + curLine += text; + if (i) { + var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && + findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak); + // If this isn't broken, or is broken at a different point, remove old break + if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { + changes.push({text: [spaceInserted ? " " : ""], + from: Pos(curNo, oldLen), + to: Pos(curNo + 1, spaceTrimmed.length)}); + } else { + curLine = leadingSpace + text; + ++curNo; + } + } + while (curLine.length > column) { + var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak); + if (bp.from != bp.to || + forceBreak && leadingSpace !== curLine.slice(0, bp.to)) { + changes.push({text: ["", leadingSpace], + from: Pos(curNo, bp.from), + to: Pos(curNo, bp.to)}); + curLine = leadingSpace + curLine.slice(bp.to); + ++curNo; + } else { + break; + } + } + } + if (changes.length) cm.operation(function() { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + if (change.text || CodeMirror.cmpPos(change.from, change.to)) + cm.replaceRange(change.text, change.from, change.to); + } + }); + return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null; + } + + CodeMirror.defineExtension("wrapParagraph", function(pos, options) { + options = options || {}; + if (!pos) pos = this.getCursor(); + var para = findParagraph(this, pos, options); + return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); + }); + + CodeMirror.commands.wrapLines = function(cm) { + cm.operation(function() { + var ranges = cm.listSelections(), at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], span; + if (range.empty()) { + var para = findParagraph(cm, range.head, {}); + span = {from: Pos(para.from, 0), to: Pos(para.to - 1)}; + } else { + span = {from: range.from(), to: range.to()}; + } + if (span.to.line >= at) continue; + at = span.from.line; + wrapRange(cm, span.from, span.to, {}); + } + }); + }; + + CodeMirror.defineExtension("wrapRange", function(from, to, options) { + return wrapRange(this, from, to, options || {}); + }); + + CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { + options = options || {}; + var cm = this, paras = []; + for (var line = from.line; line <= to.line;) { + var para = findParagraph(cm, Pos(line, 0), options); + paras.push(para); + line = para.to; + } + var madeChange = false; + if (paras.length) cm.operation(function() { + for (var i = paras.length - 1; i >= 0; --i) + madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); + }); + return madeChange; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css new file mode 100644 index 0000000000..f4d5718a78 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css @@ -0,0 +1,344 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } +.cm-fat-cursor { caret-color: transparent; } +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: 0; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 50px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; + z-index: 0; +} +.CodeMirror-sizer { + position: relative; + border-right: 50px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; + outline: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -50px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js new file mode 100644 index 0000000000..e142f1dbd0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js @@ -0,0 +1,9849 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order + } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range; + try {range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) { return false } + return range.compareEndPoints("StartToEnd", range) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } + + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } + + // Add a span to a line. + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet)); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { inThisOp.add(line.markedSpans); } + } + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found + } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft + } + function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above) + { height += widgetHeight(widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e$1) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + var customCursor = cm.options.$customCursor; + if (customCursor) { primary = true; } + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } + var collapsed = range.empty(); + if (customCursor) { + var head = customCursor(cm, range); + if (head) { drawSelectionCursor(cm, head, curFragment); } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range.head, curFragment); + } + if (!collapsed) + { drawSelectionRange(cm, range, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range.from(), sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { + if (!cm.hasFocus()) { onBlur(cm); } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { onFocus(cm); } + } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { onBlur(cm); } + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + if (oldHeight < viewTop) { mustScroll -= diff; } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId, // Unique ID + markArrays: null // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && + snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range = document.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + // Send an event to consumers responding to changes in gutter width. + signalLater(display, "gutterChanged", display); + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // This attribute is respected by automatic translation systems such as Google Translate, + // and may also be respected by tools used by human translators. + d.wrapper.setAttribute('translate', 'no'); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) + { if (!this.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(prev) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + { if (op(this.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this; } + }; + + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + if (lineSep === '') { return lines.join('') } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range.head; } + else if (start == "anchor") { pos = range.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range.to(); } + else { pos = range.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this, ranges[i].anchor), + clipPos(this, ranges[i].head || ranges[i].anchor)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() { + var this$1 = this; + + this.history = new History(this.history); + linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); + }, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || + span.from == null && lineNo != from.line || + span.from != null && lineNo == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { continue } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines( + text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + var reader = new FileReader; + reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e$1){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") + { return lookupKey(key, map.fallthrough, handle, context) } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { dir = -dir; } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) + { document.execCommand("cut"); } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } + else { delayBlurEvent(cm); } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if ((webkit && !safari) || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + cm.state.delayingBlurEvent = true; + setTimeout(function () { return display.input.focus(); }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { delayBlurEvent(cm); } + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } + else + { ourRange = range; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } + var order = getOrder(anchorLine); + if (!order) { return range } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { mX = e.clientX; mY = e.clientY; } + catch(e$1) { return false } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } + } + } + + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } + } + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + + option("screenReaderLabel", null, function (cm, val) { + val = (val === '') ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } + }, 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) + { from = to = Pos(from.line, 0); } + } + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } + } + + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) + { indented = indentLine(cm, range.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this, j, how); } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range = this.doc.sel.primary(); + if (start == null) { pos = range.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range.from() : range.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) + { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range.from() : range.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) + { return dir < 0 ? range.from() : range.to() } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { headPos.left = range.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range, margin) { + if (range == null) { + range = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range == "number") { + range = {from: Pos(range, 0), to: null}; + } else if (range.from == null) { + range = {from: range, to: null}; + } + if (!range.to) { range.to = range.from; } + range.margin = margin || 0; + + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { return true } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } + } + return false + } + + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); + } + }; + + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt() == this.div; + return result + }; + + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; + + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt() != this.div) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; + + ContentEditableInput.prototype.supportsTouch = function () { return true }; + + ContentEditableInput.prototype.receivedFocus = function () { + var this$1 = this; + + var input = this; + if (this.selectionInEditor()) + { setTimeout(function () { return this$1.pollSelection(); }, 20); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; + + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); + }; + + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; + + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; + + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + + ContentEditableInput.prototype.needsContentAttribute = true; + + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } + + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } + + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) + { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } + + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } + + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + }; + + TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; + + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result + }; + + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + }; + + TextareaInput.prototype.getField = function () { return this.textarea }; + + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.65.3"; + + return CodeMirror; + +}))); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js new file mode 100644 index 0000000000..b1955f6c94 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js @@ -0,0 +1,174 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("apl", function() { + var builtInOps = { + ".": "innerProduct", + "\\": "scan", + "/": "reduce", + "⌿": "reduce1Axis", + "⍀": "scan1Axis", + "¨": "each", + "⍣": "power" + }; + var builtInFuncs = { + "+": ["conjugate", "add"], + "−": ["negate", "subtract"], + "×": ["signOf", "multiply"], + "÷": ["reciprocal", "divide"], + "⌈": ["ceiling", "greaterOf"], + "⌊": ["floor", "lesserOf"], + "∣": ["absolute", "residue"], + "⍳": ["indexGenerate", "indexOf"], + "?": ["roll", "deal"], + "⋆": ["exponentiate", "toThePowerOf"], + "⍟": ["naturalLog", "logToTheBase"], + "○": ["piTimes", "circularFuncs"], + "!": ["factorial", "binomial"], + "⌹": ["matrixInverse", "matrixDivide"], + "<": [null, "lessThan"], + "≤": [null, "lessThanOrEqual"], + "=": [null, "equals"], + ">": [null, "greaterThan"], + "≥": [null, "greaterThanOrEqual"], + "≠": [null, "notEqual"], + "≡": ["depth", "match"], + "≢": [null, "notMatch"], + "∈": ["enlist", "membership"], + "⍷": [null, "find"], + "∪": ["unique", "union"], + "∩": [null, "intersection"], + "∼": ["not", "without"], + "∨": [null, "or"], + "∧": [null, "and"], + "⍱": [null, "nor"], + "⍲": [null, "nand"], + "⍴": ["shapeOf", "reshape"], + ",": ["ravel", "catenate"], + "⍪": [null, "firstAxisCatenate"], + "⌽": ["reverse", "rotate"], + "⊖": ["axis1Reverse", "axis1Rotate"], + "⍉": ["transpose", null], + "↑": ["first", "take"], + "↓": [null, "drop"], + "⊂": ["enclose", "partitionWithAxis"], + "⊃": ["diclose", "pick"], + "⌷": [null, "index"], + "⍋": ["gradeUp", null], + "⍒": ["gradeDown", null], + "⊤": ["encode", null], + "⊥": ["decode", null], + "⍕": ["format", "formatByExample"], + "⍎": ["execute", null], + "⊣": ["stop", "left"], + "⊢": ["pass", "right"] + }; + + var isOperator = /[\.\/⌿⍀¨⍣]/; + var isNiladic = /⍬/; + var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; + var isArrow = /←/; + var isComment = /[⍝#].*$/; + + var stringEater = function(type) { + var prev; + prev = false; + return function(c) { + prev = c; + if (c === type) { + return prev === "\\"; + } + return true; + }; + }; + return { + startState: function() { + return { + prev: false, + func: false, + op: false, + string: false, + escape: false + }; + }, + token: function(stream, state) { + var ch, funcName; + if (stream.eatSpace()) { + return null; + } + ch = stream.next(); + if (ch === '"' || ch === "'") { + stream.eatWhile(stringEater(ch)); + stream.next(); + state.prev = true; + return "string"; + } + if (/[\[{\(]/.test(ch)) { + state.prev = false; + return null; + } + if (/[\]}\)]/.test(ch)) { + state.prev = true; + return null; + } + if (isNiladic.test(ch)) { + state.prev = false; + return "niladic"; + } + if (/[¯\d]/.test(ch)) { + if (state.func) { + state.func = false; + state.prev = false; + } else { + state.prev = true; + } + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperator.test(ch)) { + return "operator apl-" + builtInOps[ch]; + } + if (isArrow.test(ch)) { + return "apl-arrow"; + } + if (isFunction.test(ch)) { + funcName = "apl-"; + if (builtInFuncs[ch] != null) { + if (state.prev) { + funcName += builtInFuncs[ch][1]; + } else { + funcName += builtInFuncs[ch][0]; + } + } + state.func = true; + state.prev = false; + return "function " + funcName; + } + if (isComment.test(ch)) { + stream.skipToEnd(); + return "comment"; + } + if (ch === "∘" && stream.peek() === ".") { + stream.next(); + return "function jot-dot"; + } + stream.eatWhile(/[\w\$_]/); + state.prev = true; + return "keyword"; + } + }; +}); + +CodeMirror.defineMIME("text/apl", "apl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js new file mode 100644 index 0000000000..f560f42423 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js @@ -0,0 +1,74 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function errorIfNotEmpty(stream) { + var nonWS = stream.match(/^\s*\S/); + stream.skipToEnd(); + return nonWS ? "error" : null; + } + + CodeMirror.defineMode("asciiarmor", function() { + return { + token: function(stream, state) { + var m; + if (state.state == "top") { + if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) { + state.state = "headers"; + state.type = m[1]; + return "tag"; + } + return errorIfNotEmpty(stream); + } else if (state.state == "headers") { + if (stream.sol() && stream.match(/^\w+:/)) { + state.state = "header"; + return "atom"; + } else { + var result = errorIfNotEmpty(stream); + if (result) state.state = "body"; + return result; + } + } else if (state.state == "header") { + stream.skipToEnd(); + state.state = "headers"; + return "string"; + } else if (state.state == "body") { + if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) { + if (m[1] != state.type) return "error"; + state.state = "end"; + return "tag"; + } else { + if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) { + return null; + } else { + stream.next(); + return "error"; + } + } + } else if (state.state == "end") { + return errorIfNotEmpty(stream); + } + }, + blankLine: function(state) { + if (state.state == "headers") state.state = "body"; + }, + startState: function() { + return {state: "top", type: null}; + } + }; + }); + + CodeMirror.defineMIME("application/pgp", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-encrypted", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-keys", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-signature", "asciiarmor"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js new file mode 100644 index 0000000000..df1330b686 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js @@ -0,0 +1,204 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("asn.1", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + cmipVerbs = parserConfig.cmipVerbs || {}, + compareTypes = parserConfig.compareTypes || {}, + status = parserConfig.status || {}, + tags = parserConfig.tags || {}, + storage = parserConfig.storage || {}, + modifier = parserConfig.modifier || {}, + accessTypes = parserConfig.accessTypes|| {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[\|\^]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]\(\){}:=,;]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "-"){ + if (stream.eat("-")) { + stream.skipToEnd(); + return "comment"; + } + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + + stream.eatWhile(/[\w\-]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (cmipVerbs.propertyIsEnumerable(cur)) return "variable cmipVerbs"; + if (compareTypes.propertyIsEnumerable(cur)) return "atom compareTypes"; + if (status.propertyIsEnumerable(cur)) return "comment status"; + if (tags.propertyIsEnumerable(cur)) return "variable-3 tags"; + if (storage.propertyIsEnumerable(cur)) return "builtin storage"; + if (modifier.propertyIsEnumerable(cur)) return "string-2 modifier"; + if (accessTypes.propertyIsEnumerable(cur)) return "atom accessTypes"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterNext = stream.peek(); + //look if the character if the quote is like the B in '10100010'B + if (afterNext){ + afterNext = afterNext.toLowerCase(); + if(afterNext == "b" || afterNext == "h" || afterNext == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") + && curPunc != ';') || (ctx.type == "statement" + && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + + state.startOfLine = false; + return style; + }, + + electricChars: "{}", + lineComment: "--", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + CodeMirror.defineMIME("text/x-ttcn-asn", { + name: "asn.1", + keywords: words("DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION" + + " REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED" + + " WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN" + + " IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS" + + " MINACCESS MAXACCESS REVISION STATUS DESCRIPTION" + + " SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName" + + " ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY" + + " IMPLIED EXPORTS"), + cmipVerbs: words("ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE"), + compareTypes: words("OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY" + + " MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY" + + " OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL" + + " SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL" + + " TEXTUAL-CONVENTION"), + status: words("current deprecated mandatory obsolete"), + tags: words("APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS" + + " UNIVERSAL"), + storage: words("BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING" + + " UTCTime InterfaceIndex IANAifType CMIP-Attribute" + + " REAL PACKAGE PACKAGES IpAddress PhysAddress" + + " NetworkAddress BITS BMPString TimeStamp TimeTicks" + + " TruthValue RowStatus DisplayString GeneralString" + + " GraphicString IA5String NumericString" + + " PrintableString SnmpAdminString TeletexString" + + " UTF8String VideotexString VisibleString StringStore" + + " ISO646String T61String UniversalString Unsigned32" + + " Integer32 Gauge Gauge32 Counter Counter32 Counter64"), + modifier: words("ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS" + + " GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS" + + " DEFINED"), + accessTypes: words("not-accessible accessible-for-notify read-only" + + " read-create read-write"), + multiLineStrings: true + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js new file mode 100644 index 0000000000..49a727019a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js @@ -0,0 +1,220 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * ===================================================================================== + * + * Filename: mode/asterisk/asterisk.js + * + * Description: CodeMirror mode for Asterisk dialplan + * + * Created: 05/17/2012 09:20:25 PM + * Revision: 08/05/2019 AstLinux Project: Support block-comments + * + * Author: Stas Kobzar (stas@modulis.ca), + * Company: Modulis.ca Inc. + * + * ===================================================================================== + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("asterisk", function() { + var atoms = ["exten", "same", "include","ignorepat","switch"], + dpcmd = ["#include","#exec"], + apps = [ + "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi", + "alarmreceiver","amd","answer","authenticate","background","backgrounddetect", + "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent", + "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge", + "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge", + "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility", + "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa", + "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy", + "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif", + "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete", + "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus", + "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme", + "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete", + "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode", + "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish", + "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce", + "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones", + "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten", + "readfile","receivefax","receivefax","receivefax","record","removequeuemember", + "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun", + "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax", + "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags", + "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel", + "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground", + "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound", + "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor", + "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec", + "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate", + "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring", + "waitforsilence","waitmusiconhold","waituntil","while","zapateller" + ]; + + function basicToken(stream,state){ + var cur = ''; + var ch = stream.next(); + // comment + if (state.blockComment) { + if (ch == "-" && stream.match("-;", true)) { + state.blockComment = false; + } else if (stream.skipTo("--;")) { + stream.next(); + stream.next(); + stream.next(); + state.blockComment = false; + } else { + stream.skipToEnd(); + } + return "comment"; + } + if(ch == ";") { + if (stream.match("--", true)) { + if (!stream.match("-", false)) { // Except ;--- is not a block comment + state.blockComment = true; + return "comment"; + } + } + stream.skipToEnd(); + return "comment"; + } + // context + if(ch == '[') { + stream.skipTo(']'); + stream.eat(']'); + return "header"; + } + // string + if(ch == '"') { + stream.skipTo('"'); + return "string"; + } + if(ch == "'") { + stream.skipTo("'"); + return "string-2"; + } + // dialplan commands + if(ch == '#') { + stream.eatWhile(/\w/); + cur = stream.current(); + if(dpcmd.indexOf(cur) !== -1) { + stream.skipToEnd(); + return "strong"; + } + } + // application args + if(ch == '$'){ + var ch1 = stream.peek(); + if(ch1 == '{'){ + stream.skipTo('}'); + stream.eat('}'); + return "variable-3"; + } + } + // extension + stream.eatWhile(/\w/); + cur = stream.current(); + if(atoms.indexOf(cur) !== -1) { + state.extenStart = true; + switch(cur) { + case 'same': state.extenSame = true; break; + case 'include': + case 'switch': + case 'ignorepat': + state.extenInclude = true;break; + default:break; + } + return "atom"; + } + } + + return { + startState: function() { + return { + blockComment: false, + extenStart: false, + extenSame: false, + extenInclude: false, + extenExten: false, + extenPriority: false, + extenApplication: false + }; + }, + token: function(stream, state) { + + var cur = ''; + if(stream.eatSpace()) return null; + // extension started + if(state.extenStart){ + stream.eatWhile(/[^\s]/); + cur = stream.current(); + if(/^=>?$/.test(cur)){ + state.extenExten = true; + state.extenStart = false; + return "strong"; + } else { + state.extenStart = false; + stream.skipToEnd(); + return "error"; + } + } else if(state.extenExten) { + // set exten and priority + state.extenExten = false; + state.extenPriority = true; + stream.eatWhile(/[^,]/); + if(state.extenInclude) { + stream.skipToEnd(); + state.extenPriority = false; + state.extenInclude = false; + } + if(state.extenSame) { + state.extenPriority = false; + state.extenSame = false; + state.extenApplication = true; + } + return "tag"; + } else if(state.extenPriority) { + state.extenPriority = false; + state.extenApplication = true; + stream.next(); // get comma + if(state.extenSame) return null; + stream.eatWhile(/[^,]/); + return "number"; + } else if(state.extenApplication) { + stream.eatWhile(/,/); + cur = stream.current(); + if(cur === ',') return null; + stream.eatWhile(/\w/); + cur = stream.current().toLowerCase(); + state.extenApplication = false; + if(apps.indexOf(cur) !== -1){ + return "def strong"; + } + } else{ + return basicToken(stream,state); + } + + return null; + }, + + blockCommentStart: ";--", + blockCommentEnd: "--;", + lineComment: ";" + }; +}); + +CodeMirror.defineMIME("text/x-asterisk", "asterisk"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js new file mode 100644 index 0000000000..af6d889aee --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js @@ -0,0 +1,85 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11 + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod) + else + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + var reserve = "><+-.,[]".split(""); + /* + comments can be either: + placed behind lines + + +++ this is a comment + + where reserved characters cannot be used + or in a loop + [ + this is ok to use [ ] and stuff + ] + or preceded by # + */ + CodeMirror.defineMode("brainfuck", function() { + return { + startState: function() { + return { + commentLine: false, + left: 0, + right: 0, + commentLoop: false + } + }, + token: function(stream, state) { + if (stream.eatSpace()) return null + if(stream.sol()){ + state.commentLine = false; + } + var ch = stream.next().toString(); + if(reserve.indexOf(ch) !== -1){ + if(state.commentLine === true){ + if(stream.eol()){ + state.commentLine = false; + } + return "comment"; + } + if(ch === "]" || ch === "["){ + if(ch === "["){ + state.left++; + } + else{ + state.right++; + } + return "bracket"; + } + else if(ch === "+" || ch === "-"){ + return "keyword"; + } + else if(ch === "<" || ch === ">"){ + return "atom"; + } + else if(ch === "." || ch === ","){ + return "def"; + } + } + else{ + state.commentLine = true; + if(stream.eol()){ + state.commentLine = false; + } + return "comment"; + } + if(stream.eol()){ + state.commentLine = false; + } + } + }; + }); +CodeMirror.defineMIME("text/x-brainfuck","brainfuck") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js new file mode 100644 index 0000000000..afb7b3be88 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js @@ -0,0 +1,940 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function Context(indented, column, type, info, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.info = info; + this.align = align; + this.prev = prev; +} +function pushContext(state, col, type, info) { + var indent = state.indented; + if (state.context && state.context.type == "statement" && type != "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, info, null, state.context); +} +function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; +} + +function typeBefore(stream, state, pos) { + if (state.prevToken == "variable" || state.prevToken == "type") return true; + if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; + if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; +} + +function isTopScope(context) { + for (;;) { + if (!context || context.type == "top") return true; + if (context.type == "}" && context.prev.info != "namespace") return false; + context = context.prev; + } +} + +CodeMirror.defineMode("clike", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + keywords = parserConfig.keywords || {}, + types = parserConfig.types || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + defKeywords = parserConfig.defKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false, + indentSwitch = parserConfig.indentSwitch !== false, + namespaceSeparator = parserConfig.namespaceSeparator, + isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, + numberStart = parserConfig.numberStart || /[\d\.]/, + number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, + isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, + isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/, + // An optional function that takes a {string} token and returns true if it + // should be treated as a builtin. + isReservedIdentifier = parserConfig.isReservedIdentifier || false; + + var curPunc, isDefKeyword; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (numberStart.test(ch)) { + stream.backUp(1) + if (stream.match(number)) return "number" + stream.next() + } + if (isPunctuationChar.test(ch)) { + curPunc = ch; + return null; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} + return "operator"; + } + stream.eatWhile(isIdentifierChar); + if (namespaceSeparator) while (stream.match(namespaceSeparator)) + stream.eatWhile(isIdentifierChar); + + var cur = stream.current(); + if (contains(keywords, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + if (contains(defKeywords, cur)) isDefKeyword = true; + return "keyword"; + } + if (contains(types, cur)) return "type"; + if (contains(builtin, cur) + || (isReservedIdentifier && isReservedIdentifier(cur))) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + return "builtin"; + } + if (contains(atoms, cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function maybeEOL(stream, state) { + if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) + state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), + indented: 0, + startOfLine: true, + prevToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) { maybeEOL(stream, state); return null; } + curPunc = isDefKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false))) + while (state.context.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || + (ctx.type == "statement" && curPunc == "newstatement"))) { + pushContext(state, stream.column(), "statement", stream.current()); + } + + if (style == "variable" && + ((state.prevToken == "def" || + (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && + isTopScope(state.context) && stream.match(/^\s*\(/, false))))) + style = "def"; + + if (hooks.token) { + var result = hooks.token(stream, state, style); + if (result !== undefined) style = result; + } + + if (style == "def" && parserConfig.styleDefs === false) style = "variable"; + + state.startOfLine = false; + state.prevToken = isDefKeyword ? "def" : style || curPunc; + maybeEOL(stream, state); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + var closing = firstChar == ctx.type; + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + if (parserConfig.dontIndentStatements) + while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) + ctx = ctx.prev + if (hooks.indent) { + var hook = hooks.indent(state, ctx, textAfter, indentUnit); + if (typeof hook == "number") return hook + } + var switchBlock = ctx.prev && ctx.prev.info == "switch"; + if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { + while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev + return ctx.indented + } + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + if (ctx.align && (!dontAlignCalls || ctx.type != ")")) + return ctx.column + (closing ? 0 : 1); + if (ctx.type == ")" && !closing) + return ctx.indented + statementIndentUnit; + + return ctx.indented + (closing ? 0 : indentUnit) + + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); + }, + + electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + function contains(words, word) { + if (typeof words === "function") { + return words(word); + } else { + return words.propertyIsEnumerable(word); + } + } + var cKeywords = "auto if break case register continue return default do sizeof " + + "static else struct switch extern typedef union for goto while enum const " + + "volatile inline restrict asm fortran"; + + // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20. + var cppKeywords = "alignas alignof and and_eq audit axiom bitand bitor catch " + + "class compl concept constexpr const_cast decltype delete dynamic_cast " + + "explicit export final friend import module mutable namespace new noexcept " + + "not not_eq operator or or_eq override private protected public " + + "reinterpret_cast requires static_assert static_cast template this " + + "thread_local throw try typeid typename using virtual xor xor_eq"; + + var objCKeywords = "bycopy byref in inout oneway out self super atomic nonatomic retain copy " + + "readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd " + + "@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class " + + "@public @package @private @protected @required @optional @try @catch @finally @import " + + "@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available"; + + var objCBuiltins = "FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION " + + " NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER " + + "NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION " + + "NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT" + + // Do not use this. Use the cTypes function below. This is global just to avoid + // excessive calls when cTypes is being called multiple times during a parse. + var basicCTypes = words("int long char short double float unsigned signed " + + "void bool"); + + // Do not use this. Use the objCTypes function below. This is global just to avoid + // excessive calls when objCTypes is being called multiple times during a parse. + var basicObjCTypes = words("SEL instancetype id Class Protocol BOOL"); + + // Returns true if identifier is a "C" type. + // C type is defined as those that are reserved by the compiler (basicTypes), + // and those that end in _t (Reserved by POSIX for types) + // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html + function cTypes(identifier) { + return contains(basicCTypes, identifier) || /.+_t$/.test(identifier); + } + + // Returns true if identifier is a "Objective C" type. + function objCTypes(identifier) { + return cTypes(identifier) || contains(basicObjCTypes, identifier); + } + + var cBlockKeywords = "case do else for if switch while struct enum union"; + var cDefKeywords = "struct enum union"; + + function cppHook(stream, state) { + if (!state.startOfLine) return false + for (var ch, next = null; ch = stream.peek();) { + if (ch == "\\" && stream.match(/^.$/)) { + next = cppHook + break + } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { + break + } + stream.next() + } + state.tokenize = next + return "meta" + } + + function pointerHook(_stream, state) { + if (state.prevToken == "type") return "type"; + return false; + } + + // For C and C++ (and ObjC): identifiers starting with __ + // or _ followed by a capital letter are reserved for the compiler. + function cIsReservedIdentifier(token) { + if (!token || token.length < 2) return false; + if (token[0] != '_') return false; + return (token[1] == '_') || (token[1] !== token[1].toLowerCase()); + } + + function cpp14Literal(stream) { + stream.eatWhile(/[\w\.']/); + return "number"; + } + + function cpp11StringHook(stream, state) { + stream.backUp(1); + // Raw strings. + if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) { + var match = stream.match(/^"([^\s\\()]{0,16})\(/); + if (!match) { + return false; + } + state.cpp11RawStringDelim = match[1]; + state.tokenize = tokenRawString; + return tokenRawString(stream, state); + } + // Unicode strings/chars. + if (stream.match(/^(?:u8|u|U|L)/)) { + if (stream.match(/^["']/, /* eat */ false)) { + return "string"; + } + return false; + } + // Ignore this hook. + stream.next(); + return false; + } + + function cppLooksLikeConstructor(word) { + var lastTwo = /(\w+)::~?(\w+)$/.exec(word); + return lastTwo && lastTwo[1] == lastTwo[2]; + } + + // C#-style strings where "" escapes a quote. + function tokenAtString(stream, state) { + var next; + while ((next = stream.next()) != null) { + if (next == '"' && !stream.eat('"')) { + state.tokenize = null; + break; + } + } + return "string"; + } + + // C++11 raw string literal is "( anything )", where + // can be a string up to 16 characters long. + function tokenRawString(stream, state) { + // Escape characters that have special regex meanings. + var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); + var match = stream.match(new RegExp(".*?\\)" + delim + '"')); + if (match) + state.tokenize = null; + else + stream.skipToEnd(); + return "string"; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + add(mode.keywords); + add(mode.types); + add(mode.builtin); + add(mode.atoms); + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-csrc", "text/x-c", "text/x-chdr"], { + name: "clike", + keywords: words(cKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords), + defKeywords: words(cDefKeywords), + typeFirstDefinitions: true, + atoms: words("NULL true false"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + }, + modeProps: {fold: ["brace", "include"]} + }); + + def(["text/x-c++src", "text/x-c++hdr"], { + name: "clike", + keywords: words(cKeywords + " " + cppKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords + " class try catch"), + defKeywords: words(cDefKeywords + " class namespace"), + typeFirstDefinitions: true, + atoms: words("true false NULL nullptr"), + dontIndentStatements: /^template$/, + isIdentifierChar: /[\w\$_~\xa1-\uffff]/, + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-java", { + name: "clike", + keywords: words("abstract assert break case catch class const continue default " + + "do else enum extends final finally for goto if implements import " + + "instanceof interface native new package private protected public " + + "return static strictfp super switch synchronized this throw throws transient " + + "try volatile while @interface"), + types: words("var byte short int long float double boolean char void Boolean Byte Character Double Float " + + "Integer Long Number Object Short String StringBuffer StringBuilder Void"), + blockKeywords: words("catch class do else finally for if switch try while"), + defKeywords: words("class interface enum @interface"), + typeFirstDefinitions: true, + atoms: words("true false null"), + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + hooks: { + "@": function(stream) { + // Don't match the @interface keyword. + if (stream.match('interface', false)) return false; + + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match(/""$/)) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + } + }, + modeProps: {fold: ["brace", "import"]} + }); + + def("text/x-csharp", { + name: "clike", + keywords: words("abstract as async await base break case catch checked class const continue" + + " default delegate do else enum event explicit extern finally fixed for" + + " foreach goto if implicit in interface internal is lock namespace new" + + " operator out override params private protected public readonly ref return sealed" + + " sizeof stackalloc static struct switch this throw try typeof unchecked" + + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + + " global group into join let orderby partial remove select set value var yield"), + types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + + " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + + " UInt64 bool byte char decimal double short int long object" + + " sbyte float string ushort uint ulong"), + blockKeywords: words("catch class do else finally for foreach if struct switch try while"), + defKeywords: words("class interface namespace struct var"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { + "@": function(stream, state) { + if (stream.eat('"')) { + state.tokenize = tokenAtString; + return tokenAtString(stream, state); + } + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + + function tokenTripleString(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!escaped && stream.match('"""')) { + state.tokenize = null; + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + function tokenNestedComment(depth) { + return function (stream, state) { + var ch + while (ch = stream.next()) { + if (ch == "*" && stream.eat("/")) { + if (depth == 1) { + state.tokenize = null + break + } else { + state.tokenize = tokenNestedComment(depth - 1) + return state.tokenize(stream, state) + } + } else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenNestedComment(depth + 1) + return state.tokenize(stream, state) + } + } + return "comment" + } + } + + def("text/x-scala", { + name: "clike", + keywords: words( + /* scala */ + "abstract case catch class def do else extends final finally for forSome if " + + "implicit import lazy match new null object override package private protected return " + + "sealed super this throw trait try type val var while with yield _ " + + + /* package scala */ + "assert assume require print println printf readLine readBoolean readByte readShort " + + "readChar readInt readLong readFloat readDouble" + ), + types: words( + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + + + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + multiLineStrings: true, + blockKeywords: words("catch class enum do else finally for forSome if match switch try while"), + defKeywords: words("class enum def object package trait type val var"), + atoms: words("true false null"), + indentStatements: false, + indentSwitch: false, + isOperatorChar: /[+\-*&%=<>!?|\/#:@]/, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match('""')) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + "=": function(stream, state) { + var cx = state.context + if (cx.type == "}" && cx.align && stream.eat(">")) { + state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) + return "operator" + } else { + return false + } + }, + + "/": function(stream, state) { + if (!stream.eat("*")) return false + state.tokenize = tokenNestedComment(1) + return state.tokenize(stream, state) + } + }, + modeProps: {closeBrackets: {pairs: '()[]{}""', triples: '"'}} + }); + + function tokenKotlinString(tripleString){ + return function (stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} + if (tripleString && stream.match('"""')) {end = true; break;} + next = stream.next(); + if(!escaped && next == "$" && stream.match('{')) + stream.skipTo("}"); + escaped = !escaped && next == "\\" && !tripleString; + } + if (end || !tripleString) + state.tokenize = null; + return "string"; + } + } + + def("text/x-kotlin", { + name: "clike", + keywords: words( + /*keywords*/ + "package as typealias class interface this super val operator " + + "var fun for is in This throw return annotation " + + "break continue object if else while do try when !in !is as? " + + + /*soft keywords*/ + "file import where by get set abstract enum open inner override private public internal " + + "protected catch finally out final vararg reified dynamic companion constructor init " + + "sealed field property receiver param sparam lateinit data inline noinline tailrec " + + "external annotation crossinline const operator infix suspend actual expect setparam value" + ), + types: words( + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray " + + "ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy " + + "LazyThreadSafetyMode LongArray Nothing ShortArray Unit" + ), + intendSwitch: false, + indentStatements: false, + multiLineStrings: true, + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + blockKeywords: words("catch class do else finally for if where try while enum"), + defKeywords: words("class val var object interface fun"), + atoms: words("true false null this"), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '*': function(_stream, state) { + return state.prevToken == '.' ? 'variable' : 'operator'; + }, + '"': function(stream, state) { + state.tokenize = tokenKotlinString(stream.match('""')); + return state.tokenize(stream, state); + }, + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenNestedComment(1); + return state.tokenize(stream, state) + }, + indent: function(state, ctx, textAfter, indentUnit) { + var firstChar = textAfter && textAfter.charAt(0); + if ((state.prevToken == "}" || state.prevToken == ")") && textAfter == "") + return state.indented; + if ((state.prevToken == "operator" && textAfter != "}" && state.context.type != "}") || + state.prevToken == "variable" && firstChar == "." || + (state.prevToken == "}" || state.prevToken == ")") && firstChar == ".") + return indentUnit * 2 + ctx.indented; + if (ctx.align && ctx.type == "}") + return ctx.indented + (state.context.type == (textAfter || "").charAt(0) ? 0 : indentUnit); + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + def(["x-shader/x-vertex", "x-shader/x-fragment"], { + name: "clike", + keywords: words("sampler1D sampler2D sampler3D samplerCube " + + "sampler1DShadow sampler2DShadow " + + "const attribute uniform varying " + + "break continue discard return " + + "for while do if else struct " + + "in out inout"), + types: words("float int bool void " + + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + + "mat2 mat3 mat4"), + blockKeywords: words("for while do if else struct"), + builtin: words("radians degrees sin cos tan asin acos atan " + + "pow exp log exp2 sqrt inversesqrt " + + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + + "length distance dot cross normalize ftransform faceforward " + + "reflect refract matrixCompMult " + + "lessThan lessThanEqual greaterThan greaterThanEqual " + + "equal notEqual any all not " + + "texture1D texture1DProj texture1DLod texture1DProjLod " + + "texture2D texture2DProj texture2DLod texture2DProjLod " + + "texture3D texture3DProj texture3DLod texture3DProjLod " + + "textureCube textureCubeLod " + + "shadow1D shadow2D shadow1DProj shadow2DProj " + + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + + "dFdx dFdy fwidth " + + "noise1 noise2 noise3 noise4"), + atoms: words("true false " + + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + + "gl_FogCoord gl_PointCoord " + + "gl_Position gl_PointSize gl_ClipVertex " + + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + + "gl_TexCoord gl_FogFragCoord " + + "gl_FragCoord gl_FrontFacing " + + "gl_FragData gl_FragDepth " + + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + + "gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + + "gl_ProjectionMatrixInverseTranspose " + + "gl_ModelViewProjectionMatrixInverseTranspose " + + "gl_TextureMatrixInverseTranspose " + + "gl_NormalScale gl_DepthRange gl_ClipPlane " + + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + + "gl_FrontLightModelProduct gl_BackLightModelProduct " + + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + + "gl_FogParameters " + + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + + "gl_MaxDrawBuffers"), + indentSwitch: false, + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-nesc", { + name: "clike", + keywords: words(cKeywords + " as atomic async call command component components configuration event generic " + + "implementation includes interface module new norace nx_struct nx_union post provides " + + "signal task uses abstract extends"), + types: cTypes, + blockKeywords: words(cBlockKeywords), + atoms: words("null true false"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class"), + dontIndentStatements: /^@.*$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + }, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec++", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords + " " + cppKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class class namespace"), + dontIndentStatements: /^@.*$|^template$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-squirrel", { + name: "clike", + keywords: words("base break clone continue const default delete enum extends function in class" + + " foreach local resume return this throw typeof yield constructor instanceof static"), + types: cTypes, + blockKeywords: words("case catch class else for foreach if switch try while"), + defKeywords: words("function local class"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + // Ceylon Strings need to deal with interpolation + var stringTokenizer = null; + function tokenCeylonString(type) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!escaped && stream.match('"') && + (type == "single" || stream.match('""'))) { + end = true; + break; + } + if (!escaped && stream.match('``')) { + stringTokenizer = tokenCeylonString(type); + end = true; + break; + } + next = stream.next(); + escaped = type == "single" && !escaped && next == "\\"; + } + if (end) + state.tokenize = null; + return "string"; + } + } + + def("text/x-ceylon", { + name: "clike", + keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + + " exists extends finally for function given if import in interface is let module new" + + " nonempty object of out outer package return satisfies super switch then this throw" + + " try value void while"), + types: function(word) { + // In Ceylon all identifiers that start with an uppercase are types + var first = word.charAt(0); + return (first === first.toUpperCase() && first !== first.toLowerCase()); + }, + blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), + defKeywords: words("class dynamic function interface module object package value"), + builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + + " native optional sealed see serializable shared suppressWarnings tagged throws variable"), + isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, + isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, + numberStart: /[\d#$]/, + number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, + multiLineStrings: true, + typeFirstDefinitions: true, + atoms: words("true false null larger smaller equal empty finished"), + indentSwitch: false, + styleDefs: false, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); + return state.tokenize(stream, state); + }, + '`': function(stream, state) { + if (!stringTokenizer || !stream.match('`')) return false; + state.tokenize = stringTokenizer; + stringTokenizer = null; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + token: function(_stream, state, style) { + if ((style == "variable" || style == "type") && + state.prevToken == ".") { + return "variable-2"; + } + } + }, + modeProps: { + fold: ["brace", "import"], + closeBrackets: {triples: '"'} + } + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js new file mode 100644 index 0000000000..0b9d6acc3e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js @@ -0,0 +1,292 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports === "object" && typeof module === "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define === "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("clojure", function (options) { + var atoms = ["false", "nil", "true"]; + var specialForms = [".", "catch", "def", "do", "if", "monitor-enter", + "monitor-exit", "new", "quote", "recur", "set!", "throw", "try", "var"]; + var coreSymbols = ["*", "*'", "*1", "*2", "*3", "*agent*", + "*allow-unresolved-vars*", "*assert*", "*clojure-version*", + "*command-line-args*", "*compile-files*", "*compile-path*", + "*compiler-options*", "*data-readers*", "*default-data-reader-fn*", "*e", + "*err*", "*file*", "*flush-on-newline*", "*fn-loader*", "*in*", + "*math-context*", "*ns*", "*out*", "*print-dup*", "*print-length*", + "*print-level*", "*print-meta*", "*print-namespace-maps*", + "*print-readably*", "*read-eval*", "*reader-resolver*", "*source-path*", + "*suppress-read*", "*unchecked-math*", "*use-context-classloader*", + "*verbose-defrecords*", "*warn-on-reflection*", "+", "+'", "-", "-'", + "->", "->>", "->ArrayChunk", "->Eduction", "->Vec", "->VecNode", + "->VecSeq", "-cache-protocol-fn", "-reset-methods", "..", "/", "<", "<=", + "=", "==", ">", ">=", "EMPTY-NODE", "Inst", "StackTraceElement->vec", + "Throwable->map", "accessor", "aclone", "add-classpath", "add-watch", + "agent", "agent-error", "agent-errors", "aget", "alength", "alias", + "all-ns", "alter", "alter-meta!", "alter-var-root", "amap", "ancestors", + "and", "any?", "apply", "areduce", "array-map", "as->", "aset", + "aset-boolean", "aset-byte", "aset-char", "aset-double", "aset-float", + "aset-int", "aset-long", "aset-short", "assert", "assoc", "assoc!", + "assoc-in", "associative?", "atom", "await", "await-for", "await1", + "bases", "bean", "bigdec", "bigint", "biginteger", "binding", "bit-and", + "bit-and-not", "bit-clear", "bit-flip", "bit-not", "bit-or", "bit-set", + "bit-shift-left", "bit-shift-right", "bit-test", "bit-xor", "boolean", + "boolean-array", "boolean?", "booleans", "bound-fn", "bound-fn*", + "bound?", "bounded-count", "butlast", "byte", "byte-array", "bytes", + "bytes?", "case", "cast", "cat", "char", "char-array", + "char-escape-string", "char-name-string", "char?", "chars", "chunk", + "chunk-append", "chunk-buffer", "chunk-cons", "chunk-first", "chunk-next", + "chunk-rest", "chunked-seq?", "class", "class?", "clear-agent-errors", + "clojure-version", "coll?", "comment", "commute", "comp", "comparator", + "compare", "compare-and-set!", "compile", "complement", "completing", + "concat", "cond", "cond->", "cond->>", "condp", "conj", "conj!", "cons", + "constantly", "construct-proxy", "contains?", "count", "counted?", + "create-ns", "create-struct", "cycle", "dec", "dec'", "decimal?", + "declare", "dedupe", "default-data-readers", "definline", "definterface", + "defmacro", "defmethod", "defmulti", "defn", "defn-", "defonce", + "defprotocol", "defrecord", "defstruct", "deftype", "delay", "delay?", + "deliver", "denominator", "deref", "derive", "descendants", "destructure", + "disj", "disj!", "dissoc", "dissoc!", "distinct", "distinct?", "doall", + "dorun", "doseq", "dosync", "dotimes", "doto", "double", "double-array", + "double?", "doubles", "drop", "drop-last", "drop-while", "eduction", + "empty", "empty?", "ensure", "ensure-reduced", "enumeration-seq", + "error-handler", "error-mode", "eval", "even?", "every-pred", "every?", + "ex-data", "ex-info", "extend", "extend-protocol", "extend-type", + "extenders", "extends?", "false?", "ffirst", "file-seq", "filter", + "filterv", "find", "find-keyword", "find-ns", "find-protocol-impl", + "find-protocol-method", "find-var", "first", "flatten", "float", + "float-array", "float?", "floats", "flush", "fn", "fn?", "fnext", "fnil", + "for", "force", "format", "frequencies", "future", "future-call", + "future-cancel", "future-cancelled?", "future-done?", "future?", + "gen-class", "gen-interface", "gensym", "get", "get-in", "get-method", + "get-proxy-class", "get-thread-bindings", "get-validator", "group-by", + "halt-when", "hash", "hash-combine", "hash-map", "hash-ordered-coll", + "hash-set", "hash-unordered-coll", "ident?", "identical?", "identity", + "if-let", "if-not", "if-some", "ifn?", "import", "in-ns", "inc", "inc'", + "indexed?", "init-proxy", "inst-ms", "inst-ms*", "inst?", "instance?", + "int", "int-array", "int?", "integer?", "interleave", "intern", + "interpose", "into", "into-array", "ints", "io!", "isa?", "iterate", + "iterator-seq", "juxt", "keep", "keep-indexed", "key", "keys", "keyword", + "keyword?", "last", "lazy-cat", "lazy-seq", "let", "letfn", "line-seq", + "list", "list*", "list?", "load", "load-file", "load-reader", + "load-string", "loaded-libs", "locking", "long", "long-array", "longs", + "loop", "macroexpand", "macroexpand-1", "make-array", "make-hierarchy", + "map", "map-entry?", "map-indexed", "map?", "mapcat", "mapv", "max", + "max-key", "memfn", "memoize", "merge", "merge-with", "meta", + "method-sig", "methods", "min", "min-key", "mix-collection-hash", "mod", + "munge", "name", "namespace", "namespace-munge", "nat-int?", "neg-int?", + "neg?", "newline", "next", "nfirst", "nil?", "nnext", "not", "not-any?", + "not-empty", "not-every?", "not=", "ns", "ns-aliases", "ns-imports", + "ns-interns", "ns-map", "ns-name", "ns-publics", "ns-refers", + "ns-resolve", "ns-unalias", "ns-unmap", "nth", "nthnext", "nthrest", + "num", "number?", "numerator", "object-array", "odd?", "or", "parents", + "partial", "partition", "partition-all", "partition-by", "pcalls", "peek", + "persistent!", "pmap", "pop", "pop!", "pop-thread-bindings", "pos-int?", + "pos?", "pr", "pr-str", "prefer-method", "prefers", + "primitives-classnames", "print", "print-ctor", "print-dup", + "print-method", "print-simple", "print-str", "printf", "println", + "println-str", "prn", "prn-str", "promise", "proxy", + "proxy-call-with-super", "proxy-mappings", "proxy-name", "proxy-super", + "push-thread-bindings", "pvalues", "qualified-ident?", + "qualified-keyword?", "qualified-symbol?", "quot", "rand", "rand-int", + "rand-nth", "random-sample", "range", "ratio?", "rational?", + "rationalize", "re-find", "re-groups", "re-matcher", "re-matches", + "re-pattern", "re-seq", "read", "read-line", "read-string", + "reader-conditional", "reader-conditional?", "realized?", "record?", + "reduce", "reduce-kv", "reduced", "reduced?", "reductions", "ref", + "ref-history-count", "ref-max-history", "ref-min-history", "ref-set", + "refer", "refer-clojure", "reify", "release-pending-sends", "rem", + "remove", "remove-all-methods", "remove-method", "remove-ns", + "remove-watch", "repeat", "repeatedly", "replace", "replicate", "require", + "reset!", "reset-meta!", "reset-vals!", "resolve", "rest", + "restart-agent", "resultset-seq", "reverse", "reversible?", "rseq", + "rsubseq", "run!", "satisfies?", "second", "select-keys", "send", + "send-off", "send-via", "seq", "seq?", "seqable?", "seque", "sequence", + "sequential?", "set", "set-agent-send-executor!", + "set-agent-send-off-executor!", "set-error-handler!", "set-error-mode!", + "set-validator!", "set?", "short", "short-array", "shorts", "shuffle", + "shutdown-agents", "simple-ident?", "simple-keyword?", "simple-symbol?", + "slurp", "some", "some->", "some->>", "some-fn", "some?", "sort", + "sort-by", "sorted-map", "sorted-map-by", "sorted-set", "sorted-set-by", + "sorted?", "special-symbol?", "spit", "split-at", "split-with", "str", + "string?", "struct", "struct-map", "subs", "subseq", "subvec", "supers", + "swap!", "swap-vals!", "symbol", "symbol?", "sync", "tagged-literal", + "tagged-literal?", "take", "take-last", "take-nth", "take-while", "test", + "the-ns", "thread-bound?", "time", "to-array", "to-array-2d", + "trampoline", "transduce", "transient", "tree-seq", "true?", "type", + "unchecked-add", "unchecked-add-int", "unchecked-byte", "unchecked-char", + "unchecked-dec", "unchecked-dec-int", "unchecked-divide-int", + "unchecked-double", "unchecked-float", "unchecked-inc", + "unchecked-inc-int", "unchecked-int", "unchecked-long", + "unchecked-multiply", "unchecked-multiply-int", "unchecked-negate", + "unchecked-negate-int", "unchecked-remainder-int", "unchecked-short", + "unchecked-subtract", "unchecked-subtract-int", "underive", "unquote", + "unquote-splicing", "unreduced", "unsigned-bit-shift-right", "update", + "update-in", "update-proxy", "uri?", "use", "uuid?", "val", "vals", + "var-get", "var-set", "var?", "vary-meta", "vec", "vector", "vector-of", + "vector?", "volatile!", "volatile?", "vreset!", "vswap!", "when", + "when-first", "when-let", "when-not", "when-some", "while", + "with-bindings", "with-bindings*", "with-in-str", "with-loading-context", + "with-local-vars", "with-meta", "with-open", "with-out-str", + "with-precision", "with-redefs", "with-redefs-fn", "xml-seq", "zero?", + "zipmap"]; + var haveBodyParameter = [ + "->", "->>", "as->", "binding", "bound-fn", "case", "catch", "comment", + "cond", "cond->", "cond->>", "condp", "def", "definterface", "defmethod", + "defn", "defmacro", "defprotocol", "defrecord", "defstruct", "deftype", + "do", "doseq", "dotimes", "doto", "extend", "extend-protocol", + "extend-type", "fn", "for", "future", "if", "if-let", "if-not", "if-some", + "let", "letfn", "locking", "loop", "ns", "proxy", "reify", "struct-map", + "some->", "some->>", "try", "when", "when-first", "when-let", "when-not", + "when-some", "while", "with-bindings", "with-bindings*", "with-in-str", + "with-loading-context", "with-local-vars", "with-meta", "with-open", + "with-out-str", "with-precision", "with-redefs", "with-redefs-fn"]; + + CodeMirror.registerHelper("hintWords", "clojure", + [].concat(atoms, specialForms, coreSymbols)); + + var atom = createLookupMap(atoms); + var specialForm = createLookupMap(specialForms); + var coreSymbol = createLookupMap(coreSymbols); + var hasBodyParameter = createLookupMap(haveBodyParameter); + var delimiter = /^(?:[\\\[\]\s"(),;@^`{}~]|$)/; + var numberLiteral = /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/; + var characterLiteral = /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/; + + // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*/ + // simple-symbol := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/ + // qualified-symbol := ((<.>)*)? + var qualifiedSymbol = /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/; + + function base(stream, state) { + if (stream.eatSpace() || stream.eat(",")) return ["space", null]; + if (stream.match(numberLiteral)) return [null, "number"]; + if (stream.match(characterLiteral)) return [null, "string-2"]; + if (stream.eat(/^"/)) return (state.tokenize = inString)(stream, state); + if (stream.eat(/^[(\[{]/)) return ["open", "bracket"]; + if (stream.eat(/^[)\]}]/)) return ["close", "bracket"]; + if (stream.eat(/^;/)) {stream.skipToEnd(); return ["space", "comment"];} + if (stream.eat(/^[#'@^`~]/)) return [null, "meta"]; + + var matches = stream.match(qualifiedSymbol); + var symbol = matches && matches[0]; + + if (!symbol) { + // advance stream by at least one character so we don't get stuck. + stream.next(); + stream.eatWhile(function (c) {return !is(c, delimiter);}); + return [null, "error"]; + } + + if (symbol === "comment" && state.lastToken === "(") + return (state.tokenize = inComment)(stream, state); + if (is(symbol, atom) || symbol.charAt(0) === ":") return ["symbol", "atom"]; + if (is(symbol, specialForm) || is(symbol, coreSymbol)) return ["symbol", "keyword"]; + if (state.lastToken === "(") return ["symbol", "builtin"]; // other operator + + return ["symbol", "variable"]; + } + + function inString(stream, state) { + var escaped = false, next; + + while (next = stream.next()) { + if (next === "\"" && !escaped) {state.tokenize = base; break;} + escaped = !escaped && next === "\\"; + } + + return [null, "string"]; + } + + function inComment(stream, state) { + var parenthesisCount = 1; + var next; + + while (next = stream.next()) { + if (next === ")") parenthesisCount--; + if (next === "(") parenthesisCount++; + if (parenthesisCount === 0) { + stream.backUp(1); + state.tokenize = base; + break; + } + } + + return ["space", "comment"]; + } + + function createLookupMap(words) { + var obj = {}; + + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + + return obj; + } + + function is(value, test) { + if (test instanceof RegExp) return test.test(value); + if (test instanceof Object) return test.propertyIsEnumerable(value); + } + + return { + startState: function () { + return { + ctx: {prev: null, start: 0, indentTo: 0}, + lastToken: null, + tokenize: base + }; + }, + + token: function (stream, state) { + if (stream.sol() && (typeof state.ctx.indentTo !== "number")) + state.ctx.indentTo = state.ctx.start + 1; + + var typeStylePair = state.tokenize(stream, state); + var type = typeStylePair[0]; + var style = typeStylePair[1]; + var current = stream.current(); + + if (type !== "space") { + if (state.lastToken === "(" && state.ctx.indentTo === null) { + if (type === "symbol" && is(current, hasBodyParameter)) + state.ctx.indentTo = state.ctx.start + options.indentUnit; + else state.ctx.indentTo = "next"; + } else if (state.ctx.indentTo === "next") { + state.ctx.indentTo = stream.column(); + } + + state.lastToken = current; + } + + if (type === "open") + state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; + else if (type === "close") state.ctx = state.ctx.prev || state.ctx; + + return style; + }, + + indent: function (state) { + var i = state.ctx.indentTo; + + return (typeof i === "number") ? + i : + state.ctx.start + 1; + }, + + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;" + }; +}); + +CodeMirror.defineMIME("text/x-clojure", "clojure"); +CodeMirror.defineMIME("text/x-clojurescript", "clojure"); +CodeMirror.defineMIME("application/edn", "clojure"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js new file mode 100644 index 0000000000..496c71d1fd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js @@ -0,0 +1,97 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("cmake", function () { + var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; + + function tokenString(stream, state) { + var current, prev, found_var = false; + while (!stream.eol() && (current = stream.next()) != state.pending) { + if (current === '$' && prev != '\\' && state.pending == '"') { + found_var = true; + break; + } + prev = current; + } + if (found_var) { + stream.backUp(1); + } + if (current == state.pending) { + state.continueString = false; + } else { + state.continueString = true; + } + return "string"; + } + + function tokenize(stream, state) { + var ch = stream.next(); + + // Have we found a variable? + if (ch === '$') { + if (stream.match(variable_regex)) { + return 'variable-2'; + } + return 'variable'; + } + // Should we still be looking for the end of a string? + if (state.continueString) { + // If so, go through the loop again + stream.backUp(1); + return tokenString(stream, state); + } + // Do we just have a function on our hands? + // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched + if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { + stream.backUp(1); + return 'def'; + } + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + // Have we found a string? + if (ch == "'" || ch == '"') { + // Store the type (single or double) + state.pending = ch; + // Perform the looping function to find the end + return tokenString(stream, state); + } + if (ch == '(' || ch == ')') { + return 'bracket'; + } + if (ch.match(/[0-9]/)) { + return 'number'; + } + stream.eatWhile(/[\w-]/); + return null; + } + return { + startState: function () { + var state = {}; + state.inDefinition = false; + state.inInclude = false; + state.continueString = false; + state.pending = false; + return state; + }, + token: function (stream, state) { + if (stream.eatSpace()) return null; + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-cmake", "cmake"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js new file mode 100644 index 0000000000..a7aeafa03a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js @@ -0,0 +1,255 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Author: Gautam Mehta + * Branched from CodeMirror's Scheme mode + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("cobol", function () { + var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", + ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header", + COBOLLINENUM = "def", PERIOD = "link"; + function makeKeywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES "); + var keywords = makeKeywords( + "ACCEPT ACCESS ACQUIRE ADD ADDRESS " + + "ADVANCING AFTER ALIAS ALL ALPHABET " + + "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " + + "ALSO ALTER ALTERNATE AND ANY " + + "ARE AREA AREAS ARITHMETIC ASCENDING " + + "ASSIGN AT ATTRIBUTE AUTHOR AUTO " + + "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " + + "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " + + "BEFORE BELL BINARY BIT BITS " + + "BLANK BLINK BLOCK BOOLEAN BOTTOM " + + "BY CALL CANCEL CD CF " + + "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " + + "CLOSE COBOL CODE CODE-SET COL " + + "COLLATING COLUMN COMMA COMMIT COMMITMENT " + + "COMMON COMMUNICATION COMP COMP-0 COMP-1 " + + "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " + + "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " + + "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " + + "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " + + "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " + + "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " + + "CONVERTING COPY CORR CORRESPONDING COUNT " + + "CRT CRT-UNDER CURRENCY CURRENT CURSOR " + + "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " + + "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " + + "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " + + "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " + + "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " + + "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " + + "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " + + "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " + + "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " + + "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " + + "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " + + "EBCDIC EGI EJECT ELSE EMI " + + "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " + + "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " + + "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " + + "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " + + "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " + + "END-UNSTRING END-WRITE END-XML ENTER ENTRY " + + "ENVIRONMENT EOP EQUAL EQUALS ERASE " + + "ERROR ESI EVALUATE EVERY EXCEEDS " + + "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " + + "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " + + "FILE-STREAM FILES FILLER FINAL FIND " + + "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " + + "FOREGROUND-COLOUR FORMAT FREE FROM FULL " + + "FUNCTION GENERATE GET GIVING GLOBAL " + + "GO GOBACK GREATER GROUP HEADING " + + "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " + + "ID IDENTIFICATION IF IN INDEX " + + "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " + + "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " + + "INDIC INDICATE INDICATOR INDICATORS INITIAL " + + "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " + + "INSTALLATION INTO INVALID INVOKE IS " + + "JUST JUSTIFIED KANJI KEEP KEY " + + "LABEL LAST LD LEADING LEFT " + + "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " + + "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " + + "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " + + "LOCALE LOCALLY LOCK " + + "MEMBER MEMORY MERGE MESSAGE METACLASS " + + "MODE MODIFIED MODIFY MODULES MOVE " + + "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " + + "NEXT NO NO-ECHO NONE NOT " + + "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " + + "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " + + "OF OFF OMITTED ON ONLY " + + "OPEN OPTIONAL OR ORDER ORGANIZATION " + + "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " + + "PADDING PAGE PAGE-COUNTER PARSE PERFORM " + + "PF PH PIC PICTURE PLUS " + + "POINTER POSITION POSITIVE PREFIX PRESENT " + + "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " + + "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " + + "PROMPT PROTECTED PURGE QUEUE QUOTE " + + "QUOTES RANDOM RD READ READY " + + "REALM RECEIVE RECONNECT RECORD RECORD-NAME " + + "RECORDS RECURSIVE REDEFINES REEL REFERENCE " + + "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " + + "REMAINDER REMOVAL RENAMES REPEATED REPLACE " + + "REPLACING REPORT REPORTING REPORTS REPOSITORY " + + "REQUIRED RERUN RESERVE RESET RETAINING " + + "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " + + "REVERSED REWIND REWRITE RF RH " + + "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " + + "RUN SAME SCREEN SD SEARCH " + + "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " + + "SELECT SEND SENTENCE SEPARATE SEQUENCE " + + "SEQUENTIAL SET SHARED SIGN SIZE " + + "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " + + "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " + + "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " + + "START STARTING STATUS STOP STORE " + + "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " + + "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " + + "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " + + "TABLE TALLYING TAPE TENANT TERMINAL " + + "TERMINATE TEST TEXT THAN THEN " + + "THROUGH THRU TIME TIMES TITLE " + + "TO TOP TRAILING TRAILING-SIGN TRANSACTION " + + "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " + + "UNSTRING UNTIL UP UPDATE UPON " + + "USAGE USAGE-MODE USE USING VALID " + + "VALIDATE VALUE VALUES VARYING VLR " + + "WAIT WHEN WHEN-COMPILED WITH WITHIN " + + "WORDS WORKING-STORAGE WRITE XML XML-CODE " + + "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " ); + + var builtins = makeKeywords("- * ** / + < <= = > >= "); + var tests = { + digit: /\d/, + digit_or_colon: /[\d:]/, + hex: /[0-9a-f]/i, + sign: /[+-]/, + exponent: /e/i, + keyword_char: /[^\s\(\[\;\)\]]/, + symbol: /[\w*+\-]/ + }; + function isNumber(ch, stream){ + // hex + if ( ch === '0' && stream.eat(/x/i) ) { + stream.eatWhile(tests.hex); + return true; + } + // leading sign + if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { + stream.eat(tests.sign); + ch = stream.next(); + } + if ( tests.digit.test(ch) ) { + stream.eat(ch); + stream.eatWhile(tests.digit); + if ( '.' == stream.peek()) { + stream.eat('.'); + stream.eatWhile(tests.digit); + } + if ( stream.eat(tests.exponent) ) { + stream.eat(tests.sign); + stream.eatWhile(tests.digit); + } + return true; + } + return false; + } + return { + startState: function () { + return { + indentStack: null, + indentation: 0, + mode: false + }; + }, + token: function (stream, state) { + if (state.indentStack == null && stream.sol()) { + // update indentation, but only if indentStack is empty + state.indentation = 6 ; //stream.indentation(); + } + // skip spaces + if (stream.eatSpace()) { + return null; + } + var returnType = null; + switch(state.mode){ + case "string": // multi-line string parsing mode + var next = false; + while ((next = stream.next()) != null) { + if ((next == "\"" || next == "\'") && !stream.match(/['"]/, false)) { + state.mode = false; + break; + } + } + returnType = STRING; // continue on in string mode + break; + default: // default parsing mode + var ch = stream.next(); + var col = stream.column(); + if (col >= 0 && col <= 5) { + returnType = COBOLLINENUM; + } else if (col >= 72 && col <= 79) { + stream.skipToEnd(); + returnType = MODTAG; + } else if (ch == "*" && col == 6) { // comment + stream.skipToEnd(); // rest of the line is a comment + returnType = COMMENT; + } else if (ch == "\"" || ch == "\'") { + state.mode = "string"; + returnType = STRING; + } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { + returnType = ATOM; + } else if (ch == ".") { + returnType = PERIOD; + } else if (isNumber(ch,stream)){ + returnType = NUMBER; + } else { + if (stream.current().match(tests.symbol)) { + while (col < 71) { + if (stream.eat(tests.symbol) === undefined) { + break; + } else { + col++; + } + } + } + if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = KEYWORD; + } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = BUILTIN; + } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = ATOM; + } else returnType = null; + } + } + return returnType; + }, + indent: function (state) { + if (state.indentStack == null) return state.indentation; + return state.indentStack.indent; + } + }; +}); + +CodeMirror.defineMIME("text/x-cobol", "cobol"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js new file mode 100644 index 0000000000..a54e9d5ed0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js @@ -0,0 +1,359 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Link to the project's GitHub page: + * https://github.com/pickhardt/coffeescript-codemirror-mode + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("coffeescript", function(conf, parserConf) { + var ERRORCLASS = "error"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/; + var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; + var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; + var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/; + + var wordOperators = wordRegexp(["and", "or", "not", + "is", "isnt", "in", + "instanceof", "typeof"]); + var indentKeywords = ["for", "while", "loop", "if", "unless", "else", + "switch", "try", "catch", "finally", "class"]; + var commonKeywords = ["break", "by", "continue", "debugger", "delete", + "do", "in", "of", "new", "return", "then", + "this", "@", "throw", "when", "until", "extends"]; + + var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); + + indentKeywords = wordRegexp(indentKeywords); + + + var stringPrefixes = /^('{3}|\"{3}|['\"])/; + var regexPrefixes = /^(\/{3}|\/)/; + var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"]; + var constants = wordRegexp(commonConstants); + + // Tokenizers + function tokenBase(stream, state) { + // Handle scope changes + if (stream.sol()) { + if (state.scope.align === null) state.scope.align = false; + var scopeOffset = state.scope.offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset && state.scope.type == "coffee") { + return "indent"; + } else if (lineOffset < scopeOffset) { + return "dedent"; + } + return null; + } else { + if (scopeOffset > 0) { + dedent(stream, state); + } + } + } + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle docco title comment (single line) + if (stream.match("####")) { + stream.skipToEnd(); + return "comment"; + } + + // Handle multi line comments + if (stream.match("###")) { + state.tokenize = longComment; + return state.tokenize(stream, state); + } + + // Single line comment + if (ch === "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle number literals + if (stream.match(/^-?[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { + floatLiteral = true; + } + if (stream.match(/^-?\d+\.\d*/)) { + floatLiteral = true; + } + if (stream.match(/^-?\.\d+/)) { + floatLiteral = true; + } + + if (floatLiteral) { + // prevent from getting extra . on 1.. + if (stream.peek() == "."){ + stream.backUp(1); + } + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^-?0x[0-9a-f]+/i)) { + intLiteral = true; + } + // Decimal + if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^-?0(?![\dx])/i)) { + intLiteral = true; + } + if (intLiteral) { + return "number"; + } + } + + // Handle strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenFactory(stream.current(), false, "string"); + return state.tokenize(stream, state); + } + // Handle regex literals + if (stream.match(regexPrefixes)) { + if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division + state.tokenize = tokenFactory(stream.current(), true, "string-2"); + return state.tokenize(stream, state); + } else { + stream.backUp(1); + } + } + + + + // Handle operators and delimiters + if (stream.match(operators) || stream.match(wordOperators)) { + return "operator"; + } + if (stream.match(delimiters)) { + return "punctuation"; + } + + if (stream.match(constants)) { + return "atom"; + } + + if (stream.match(atProp) || state.prop && stream.match(identifiers)) { + return "property"; + } + + if (stream.match(keywords)) { + return "keyword"; + } + + if (stream.match(identifiers)) { + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenFactory(delimiter, singleline, outclass) { + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\/\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) { + return outclass; + } + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return outclass; + } else { + stream.eat(/['"\/]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + outclass = ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return outclass; + }; + } + + function longComment(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^#]/); + if (stream.match("###")) { + state.tokenize = tokenBase; + break; + } + stream.eatWhile("#"); + } + return "comment"; + } + + function indent(stream, state, type) { + type = type || "coffee"; + var offset = 0, align = false, alignOffset = null; + for (var scope = state.scope; scope; scope = scope.prev) { + if (scope.type === "coffee" || scope.type == "}") { + offset = scope.offset + conf.indentUnit; + break; + } + } + if (type !== "coffee") { + align = null; + alignOffset = stream.column() + stream.current().length; + } else if (state.scope.align) { + state.scope.align = false; + } + state.scope = { + offset: offset, + type: type, + prev: state.scope, + align: align, + alignOffset: alignOffset + }; + } + + function dedent(stream, state) { + if (!state.scope.prev) return; + if (state.scope.type === "coffee") { + var _indent = stream.indentation(); + var matched = false; + for (var scope = state.scope; scope; scope = scope.prev) { + if (_indent === scope.offset) { + matched = true; + break; + } + } + if (!matched) { + return true; + } + while (state.scope.prev && state.scope.offset !== _indent) { + state.scope = state.scope.prev; + } + return false; + } else { + state.scope = state.scope.prev; + return false; + } + } + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle scope changes. + if (current === "return") { + state.dedent = true; + } + if (((current === "->" || current === "=>") && stream.eol()) + || style === "indent") { + indent(stream, state); + } + var delimiter_index = "[({".indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + } + if (indentKeywords.exec(current)){ + indent(stream, state); + } + if (current == "then"){ + dedent(stream, state); + } + + + if (style === "dedent") { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = "])}".indexOf(current); + if (delimiter_index !== -1) { + while (state.scope.type == "coffee" && state.scope.prev) + state.scope = state.scope.prev; + if (state.scope.type == current) + state.scope = state.scope.prev; + } + if (state.dedent && stream.eol()) { + if (state.scope.type == "coffee" && state.scope.prev) + state.scope = state.scope.prev; + state.dedent = false; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false}, + prop: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var fillAlign = state.scope.align === null && state.scope; + if (fillAlign && stream.sol()) fillAlign.align = false; + + var style = tokenLexer(stream, state); + if (style && style != "comment") { + if (fillAlign) fillAlign.align = true; + state.prop = style == "punctuation" && stream.current() == "." + } + + return style; + }, + + indent: function(state, text) { + if (state.tokenize != tokenBase) return 0; + var scope = state.scope; + var closer = text && "])}".indexOf(text.charAt(0)) > -1; + if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev; + var closes = closer && scope.type === text.charAt(0); + if (scope.align) + return scope.alignOffset - (closes ? 1 : 0); + else + return (closes ? scope.prev : scope).offset; + }, + + lineComment: "#", + fold: "indent" + }; + return external; +}); + +// IANA registered media type +// https://www.iana.org/assignments/media-types/ +CodeMirror.defineMIME("application/vnd.coffeescript", "coffeescript"); + +CodeMirror.defineMIME("text/x-coffeescript", "coffeescript"); +CodeMirror.defineMIME("text/coffeescript", "coffeescript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js new file mode 100644 index 0000000000..e8528a9cf5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js @@ -0,0 +1,125 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("commonlisp", function (config) { + var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/; + var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/; + var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/; + var symbol = /[^\s'`,@()\[\]";]/; + var type; + + function readSym(stream) { + var ch; + while (ch = stream.next()) { + if (ch == "\\") stream.next(); + else if (!symbol.test(ch)) { stream.backUp(1); break; } + } + return stream.current(); + } + + function base(stream, state) { + if (stream.eatSpace()) {type = "ws"; return null;} + if (stream.match(numLiteral)) return "number"; + var ch = stream.next(); + if (ch == "\\") ch = stream.next(); + + if (ch == '"') return (state.tokenize = inString)(stream, state); + else if (ch == "(") { type = "open"; return "bracket"; } + else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; } + else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; } + else if (/['`,@]/.test(ch)) return null; + else if (ch == "|") { + if (stream.skipTo("|")) { stream.next(); return "symbol"; } + else { stream.skipToEnd(); return "error"; } + } else if (ch == "#") { + var ch = stream.next(); + if (ch == "(") { type = "open"; return "bracket"; } + else if (/[+\-=\.']/.test(ch)) return null; + else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null; + else if (ch == "|") return (state.tokenize = inComment)(stream, state); + else if (ch == ":") { readSym(stream); return "meta"; } + else if (ch == "\\") { stream.next(); readSym(stream); return "string-2" } + else return "error"; + } else { + var name = readSym(stream); + if (name == ".") return null; + type = "symbol"; + if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom"; + if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword"; + if (name.charAt(0) == "&") return "variable-2"; + return "variable"; + } + } + + function inString(stream, state) { + var escaped = false, next; + while (next = stream.next()) { + if (next == '"' && !escaped) { state.tokenize = base; break; } + escaped = !escaped && next == "\\"; + } + return "string"; + } + + function inComment(stream, state) { + var next, last; + while (next = stream.next()) { + if (next == "#" && last == "|") { state.tokenize = base; break; } + last = next; + } + type = "ws"; + return "comment"; + } + + return { + startState: function () { + return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base}; + }, + + token: function (stream, state) { + if (stream.sol() && typeof state.ctx.indentTo != "number") + state.ctx.indentTo = state.ctx.start + 1; + + type = null; + var style = state.tokenize(stream, state); + if (type != "ws") { + if (state.ctx.indentTo == null) { + if (type == "symbol" && assumeBody.test(stream.current())) + state.ctx.indentTo = state.ctx.start + config.indentUnit; + else + state.ctx.indentTo = "next"; + } else if (state.ctx.indentTo == "next") { + state.ctx.indentTo = stream.column(); + } + state.lastType = type; + } + if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; + else if (type == "close") state.ctx = state.ctx.prev || state.ctx; + return style; + }, + + indent: function (state, _textAfter) { + var i = state.ctx.indentTo; + return typeof i == "number" ? i : state.ctx.start + 1; + }, + + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;", + fold: "brace-paren", + blockCommentStart: "#|", + blockCommentEnd: "|#" + }; +}); + +CodeMirror.defineMIME("text/x-common-lisp", "commonlisp"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js new file mode 100644 index 0000000000..5dae5032b4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js @@ -0,0 +1,433 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("crystal", function(config) { + function wordRegExp(words, end) { + return new RegExp((end ? "" : "^") + "(?:" + words.join("|") + ")" + (end ? "$" : "\\b")); + } + + function chain(tokenize, stream, state) { + state.tokenize.push(tokenize); + return tokenize(stream, state); + } + + var operators = /^(?:[-+/%|&^]|\*\*?|[<>]{2})/; + var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/; + var indexingOperators = /^(?:\[\][?=]?)/; + var anotherOperators = /^(?:\.(?:\.{2})?|->|[?:])/; + var idents = /^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; + var types = /^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; + var keywords = wordRegExp([ + "abstract", "alias", "as", "asm", "begin", "break", "case", "class", "def", "do", + "else", "elsif", "end", "ensure", "enum", "extend", "for", "fun", "if", + "include", "instance_sizeof", "lib", "macro", "module", "next", "of", "out", "pointerof", + "private", "protected", "rescue", "return", "require", "select", "sizeof", "struct", + "super", "then", "type", "typeof", "uninitialized", "union", "unless", "until", "when", "while", "with", + "yield", "__DIR__", "__END_LINE__", "__FILE__", "__LINE__" + ]); + var atomWords = wordRegExp(["true", "false", "nil", "self"]); + var indentKeywordsArray = [ + "def", "fun", "macro", + "class", "module", "struct", "lib", "enum", "union", + "do", "for" + ]; + var indentKeywords = wordRegExp(indentKeywordsArray); + var indentExpressionKeywordsArray = ["if", "unless", "case", "while", "until", "begin", "then"]; + var indentExpressionKeywords = wordRegExp(indentExpressionKeywordsArray); + var dedentKeywordsArray = ["end", "else", "elsif", "rescue", "ensure"]; + var dedentKeywords = wordRegExp(dedentKeywordsArray); + var dedentPunctualsArray = ["\\)", "\\}", "\\]"]; + var dedentPunctuals = new RegExp("^(?:" + dedentPunctualsArray.join("|") + ")$"); + var nextTokenizer = { + "def": tokenFollowIdent, "fun": tokenFollowIdent, "macro": tokenMacroDef, + "class": tokenFollowType, "module": tokenFollowType, "struct": tokenFollowType, + "lib": tokenFollowType, "enum": tokenFollowType, "union": tokenFollowType + }; + var matching = {"[": "]", "{": "}", "(": ")", "<": ">"}; + + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + // Macros + if (state.lastToken != "\\" && stream.match("{%", false)) { + return chain(tokenMacro("%", "%"), stream, state); + } + + if (state.lastToken != "\\" && stream.match("{{", false)) { + return chain(tokenMacro("{", "}"), stream, state); + } + + // Comments + if (stream.peek() == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Variables and keywords + var matched; + if (stream.match(idents)) { + stream.eat(/[?!]/); + + matched = stream.current(); + if (stream.eat(":")) { + return "atom"; + } else if (state.lastToken == ".") { + return "property"; + } else if (keywords.test(matched)) { + if (indentKeywords.test(matched)) { + if (!(matched == "fun" && state.blocks.indexOf("lib") >= 0) && !(matched == "def" && state.lastToken == "abstract")) { + state.blocks.push(matched); + state.currentIndent += 1; + } + } else if ((state.lastStyle == "operator" || !state.lastStyle) && indentExpressionKeywords.test(matched)) { + state.blocks.push(matched); + state.currentIndent += 1; + } else if (matched == "end") { + state.blocks.pop(); + state.currentIndent -= 1; + } + + if (nextTokenizer.hasOwnProperty(matched)) { + state.tokenize.push(nextTokenizer[matched]); + } + + return "keyword"; + } else if (atomWords.test(matched)) { + return "atom"; + } + + return "variable"; + } + + // Class variables and instance variables + // or attributes + if (stream.eat("@")) { + if (stream.peek() == "[") { + return chain(tokenNest("[", "]", "meta"), stream, state); + } + + stream.eat("@"); + stream.match(idents) || stream.match(types); + return "variable-2"; + } + + // Constants and types + if (stream.match(types)) { + return "tag"; + } + + // Symbols or ':' operator + if (stream.eat(":")) { + if (stream.eat("\"")) { + return chain(tokenQuote("\"", "atom", false), stream, state); + } else if (stream.match(idents) || stream.match(types) || + stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) { + return "atom"; + } + stream.eat(":"); + return "operator"; + } + + // Strings + if (stream.eat("\"")) { + return chain(tokenQuote("\"", "string", true), stream, state); + } + + // Strings or regexps or macro variables or '%' operator + if (stream.peek() == "%") { + var style = "string"; + var embed = true; + var delim; + + if (stream.match("%r")) { + // Regexps + style = "string-2"; + delim = stream.next(); + } else if (stream.match("%w")) { + embed = false; + delim = stream.next(); + } else if (stream.match("%q")) { + embed = false; + delim = stream.next(); + } else { + if(delim = stream.match(/^%([^\w\s=])/)) { + delim = delim[1]; + } else if (stream.match(/^%[a-zA-Z_\u009F-\uFFFF][\w\u009F-\uFFFF]*/)) { + // Macro variables + return "meta"; + } else if (stream.eat('%')) { + // '%' operator + return "operator"; + } + } + + if (matching.hasOwnProperty(delim)) { + delim = matching[delim]; + } + return chain(tokenQuote(delim, style, embed), stream, state); + } + + // Here Docs + if (matched = stream.match(/^<<-('?)([A-Z]\w*)\1/)) { + return chain(tokenHereDoc(matched[2], !matched[1]), stream, state) + } + + // Characters + if (stream.eat("'")) { + stream.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/); + stream.eat("'"); + return "atom"; + } + + // Numbers + if (stream.eat("0")) { + if (stream.eat("x")) { + stream.match(/^[0-9a-fA-F_]+/); + } else if (stream.eat("o")) { + stream.match(/^[0-7_]+/); + } else if (stream.eat("b")) { + stream.match(/^[01_]+/); + } + return "number"; + } + + if (stream.eat(/^\d/)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?/); + return "number"; + } + + // Operators + if (stream.match(operators)) { + stream.eat("="); // Operators can follow assign symbol. + return "operator"; + } + + if (stream.match(conditionalOperators) || stream.match(anotherOperators)) { + return "operator"; + } + + // Parens and braces + if (matched = stream.match(/[({[]/, false)) { + matched = matched[0]; + return chain(tokenNest(matched, matching[matched], null), stream, state); + } + + // Escapes + if (stream.eat("\\")) { + stream.next(); + return "meta"; + } + + stream.next(); + return null; + } + + function tokenNest(begin, end, style, started) { + return function (stream, state) { + if (!started && stream.match(begin)) { + state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true); + state.currentIndent += 1; + return style; + } + + var nextStyle = tokenBase(stream, state); + if (stream.current() === end) { + state.tokenize.pop(); + state.currentIndent -= 1; + nextStyle = style; + } + + return nextStyle; + }; + } + + function tokenMacro(begin, end, started) { + return function (stream, state) { + if (!started && stream.match("{" + begin)) { + state.currentIndent += 1; + state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true); + return "meta"; + } + + if (stream.match(end + "}")) { + state.currentIndent -= 1; + state.tokenize.pop(); + return "meta"; + } + + return tokenBase(stream, state); + }; + } + + function tokenMacroDef(stream, state) { + if (stream.eatSpace()) { + return null; + } + + var matched; + if (matched = stream.match(idents)) { + if (matched == "def") { + return "keyword"; + } + stream.eat(/[?!]/); + } + + state.tokenize.pop(); + return "def"; + } + + function tokenFollowIdent(stream, state) { + if (stream.eatSpace()) { + return null; + } + + if (stream.match(idents)) { + stream.eat(/[!?]/); + } else { + stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators); + } + state.tokenize.pop(); + return "def"; + } + + function tokenFollowType(stream, state) { + if (stream.eatSpace()) { + return null; + } + + stream.match(types); + state.tokenize.pop(); + return "def"; + } + + function tokenQuote(end, style, embed) { + return function (stream, state) { + var escaped = false; + + while (stream.peek()) { + if (!escaped) { + if (stream.match("{%", false)) { + state.tokenize.push(tokenMacro("%", "%")); + return style; + } + + if (stream.match("{{", false)) { + state.tokenize.push(tokenMacro("{", "}")); + return style; + } + + if (embed && stream.match("#{", false)) { + state.tokenize.push(tokenNest("#{", "}", "meta")); + return style; + } + + var ch = stream.next(); + + if (ch == end) { + state.tokenize.pop(); + return style; + } + + escaped = embed && ch == "\\"; + } else { + stream.next(); + escaped = false; + } + } + + return style; + }; + } + + function tokenHereDoc(phrase, embed) { + return function (stream, state) { + if (stream.sol()) { + stream.eatSpace() + if (stream.match(phrase)) { + state.tokenize.pop(); + return "string"; + } + } + + var escaped = false; + while (stream.peek()) { + if (!escaped) { + if (stream.match("{%", false)) { + state.tokenize.push(tokenMacro("%", "%")); + return "string"; + } + + if (stream.match("{{", false)) { + state.tokenize.push(tokenMacro("{", "}")); + return "string"; + } + + if (embed && stream.match("#{", false)) { + state.tokenize.push(tokenNest("#{", "}", "meta")); + return "string"; + } + + escaped = embed && stream.next() == "\\"; + } else { + stream.next(); + escaped = false; + } + } + + return "string"; + } + } + + return { + startState: function () { + return { + tokenize: [tokenBase], + currentIndent: 0, + lastToken: null, + lastStyle: null, + blocks: [] + }; + }, + + token: function (stream, state) { + var style = state.tokenize[state.tokenize.length - 1](stream, state); + var token = stream.current(); + + if (style && style != "comment") { + state.lastToken = token; + state.lastStyle = style; + } + + return style; + }, + + indent: function (state, textAfter) { + textAfter = textAfter.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g, ""); + + if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) { + return config.indentUnit * (state.currentIndent - 1); + } + + return config.indentUnit * state.currentIndent; + }, + + fold: "indent", + electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true), + lineComment: '#' + }; + }); + + CodeMirror.defineMIME("text/x-crystal", "crystal"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js new file mode 100644 index 0000000000..503c48c261 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js @@ -0,0 +1,866 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("css", function(config, parserConfig) { + var inline = parserConfig.inline + if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); + + var indentUnit = config.indentUnit, + tokenHooks = parserConfig.tokenHooks, + documentTypes = parserConfig.documentTypes || {}, + mediaTypes = parserConfig.mediaTypes || {}, + mediaFeatures = parserConfig.mediaFeatures || {}, + mediaValueKeywords = parserConfig.mediaValueKeywords || {}, + propertyKeywords = parserConfig.propertyKeywords || {}, + nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, + fontProperties = parserConfig.fontProperties || {}, + counterDescriptors = parserConfig.counterDescriptors || {}, + colorKeywords = parserConfig.colorKeywords || {}, + valueKeywords = parserConfig.valueKeywords || {}, + allowNested = parserConfig.allowNested, + lineComment = parserConfig.lineComment, + supportsAtComponent = parserConfig.supportsAtComponent === true, + highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false; + + var type, override; + function ret(style, tp) { type = tp; return style; } + + // Tokenizers + + function tokenBase(stream, state) { + var ch = stream.next(); + if (tokenHooks[ch]) { + var result = tokenHooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == "@") { + stream.eatWhile(/[\w\\\-]/); + return ret("def", stream.current()); + } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { + return ret(null, "compare"); + } else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "#") { + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "hash"); + } else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (ch === "-") { + if (/[\d.]/.test(stream.peek())) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (stream.match(/^-[\w\\\-]*/)) { + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ret("variable-2", "variable-definition"); + return ret("variable-2", "variable"); + } else if (stream.match(/^\w+-/)) { + return ret("meta", "meta"); + } + } else if (/[,+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { + return ret("qualifier", "qualifier"); + } else if (/[:;{}\[\]\(\)]/.test(ch)) { + return ret(null, ch); + } else if (stream.match(/^[\w-.]+(?=\()/)) { + if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) { + state.tokenize = tokenParenthesized; + } + return ret("variable callee", "variable"); + } else if (/[\w\\\-]/.test(ch)) { + stream.eatWhile(/[\w\\\-]/); + return ret("property", "word"); + } else { + return ret(null, null); + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ret("string", "string"); + }; + } + + function tokenParenthesized(stream, state) { + stream.next(); // Must be '(' + if (!stream.match(/^\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return ret(null, "("); + } + + // Context management + + function Context(type, indent, prev) { + this.type = type; + this.indent = indent; + this.prev = prev; + } + + function pushContext(state, stream, type, indent) { + state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); + return type; + } + + function popContext(state) { + if (state.context.prev) + state.context = state.context.prev; + return state.context.type; + } + + function pass(type, stream, state) { + return states[state.context.type](type, stream, state); + } + function popAndPass(type, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type, stream, state); + } + + // Parser + + function wordAsValue(stream) { + var word = stream.current().toLowerCase(); + if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "variable"; + } + + var states = {}; + + states.top = function(type, stream, state) { + if (type == "{") { + return pushContext(state, stream, "block"); + } else if (type == "}" && state.context.prev) { + return popContext(state); + } else if (supportsAtComponent && /@component/i.test(type)) { + return pushContext(state, stream, "atComponentBlock"); + } else if (/^@(-moz-)?document$/i.test(type)) { + return pushContext(state, stream, "documentTypes"); + } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) { + return pushContext(state, stream, "atBlock"); + } else if (/^@(font-face|counter-style)/i.test(type)) { + state.stateArg = type; + return "restricted_atBlock_before"; + } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) { + return "keyframes"; + } else if (type && type.charAt(0) == "@") { + return pushContext(state, stream, "at"); + } else if (type == "hash") { + override = "builtin"; + } else if (type == "word") { + override = "tag"; + } else if (type == "variable-definition") { + return "maybeprop"; + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } else if (type == ":") { + return "pseudo"; + } else if (allowNested && type == "(") { + return pushContext(state, stream, "parens"); + } + return state.context.type; + }; + + states.block = function(type, stream, state) { + if (type == "word") { + var word = stream.current().toLowerCase(); + if (propertyKeywords.hasOwnProperty(word)) { + override = "property"; + return "maybeprop"; + } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + return "maybeprop"; + } else if (allowNested) { + override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; + return "block"; + } else { + override += " error"; + return "maybeprop"; + } + } else if (type == "meta") { + return "block"; + } else if (!allowNested && (type == "hash" || type == "qualifier")) { + override = "error"; + return "block"; + } else { + return states.top(type, stream, state); + } + }; + + states.maybeprop = function(type, stream, state) { + if (type == ":") return pushContext(state, stream, "prop"); + return pass(type, stream, state); + }; + + states.prop = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); + if (type == "}" || type == "{") return popAndPass(type, stream, state); + if (type == "(") return pushContext(state, stream, "parens"); + + if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { + override += " error"; + } else if (type == "word") { + wordAsValue(stream); + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } + return "prop"; + }; + + states.propBlock = function(type, _stream, state) { + if (type == "}") return popContext(state); + if (type == "word") { override = "property"; return "maybeprop"; } + return state.context.type; + }; + + states.parens = function(type, stream, state) { + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == ")") return popContext(state); + if (type == "(") return pushContext(state, stream, "parens"); + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + if (type == "word") wordAsValue(stream); + return "parens"; + }; + + states.pseudo = function(type, stream, state) { + if (type == "meta") return "pseudo"; + + if (type == "word") { + override = "variable-3"; + return state.context.type; + } + return pass(type, stream, state); + }; + + states.documentTypes = function(type, stream, state) { + if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { + override = "tag"; + return state.context.type; + } else { + return states.atBlock(type, stream, state); + } + }; + + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (type == "}" || type == ";") return popAndPass(type, stream, state); + if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); + + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + + if (type == "word") { + var word = stream.current().toLowerCase(); + if (word == "only" || word == "not" || word == "and" || word == "or") + override = "keyword"; + else if (mediaTypes.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures.hasOwnProperty(word)) + override = "property"; + else if (mediaValueKeywords.hasOwnProperty(word)) + override = "keyword"; + else if (propertyKeywords.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + else if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "error"; + } + return state.context.type; + }; + + states.atComponentBlock = function(type, stream, state) { + if (type == "}") + return popAndPass(type, stream, state); + if (type == "{") + return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); + if (type == "word") + override = "error"; + return state.context.type; + }; + + states.atBlock_parens = function(type, stream, state) { + if (type == ")") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); + return states.atBlock(type, stream, state); + }; + + states.restricted_atBlock_before = function(type, stream, state) { + if (type == "{") + return pushContext(state, stream, "restricted_atBlock"); + if (type == "word" && state.stateArg == "@counter-style") { + override = "variable"; + return "restricted_atBlock_before"; + } + return pass(type, stream, state); + }; + + states.restricted_atBlock = function(type, stream, state) { + if (type == "}") { + state.stateArg = null; + return popContext(state); + } + if (type == "word") { + if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || + (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) + override = "error"; + else + override = "property"; + return "maybeprop"; + } + return "restricted_atBlock"; + }; + + states.keyframes = function(type, stream, state) { + if (type == "word") { override = "variable"; return "keyframes"; } + if (type == "{") return pushContext(state, stream, "top"); + return pass(type, stream, state); + }; + + states.at = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == "word") override = "tag"; + else if (type == "hash") override = "builtin"; + return "at"; + }; + + states.interpolation = function(type, stream, state) { + if (type == "}") return popContext(state); + if (type == "{" || type == ";") return popAndPass(type, stream, state); + if (type == "word") override = "variable"; + else if (type != "variable" && type != "(" && type != ")") override = "error"; + return "interpolation"; + }; + + return { + startState: function(base) { + return {tokenize: null, + state: inline ? "block" : "top", + stateArg: null, + context: new Context(inline ? "block" : "top", base || 0, null)}; + }, + + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + if (type != "comment") + state.state = states[state.state](type, stream, state); + return override; + }, + + indent: function(state, textAfter) { + var cx = state.context, ch = textAfter && textAfter.charAt(0); + var indent = cx.indent; + if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; + if (cx.prev) { + if (ch == "}" && (cx.type == "block" || cx.type == "top" || + cx.type == "interpolation" || cx.type == "restricted_atBlock")) { + // Resume indentation from parent context. + cx = cx.prev; + indent = cx.indent; + } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { + // Dedent relative to current context. + indent = Math.max(0, cx.indent - indentUnit); + } + } + return indent; + }, + + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: lineComment, + fold: "brace" + }; +}); + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i].toLowerCase()] = true; + } + return keys; + } + + var documentTypes_ = [ + "domain", "regexp", "url", "url-prefix" + ], documentTypes = keySet(documentTypes_); + + var mediaTypes_ = [ + "all", "aural", "braille", "handheld", "print", "projection", "screen", + "tty", "tv", "embossed" + ], mediaTypes = keySet(mediaTypes_); + + var mediaFeatures_ = [ + "width", "min-width", "max-width", "height", "min-height", "max-height", + "device-width", "min-device-width", "max-device-width", "device-height", + "min-device-height", "max-device-height", "aspect-ratio", + "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", + "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", + "max-color", "color-index", "min-color-index", "max-color-index", + "monochrome", "min-monochrome", "max-monochrome", "resolution", + "min-resolution", "max-resolution", "scan", "grid", "orientation", + "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", + "pointer", "any-pointer", "hover", "any-hover", "prefers-color-scheme", + "dynamic-range", "video-dynamic-range" + ], mediaFeatures = keySet(mediaFeatures_); + + var mediaValueKeywords_ = [ + "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", + "interlace", "progressive", + "dark", "light", + "standard", "high" + ], mediaValueKeywords = keySet(mediaValueKeywords_); + + var propertyKeywords_ = [ + "align-content", "align-items", "align-self", "alignment-adjust", + "alignment-baseline", "all", "anchor-point", "animation", "animation-delay", + "animation-direction", "animation-duration", "animation-fill-mode", + "animation-iteration-count", "animation-name", "animation-play-state", + "animation-timing-function", "appearance", "azimuth", "backdrop-filter", + "backface-visibility", "background", "background-attachment", + "background-blend-mode", "background-clip", "background-color", + "background-image", "background-origin", "background-position", + "background-position-x", "background-position-y", "background-repeat", + "background-size", "baseline-shift", "binding", "bleed", "block-size", + "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", + "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", + "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", + "border-collapse", "border-color", "border-image", "border-image-outset", + "border-image-repeat", "border-image-slice", "border-image-source", + "border-image-width", "border-left", "border-left-color", "border-left-style", + "border-left-width", "border-radius", "border-right", "border-right-color", + "border-right-style", "border-right-width", "border-spacing", "border-style", + "border-top", "border-top-color", "border-top-left-radius", + "border-top-right-radius", "border-top-style", "border-top-width", + "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", + "break-after", "break-before", "break-inside", "caption-side", "caret-color", + "clear", "clip", "color", "color-profile", "column-count", "column-fill", + "column-gap", "column-rule", "column-rule-color", "column-rule-style", + "column-rule-width", "column-span", "column-width", "columns", "contain", + "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", + "cue-before", "cursor", "direction", "display", "dominant-baseline", + "drop-initial-after-adjust", "drop-initial-after-align", + "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", + "drop-initial-value", "elevation", "empty-cells", "fit", "fit-content", "fit-position", + "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", + "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", + "font", "font-family", "font-feature-settings", "font-kerning", + "font-language-override", "font-optical-sizing", "font-size", + "font-size-adjust", "font-stretch", "font-style", "font-synthesis", + "font-variant", "font-variant-alternates", "font-variant-caps", + "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", + "font-variant-position", "font-variation-settings", "font-weight", "gap", + "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", + "grid-column", "grid-column-end", "grid-column-gap", "grid-column-start", + "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", "grid-row-start", + "grid-template", "grid-template-areas", "grid-template-columns", + "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", + "image-orientation", "image-rendering", "image-resolution", "inline-box-align", + "inset", "inset-block", "inset-block-end", "inset-block-start", "inset-inline", + "inset-inline-end", "inset-inline-start", "isolation", "justify-content", + "justify-items", "justify-self", "left", "letter-spacing", "line-break", + "line-height", "line-height-step", "line-stacking", "line-stacking-ruby", + "line-stacking-shift", "line-stacking-strategy", "list-style", + "list-style-image", "list-style-position", "list-style-type", "margin", + "margin-bottom", "margin-left", "margin-right", "margin-top", "marks", + "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", + "marquee-style", "mask-clip", "mask-composite", "mask-image", "mask-mode", + "mask-origin", "mask-position", "mask-repeat", "mask-size","mask-type", + "max-block-size", "max-height", "max-inline-size", + "max-width", "min-block-size", "min-height", "min-inline-size", "min-width", + "mix-blend-mode", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", + "nav-up", "object-fit", "object-position", "offset", "offset-anchor", + "offset-distance", "offset-path", "offset-position", "offset-rotate", + "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", + "outline-style", "outline-width", "overflow", "overflow-style", + "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", + "padding-left", "padding-right", "padding-top", "page", "page-break-after", + "page-break-before", "page-break-inside", "page-policy", "pause", + "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", + "pitch-range", "place-content", "place-items", "place-self", "play-during", + "position", "presentation-level", "punctuation-trim", "quotes", + "region-break-after", "region-break-before", "region-break-inside", + "region-fragment", "rendering-intent", "resize", "rest", "rest-after", + "rest-before", "richness", "right", "rotate", "rotation", "rotation-point", + "row-gap", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", + "scale", "scroll-behavior", "scroll-margin", "scroll-margin-block", + "scroll-margin-block-end", "scroll-margin-block-start", "scroll-margin-bottom", + "scroll-margin-inline", "scroll-margin-inline-end", + "scroll-margin-inline-start", "scroll-margin-left", "scroll-margin-right", + "scroll-margin-top", "scroll-padding", "scroll-padding-block", + "scroll-padding-block-end", "scroll-padding-block-start", + "scroll-padding-bottom", "scroll-padding-inline", "scroll-padding-inline-end", + "scroll-padding-inline-start", "scroll-padding-left", "scroll-padding-right", + "scroll-padding-top", "scroll-snap-align", "scroll-snap-type", + "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", + "size", "speak", "speak-as", "speak-header", "speak-numeral", + "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", + "table-layout", "target", "target-name", "target-new", "target-position", + "text-align", "text-align-last", "text-combine-upright", "text-decoration", + "text-decoration-color", "text-decoration-line", "text-decoration-skip", + "text-decoration-skip-ink", "text-decoration-style", "text-emphasis", + "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", + "text-height", "text-indent", "text-justify", "text-orientation", + "text-outline", "text-overflow", "text-rendering", "text-shadow", + "text-size-adjust", "text-space-collapse", "text-transform", + "text-underline-position", "text-wrap", "top", "touch-action", "transform", "transform-origin", + "transform-style", "transition", "transition-delay", "transition-duration", + "transition-property", "transition-timing-function", "translate", + "unicode-bidi", "user-select", "vertical-align", "visibility", "voice-balance", + "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", + "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", + "will-change", "word-break", "word-spacing", "word-wrap", "writing-mode", "z-index", + // SVG-specific + "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", + "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", + "color-interpolation", "color-interpolation-filters", + "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", + "marker", "marker-end", "marker-mid", "marker-start", "paint-order", "shape-rendering", "stroke", + "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", + "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", + "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", + "glyph-orientation-vertical", "text-anchor", "writing-mode", + ], propertyKeywords = keySet(propertyKeywords_); + + var nonStandardPropertyKeywords_ = [ + "accent-color", "aspect-ratio", "border-block", "border-block-color", "border-block-end", + "border-block-end-color", "border-block-end-style", "border-block-end-width", + "border-block-start", "border-block-start-color", "border-block-start-style", + "border-block-start-width", "border-block-style", "border-block-width", + "border-inline", "border-inline-color", "border-inline-end", + "border-inline-end-color", "border-inline-end-style", + "border-inline-end-width", "border-inline-start", "border-inline-start-color", + "border-inline-start-style", "border-inline-start-width", + "border-inline-style", "border-inline-width", "content-visibility", "margin-block", + "margin-block-end", "margin-block-start", "margin-inline", "margin-inline-end", + "margin-inline-start", "overflow-anchor", "overscroll-behavior", "padding-block", "padding-block-end", + "padding-block-start", "padding-inline", "padding-inline-end", + "padding-inline-start", "scroll-snap-stop", "scrollbar-3d-light-color", + "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", + "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", + "scrollbar-track-color", "searchfield-cancel-button", "searchfield-decoration", + "searchfield-results-button", "searchfield-results-decoration", "shape-inside", "zoom" + ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); + + var fontProperties_ = [ + "font-display", "font-family", "src", "unicode-range", "font-variant", + "font-feature-settings", "font-stretch", "font-weight", "font-style" + ], fontProperties = keySet(fontProperties_); + + var counterDescriptors_ = [ + "additive-symbols", "fallback", "negative", "pad", "prefix", "range", + "speak-as", "suffix", "symbols", "system" + ], counterDescriptors = keySet(counterDescriptors_); + + var colorKeywords_ = [ + "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", + "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", + "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", + "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", + "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", + "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", + "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", + "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", + "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", + "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", + "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", + "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", + "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", + "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", + "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", + "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", + "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", + "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", + "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", + "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", + "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", + "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", + "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", + "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", + "whitesmoke", "yellow", "yellowgreen" + ], colorKeywords = keySet(colorKeywords_); + + var valueKeywords_ = [ + "above", "absolute", "activeborder", "additive", "activecaption", "afar", + "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", + "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", + "arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page", + "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", "bidi-override", "binary", + "bengali", "blink", "block", "block-axis", "blur", "bold", "bolder", "border", "border-box", + "both", "bottom", "break", "break-all", "break-word", "brightness", "bullets", "button", "button-bevel", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", + "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", + "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", + "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", + "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", + "compact", "condensed", "conic-gradient", "contain", "content", "contents", + "content-box", "context-menu", "continuous", "contrast", "copy", "counter", "counters", "cover", "crop", + "cross", "crosshair", "cubic-bezier", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", + "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", + "destination-in", "destination-out", "destination-over", "devanagari", "difference", + "disc", "discard", "disclosure-closed", "disclosure-open", "document", + "dot-dash", "dot-dot-dash", + "dotted", "double", "down", "drop-shadow", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", + "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", + "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", + "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", + "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", + "ethiopic-halehame-gez", "ethiopic-halehame-om-et", + "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", + "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", + "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", + "extra-expanded", "fantasy", "fast", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", + "forwards", "from", "geometricPrecision", "georgian", "grayscale", "graytext", "grid", "groove", + "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", + "help", "hidden", "hide", "higher", "highlight", "highlighttext", + "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "hue-rotate", "icon", "ignore", + "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", + "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", + "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", + "italic", "japanese-formal", "japanese-informal", "justify", "kannada", + "katakana", "katakana-iroha", "keep-all", "khmer", + "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", + "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", + "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", + "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", + "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", + "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "manipulation", "match", "matrix", "matrix3d", + "media-controls-background", "media-current-time-display", + "media-fullscreen-button", "media-mute-button", "media-play-button", + "media-return-to-realtime-button", "media-rewind-button", + "media-seek-back-button", "media-seek-forward-button", "media-slider", + "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", + "media-volume-slider-container", "media-volume-sliderthumb", "medium", + "menu", "menulist", "menulist-button", "menulist-text", + "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", + "mix", "mongolian", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "myanmar", "n-resize", + "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", + "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", + "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote", + "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", + "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", + "painted", "page", "paused", "persian", "perspective", "pinch-zoom", "plus-darker", "plus-lighter", + "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", + "progress", "push-button", "radial-gradient", "radio", "read-only", + "read-write", "read-write-plaintext-only", "rectangle", "region", + "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", + "repeating-conic-gradient", "repeat-x", "repeat-y", "reset", "reverse", + "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", + "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", + "s-resize", "sans-serif", "saturate", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", + "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield", + "searchfield-cancel-button", "searchfield-decoration", + "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end", + "semi-condensed", "semi-expanded", "separate", "sepia", "serif", "show", "sidama", + "simp-chinese-formal", "simp-chinese-informal", "single", + "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", + "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", + "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", + "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", + "square-button", "start", "static", "status-bar", "stretch", "stroke", "stroke-box", "sub", + "subpixel-antialiased", "svg_masks", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", + "table-caption", "table-cell", "table-column", "table-column-group", + "table-footer-group", "table-header-group", "table-row", "table-row-group", + "tamil", + "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", + "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", + "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", + "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", + "trad-chinese-formal", "trad-chinese-informal", "transform", + "translate", "translate3d", "translateX", "translateY", "translateZ", + "transparent", "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up", + "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", + "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", + "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", "visiblePainted", + "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", + "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", + "xx-large", "xx-small" + ], valueKeywords = keySet(valueKeywords_); + + var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) + .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) + .concat(valueKeywords_); + CodeMirror.registerHelper("hintWords", "css", allWords); + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return ["comment", "comment"]; + } + + CodeMirror.defineMIME("text/css", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css" + }); + + CodeMirror.defineMIME("text/x-scss", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + ":": function(stream) { + if (stream.match(/^\s*\{/, false)) + return [null, null] + return false; + }, + "$": function(stream) { + stream.match(/^[\w-]+/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "#": function(stream) { + if (!stream.eat("{")) return false; + return [null, "interpolation"]; + } + }, + name: "css", + helperType: "scss" + }); + + CodeMirror.defineMIME("text/x-less", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + "@": function(stream) { + if (stream.eat("{")) return [null, "interpolation"]; + if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "&": function() { + return ["atom", "atom"]; + } + }, + name: "css", + helperType: "less" + }); + + CodeMirror.defineMIME("text/x-gss", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + supportsAtComponent: true, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css", + helperType: "gss" + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js new file mode 100644 index 0000000000..6203d59984 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js @@ -0,0 +1,152 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// By the Neo4j Team and contributors. +// https://github.com/neo4j-contrib/CodeMirror + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var wordRegexp = function(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + }; + + CodeMirror.defineMode("cypher", function(config) { + var tokenBase = function(stream/*, state*/) { + curPunc = null + var ch = stream.next(); + if (ch ==='"') { + stream.match(/^[^"]*"/); + return "string"; + } + if (ch === "'") { + stream.match(/^[^']*'/); + return "string"; + } + if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return "node"; + } else if (ch === "/" && stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return null; + } else { + stream.eatWhile(/[_\w\d]/); + if (stream.eat(":")) { + stream.eatWhile(/[\w\d_\-]/); + return "atom"; + } + var word = stream.current(); + if (funcs.test(word)) return "builtin"; + if (preds.test(word)) return "def"; + if (keywords.test(word) || systemKeywords.test(word)) return "keyword"; + return "variable"; + } + }; + var pushContext = function(state, type, col) { + return state.context = { + prev: state.context, + indent: state.indent, + col: col, + type: type + }; + }; + var popContext = function(state) { + state.indent = state.context.indent; + return state.context = state.context.prev; + }; + var indentUnit = config.indentUnit; + var curPunc; + var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "reverse", "right", "round", "rtrim", "shortestPath", "sign", "sin", "size", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "toString", "trim", "type", "upper"]); + var preds = wordRegexp(["all", "and", "any", "contains", "exists", "has", "in", "none", "not", "or", "single", "xor"]); + var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "detach", "distinct", "drop", "else", "end", "ends", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "starts", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with", "call", "yield"]); + var systemKeywords = wordRegexp(["access", "active", "assign", "all", "alter", "as", "catalog", "change", "copy", "create", "constraint", "constraints", "current", "database", "databases", "dbms", "default", "deny", "drop", "element", "elements", "exists", "from", "grant", "graph", "graphs", "if", "index", "indexes", "label", "labels", "management", "match", "name", "names", "new", "node", "nodes", "not", "of", "on", "or", "password", "populated", "privileges", "property", "read", "relationship", "relationships", "remove", "replace", "required", "revoke", "role", "roles", "set", "show", "start", "status", "stop", "suspended", "to", "traverse", "type", "types", "user", "users", "with", "write"]); + var operatorChars = /[*+\-<>=&|~%^]/; + + return { + startState: function(/*base*/) { + return { + tokenize: tokenBase, + context: null, + indent: 0, + col: 0 + }; + }, + token: function(stream, state) { + if (stream.sol()) { + if (state.context && (state.context.align == null)) { + state.context.align = false; + } + state.indent = stream.indentation(); + } + if (stream.eatSpace()) { + return null; + } + var style = state.tokenize(stream, state); + if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") { + state.context.align = true; + } + if (curPunc === "(") { + pushContext(state, ")", stream.column()); + } else if (curPunc === "[") { + pushContext(state, "]", stream.column()); + } else if (curPunc === "{") { + pushContext(state, "}", stream.column()); + } else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type === "pattern") { + popContext(state); + } + if (state.context && curPunc === state.context.type) { + popContext(state); + } + } else if (curPunc === "." && state.context && state.context.type === "pattern") { + popContext(state); + } else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) { + pushContext(state, "pattern", stream.column()); + } else if (state.context.type === "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + return style; + }, + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) { + while (context && context.type === "pattern") { + context = context.prev; + } + } + var closing = context && firstChar === context.type; + if (!context) return 0; + if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent; + if (context.align) return context.col + (closing ? 0 : 1); + return context.indent + (closing ? 0 : indentUnit); + } + }; + }); + + CodeMirror.modeExtensions["cypher"] = { + autoFormatLineBreaks: function(text) { + var i, lines, reProcessedPortion; + var lines = text.split("\n"); + var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g; + for (var i = 0; i < lines.length; i++) + lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim(); + return lines.join("\n"); + } + }; + + CodeMirror.defineMIME("application/x-cypher-query", "cypher"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js new file mode 100644 index 0000000000..efab570633 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js @@ -0,0 +1,223 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("d", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + keywords = parserConfig.keywords || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings; + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'" || ch == "`") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("+")) { + state.tokenize = tokenNestedComment; + return tokenNestedComment(stream, state); + } + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "keyword"; + } + if (builtin.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "builtin"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenNestedComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "+"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " + + "out scope struct switch try union unittest version while with"; + + CodeMirror.defineMIME("text/x-d", { + name: "d", + keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " + + "debug default delegate delete deprecated export extern final finally function goto immutable " + + "import inout invariant is lazy macro module new nothrow override package pragma private " + + "protected public pure ref return shared short static super synchronized template this " + + "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " + + blockKeywords), + blockKeywords: words(blockKeywords), + builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " + + "ucent uint ulong ushort wchar wstring void size_t sizediff_t"), + atoms: words("exit failure success true false null"), + hooks: { + "@": function(stream, _state) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js new file mode 100644 index 0000000000..fe64517a5e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js @@ -0,0 +1,166 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var keywords = ("this super static final const abstract class extends external factory " + + "implements mixin get native set typedef with enum throw rethrow " + + "assert break case continue default in return new deferred async await covariant " + + "try catch finally do else for if switch while import library export " + + "part of show hide is as extension on yield late required").split(" "); + var blockKeywords = "try catch finally do else for if switch while".split(" "); + var atoms = "true false null".split(" "); + var builtins = "void bool num int double dynamic var String Null Never".split(" "); + + function set(words) { + var obj = {}; + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function pushInterpolationStack(state) { + (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize); + } + + function popInterpolationStack(state) { + return (state.interpolationStack || (state.interpolationStack = [])).pop(); + } + + function sizeInterpolationStack(state) { + return state.interpolationStack ? state.interpolationStack.length : 0; + } + + CodeMirror.defineMIME("application/dart", { + name: "clike", + keywords: set(keywords), + blockKeywords: set(blockKeywords), + builtin: set(builtins), + atoms: set(atoms), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_\.]/); + return "meta"; + }, + + // custom string handling to deal with triple-quoted strings and string interpolation + "'": function(stream, state) { + return tokenString("'", stream, state, false); + }, + "\"": function(stream, state) { + return tokenString("\"", stream, state, false); + }, + "r": function(stream, state) { + var peek = stream.peek(); + if (peek == "'" || peek == "\"") { + return tokenString(stream.next(), stream, state, true); + } + return false; + }, + + "}": function(_stream, state) { + // "}" is end of interpolation, if interpolation stack is non-empty + if (sizeInterpolationStack(state) > 0) { + state.tokenize = popInterpolationStack(state); + return null; + } + return false; + }, + + "/": function(stream, state) { + if (!stream.eat("*")) return false + state.tokenize = tokenNestedComment(1) + return state.tokenize(stream, state) + }, + token: function(stream, _, style) { + if (style == "variable") { + // Assume uppercase symbols are classes using variable-2 + var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g'); + if (isUpper.test(stream.current())) { + return 'variable-2'; + } + } + } + } + }); + + function tokenString(quote, stream, state, raw) { + var tripleQuoted = false; + if (stream.eat(quote)) { + if (stream.eat(quote)) tripleQuoted = true; + else return "string"; //empty string + } + function tokenStringHelper(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!raw && !escaped && stream.peek() == "$") { + pushInterpolationStack(state); + state.tokenize = tokenInterpolation; + return "string"; + } + var next = stream.next(); + if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) { + state.tokenize = null; + break; + } + escaped = !raw && !escaped && next == "\\"; + } + return "string"; + } + state.tokenize = tokenStringHelper; + return tokenStringHelper(stream, state); + } + + function tokenInterpolation(stream, state) { + stream.eat("$"); + if (stream.eat("{")) { + // let clike handle the content of ${...}, + // we take over again when "}" appears (see hooks). + state.tokenize = null; + } else { + state.tokenize = tokenInterpolationIdentifier; + } + return null; + } + + function tokenInterpolationIdentifier(stream, state) { + stream.eatWhile(/[\w_]/); + state.tokenize = popInterpolationStack(state); + return "variable"; + } + + function tokenNestedComment(depth) { + return function (stream, state) { + var ch + while (ch = stream.next()) { + if (ch == "*" && stream.eat("/")) { + if (depth == 1) { + state.tokenize = null + break + } else { + state.tokenize = tokenNestedComment(depth - 1) + return state.tokenize(stream, state) + } + } else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenNestedComment(depth + 1) + return state.tokenize(stream, state) + } + } + return "comment" + } + } + + CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); + + // This is needed to make loading through meta.js work. + CodeMirror.defineMode("dart", function(conf) { + return CodeMirror.getMode(conf, "application/dart"); + }, "clike"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js new file mode 100644 index 0000000000..a30fd37a50 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js @@ -0,0 +1,47 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("diff", function() { + + var TOKEN_NAMES = { + '+': 'positive', + '-': 'negative', + '@': 'meta' + }; + + return { + token: function(stream) { + var tw_pos = stream.string.search(/[\t ]+?$/); + + if (!stream.sol() || tw_pos === 0) { + stream.skipToEnd(); + return ("error " + ( + TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); + } + + var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); + + if (tw_pos === -1) { + stream.skipToEnd(); + } else { + stream.pos = tw_pos; + } + + return token_name; + } + }; +}); + +CodeMirror.defineMIME("text/x-diff", "diff"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js new file mode 100644 index 0000000000..07be123986 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js @@ -0,0 +1,356 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("django:inner", function() { + var keywords = ["block", "endblock", "for", "endfor", "true", "false", "filter", "endfilter", + "loop", "none", "self", "super", "if", "elif", "endif", "as", "else", "import", + "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal", + "endifnotequal", "extends", "include", "load", "comment", "endcomment", + "empty", "url", "static", "trans", "blocktrans", "endblocktrans", "now", + "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle", + "csrf_token", "autoescape", "endautoescape", "spaceless", "endspaceless", + "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"], + filters = ["add", "addslashes", "capfirst", "center", "cut", "date", + "default", "default_if_none", "dictsort", + "dictsortreversed", "divisibleby", "escape", "escapejs", + "filesizeformat", "first", "floatformat", "force_escape", + "get_digit", "iriencode", "join", "last", "length", + "length_is", "linebreaks", "linebreaksbr", "linenumbers", + "ljust", "lower", "make_list", "phone2numeric", "pluralize", + "pprint", "random", "removetags", "rjust", "safe", + "safeseq", "slice", "slugify", "stringformat", "striptags", + "time", "timesince", "timeuntil", "title", "truncatechars", + "truncatechars_html", "truncatewords", "truncatewords_html", + "unordered_list", "upper", "urlencode", "urlize", + "urlizetrunc", "wordcount", "wordwrap", "yesno"], + operators = ["==", "!=", "<", ">", "<=", ">="], + wordOperators = ["in", "not", "or", "and"]; + + keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b"); + filters = new RegExp("^\\b(" + filters.join("|") + ")\\b"); + operators = new RegExp("^\\b(" + operators.join("|") + ")\\b"); + wordOperators = new RegExp("^\\b(" + wordOperators.join("|") + ")\\b"); + + // We have to return "null" instead of null, in order to avoid string + // styling as the default, when using Django templates inside HTML + // element attributes + function tokenBase (stream, state) { + // Attempt to identify a variable, template or comment tag respectively + if (stream.match("{{")) { + state.tokenize = inVariable; + return "tag"; + } else if (stream.match("{%")) { + state.tokenize = inTag; + return "tag"; + } else if (stream.match("{#")) { + state.tokenize = inComment; + return "comment"; + } + + // Ignore completely any stream series that do not match the + // Django template opening tags. + while (stream.next() != null && !stream.match(/\{[{%#]/, false)) {} + return null; + } + + // A string can be included in either single or double quotes (this is + // the delimiter). Mark everything as a string until the start delimiter + // occurs again. + function inString (delimiter, previousTokenizer) { + return function (stream, state) { + if (!state.escapeNext && stream.eat(delimiter)) { + state.tokenize = previousTokenizer; + } else { + if (state.escapeNext) { + state.escapeNext = false; + } + + var ch = stream.next(); + + // Take into account the backslash for escaping characters, such as + // the string delimiter. + if (ch == "\\") { + state.escapeNext = true; + } + } + + return "string"; + }; + } + + // Apply Django template variable syntax highlighting + function inVariable (stream, state) { + // Attempt to match a dot that precedes a property + if (state.waitDot) { + state.waitDot = false; + + if (stream.peek() != ".") { + return "null"; + } + + // Dot followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat(".")) { + state.waitProperty = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for property."); + } + } + + // Attempt to match a pipe that precedes a filter + if (state.waitPipe) { + state.waitPipe = false; + + if (stream.peek() != "|") { + return "null"; + } + + // Pipe followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat("|")) { + state.waitFilter = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for filter."); + } + } + + // Highlight properties + if (state.waitProperty) { + state.waitProperty = false; + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; // A property can be followed by another property + state.waitPipe = true; // A property can be followed by a filter + return "property"; + } + } + + // Highlight filters + if (state.waitFilter) { + state.waitFilter = false; + if (stream.match(filters)) { + return "variable-2"; + } + } + + // Ignore all white spaces + if (stream.eatSpace()) { + state.waitProperty = false; + return "null"; + } + + // Identify numbers + if (stream.match(/\b\d+(\.\d+)?\b/)) { + return "number"; + } + + // Identify strings + if (stream.match("'")) { + state.tokenize = inString("'", state.tokenize); + return "string"; + } else if (stream.match('"')) { + state.tokenize = inString('"', state.tokenize); + return "string"; + } + + // Attempt to find the variable + if (stream.match(/\b(\w+)\b/) && !state.foundVariable) { + state.waitDot = true; + state.waitPipe = true; // A property can be followed by a filter + return "variable"; + } + + // If found closing tag reset + if (stream.match("}}")) { + state.waitProperty = null; + state.waitFilter = null; + state.waitDot = null; + state.waitPipe = null; + state.tokenize = tokenBase; + return "tag"; + } + + // If nothing was found, advance to the next character + stream.next(); + return "null"; + } + + function inTag (stream, state) { + // Attempt to match a dot that precedes a property + if (state.waitDot) { + state.waitDot = false; + + if (stream.peek() != ".") { + return "null"; + } + + // Dot followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat(".")) { + state.waitProperty = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for property."); + } + } + + // Attempt to match a pipe that precedes a filter + if (state.waitPipe) { + state.waitPipe = false; + + if (stream.peek() != "|") { + return "null"; + } + + // Pipe followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat("|")) { + state.waitFilter = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for filter."); + } + } + + // Highlight properties + if (state.waitProperty) { + state.waitProperty = false; + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; // A property can be followed by another property + state.waitPipe = true; // A property can be followed by a filter + return "property"; + } + } + + // Highlight filters + if (state.waitFilter) { + state.waitFilter = false; + if (stream.match(filters)) { + return "variable-2"; + } + } + + // Ignore all white spaces + if (stream.eatSpace()) { + state.waitProperty = false; + return "null"; + } + + // Identify numbers + if (stream.match(/\b\d+(\.\d+)?\b/)) { + return "number"; + } + + // Identify strings + if (stream.match("'")) { + state.tokenize = inString("'", state.tokenize); + return "string"; + } else if (stream.match('"')) { + state.tokenize = inString('"', state.tokenize); + return "string"; + } + + // Attempt to match an operator + if (stream.match(operators)) { + return "operator"; + } + + // Attempt to match a word operator + if (stream.match(wordOperators)) { + return "keyword"; + } + + // Attempt to match a keyword + var keywordMatch = stream.match(keywords); + if (keywordMatch) { + if (keywordMatch[0] == "comment") { + state.blockCommentTag = true; + } + return "keyword"; + } + + // Attempt to match a variable + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; + state.waitPipe = true; // A property can be followed by a filter + return "variable"; + } + + // If found closing tag reset + if (stream.match("%}")) { + state.waitProperty = null; + state.waitFilter = null; + state.waitDot = null; + state.waitPipe = null; + // If the tag that closes is a block comment tag, we want to mark the + // following code as comment, until the tag closes. + if (state.blockCommentTag) { + state.blockCommentTag = false; // Release the "lock" + state.tokenize = inBlockComment; + } else { + state.tokenize = tokenBase; + } + return "tag"; + } + + // If nothing was found, advance to the next character + stream.next(); + return "null"; + } + + // Mark everything as comment inside the tag and the tag itself. + function inComment (stream, state) { + if (stream.match(/^.*?#\}/)) state.tokenize = tokenBase + else stream.skipToEnd() + return "comment"; + } + + // Mark everything as a comment until the `blockcomment` tag closes. + function inBlockComment (stream, state) { + if (stream.match(/\{%\s*endcomment\s*%\}/, false)) { + state.tokenize = inTag; + stream.match("{%"); + return "tag"; + } else { + stream.next(); + return "comment"; + } + } + + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + }, + blockCommentStart: "{% comment %}", + blockCommentEnd: "{% endcomment %}" + }; + }); + + CodeMirror.defineMode("django", function(config) { + var htmlBase = CodeMirror.getMode(config, "text/html"); + var djangoInner = CodeMirror.getMode(config, "django:inner"); + return CodeMirror.overlayMode(htmlBase, djangoInner); + }); + + CodeMirror.defineMIME("text/x-django", "django"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js new file mode 100644 index 0000000000..983170f519 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js @@ -0,0 +1,211 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var from = "from"; + var fromRegex = new RegExp("^(\\s*)\\b(" + from + ")\\b", "i"); + + var shells = ["run", "cmd", "entrypoint", "shell"]; + var shellsAsArrayRegex = new RegExp("^(\\s*)(" + shells.join('|') + ")(\\s+\\[)", "i"); + + var expose = "expose"; + var exposeRegex = new RegExp("^(\\s*)(" + expose + ")(\\s+)", "i"); + + var others = [ + "arg", "from", "maintainer", "label", "env", + "add", "copy", "volume", "user", + "workdir", "onbuild", "stopsignal", "healthcheck", "shell" + ]; + + // Collect all Dockerfile directives + var instructions = [from, expose].concat(shells).concat(others), + instructionRegex = "(" + instructions.join('|') + ")", + instructionOnlyLine = new RegExp("^(\\s*)" + instructionRegex + "(\\s*)(#.*)?$", "i"), + instructionWithArguments = new RegExp("^(\\s*)" + instructionRegex + "(\\s+)", "i"); + + CodeMirror.defineSimpleMode("dockerfile", { + start: [ + // Block comment: This is a line starting with a comment + { + regex: /^\s*#.*$/, + sol: true, + token: "comment" + }, + { + regex: fromRegex, + token: [null, "keyword"], + sol: true, + next: "from" + }, + // Highlight an instruction without any arguments (for convenience) + { + regex: instructionOnlyLine, + token: [null, "keyword", null, "error"], + sol: true + }, + { + regex: shellsAsArrayRegex, + token: [null, "keyword", null], + sol: true, + next: "array" + }, + { + regex: exposeRegex, + token: [null, "keyword", null], + sol: true, + next: "expose" + }, + // Highlight an instruction followed by arguments + { + regex: instructionWithArguments, + token: [null, "keyword", null], + sol: true, + next: "arguments" + }, + { + regex: /./, + token: null + } + ], + from: [ + { + regex: /\s*$/, + token: null, + next: "start" + }, + { + // Line comment without instruction arguments is an error + regex: /(\s*)(#.*)$/, + token: [null, "error"], + next: "start" + }, + { + regex: /(\s*\S+\s+)(as)/i, + token: [null, "keyword"], + next: "start" + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + single: [ + { + regex: /(?:[^\\']|\\.)/, + token: "string" + }, + { + regex: /'/, + token: "string", + pop: true + } + ], + double: [ + { + regex: /(?:[^\\"]|\\.)/, + token: "string" + }, + { + regex: /"/, + token: "string", + pop: true + } + ], + array: [ + { + regex: /\]/, + token: null, + next: "start" + }, + { + regex: /"(?:[^\\"]|\\.)*"?/, + token: "string" + } + ], + expose: [ + { + regex: /\d+$/, + token: "number", + next: "start" + }, + { + regex: /[^\d]+$/, + token: null, + next: "start" + }, + { + regex: /\d+/, + token: "number" + }, + { + regex: /[^\d]+/, + token: null + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + arguments: [ + { + regex: /^\s*#.*$/, + sol: true, + token: "comment" + }, + { + regex: /"(?:[^\\"]|\\.)*"?$/, + token: "string", + next: "start" + }, + { + regex: /"/, + token: "string", + push: "double" + }, + { + regex: /'(?:[^\\']|\\.)*'?$/, + token: "string", + next: "start" + }, + { + regex: /'/, + token: "string", + push: "single" + }, + { + regex: /[^#"']+[\\`]$/, + token: null + }, + { + regex: /[^#"']+$/, + token: null, + next: "start" + }, + { + regex: /[^#"']+/, + token: null + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + meta: { + lineComment: "#" + } + }); + + CodeMirror.defineMIME("text/x-dockerfile", "dockerfile"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js new file mode 100644 index 0000000000..1bff91cbab --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js @@ -0,0 +1,142 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + DTD mode + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("dtd", function(config) { + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch == "<" && stream.eat("!") ) { + if (stream.eatWhile(/[\-]/)) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent"); + } else if (ch == "<" && stream.eat("?")) { //xml declaration + state.tokenize = inBlock("meta", "?>"); + return ret("meta", ch); + } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag"); + else if (ch == "|") return ret("keyword", "separator"); + else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else + else if (ch.match(/[\[\]]/)) return ret("rule", ch); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) { + var sc = stream.current(); + if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1); + return ret("tag", "tag"); + } else if (ch == "%" || ch == "*" ) return ret("number", "number"); + else { + stream.eatWhile(/[\w\\\-_%.{,]/); + return ret(null, null); + } + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return ret("string", "tag"); + }; + } + + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = tokenBase; + break; + } + stream.next(); + } + return style; + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule"); + else if (type === "endtag") state.stack[state.stack.length-1] = "endtag"; + else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop(); + else if (type == "[") state.stack.push("["); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + + if( textAfter.charAt(0) === ']' )n--; + else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){ + if(textAfter.substr(0,1) === "<") {} + else if( type == "doindent" && textAfter.length > 1 ) {} + else if( type == "doindent")n--; + else if( type == ">" && textAfter.length > 1) {} + else if( type == "tag" && textAfter !== ">") {} + else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--; + else if( type == "tag")n++; + else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--; + else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule") {} + else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1; + else if( textAfter === ">") {} + else n=n-1; + //over rule them all + if(type == null || type == "]")n--; + } + + return state.baseIndent + n * indentUnit; + }, + + electricChars: "]>" + }; +}); + +CodeMirror.defineMIME("application/xml-dtd", "dtd"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js new file mode 100644 index 0000000000..6725edccc0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js @@ -0,0 +1,352 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function forEach(arr, f) { + for (var i = 0; i < arr.length; i++) f(arr[i], i) +} +function some(arr, f) { + for (var i = 0; i < arr.length; i++) if (f(arr[i], i)) return true + return false +} + +CodeMirror.defineMode("dylan", function(_config) { + // Words + var words = { + // Words that introduce unnamed definitions like "define interface" + unnamedDefinition: ["interface"], + + // Words that introduce simple named definitions like "define library" + namedDefinition: ["module", "library", "macro", + "C-struct", "C-union", + "C-function", "C-callable-wrapper" + ], + + // Words that introduce type definitions like "define class". + // These are also parameterized like "define method" and are + // appended to otherParameterizedDefinitionWords + typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"], + + // Words that introduce trickier definitions like "define method". + // These require special definitions to be added to startExpressions + otherParameterizedDefinition: ["method", "function", + "C-variable", "C-address" + ], + + // Words that introduce module constant definitions. + // These must also be simple definitions and are + // appended to otherSimpleDefinitionWords + constantSimpleDefinition: ["constant"], + + // Words that introduce module variable definitions. + // These must also be simple definitions and are + // appended to otherSimpleDefinitionWords + variableSimpleDefinition: ["variable"], + + // Other words that introduce simple definitions + // (without implicit bodies). + otherSimpleDefinition: ["generic", "domain", + "C-pointer-type", + "table" + ], + + // Words that begin statements with implicit bodies. + statement: ["if", "block", "begin", "method", "case", + "for", "select", "when", "unless", "until", + "while", "iterate", "profiling", "dynamic-bind" + ], + + // Patterns that act as separators in compound statements. + // This may include any general pattern that must be indented + // specially. + separator: ["finally", "exception", "cleanup", "else", + "elseif", "afterwards" + ], + + // Keywords that do not require special indentation handling, + // but which should be highlighted + other: ["above", "below", "by", "from", "handler", "in", + "instance", "let", "local", "otherwise", "slot", + "subclass", "then", "to", "keyed-by", "virtual" + ], + + // Condition signaling function calls + signalingCalls: ["signal", "error", "cerror", + "break", "check-type", "abort" + ] + }; + + words["otherDefinition"] = + words["unnamedDefinition"] + .concat(words["namedDefinition"]) + .concat(words["otherParameterizedDefinition"]); + + words["definition"] = + words["typeParameterizedDefinition"] + .concat(words["otherDefinition"]); + + words["parameterizedDefinition"] = + words["typeParameterizedDefinition"] + .concat(words["otherParameterizedDefinition"]); + + words["simpleDefinition"] = + words["constantSimpleDefinition"] + .concat(words["variableSimpleDefinition"]) + .concat(words["otherSimpleDefinition"]); + + words["keyword"] = + words["statement"] + .concat(words["separator"]) + .concat(words["other"]); + + // Patterns + var symbolPattern = "[-_a-zA-Z?!*@<>$%]+"; + var symbol = new RegExp("^" + symbolPattern); + var patterns = { + // Symbols with special syntax + symbolKeyword: symbolPattern + ":", + symbolClass: "<" + symbolPattern + ">", + symbolGlobal: "\\*" + symbolPattern + "\\*", + symbolConstant: "\\$" + symbolPattern + }; + var patternStyles = { + symbolKeyword: "atom", + symbolClass: "tag", + symbolGlobal: "variable-2", + symbolConstant: "variable-3" + }; + + // Compile all patterns to regular expressions + for (var patternName in patterns) + if (patterns.hasOwnProperty(patternName)) + patterns[patternName] = new RegExp("^" + patterns[patternName]); + + // Names beginning "with-" and "without-" are commonly + // used as statement macro + patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/]; + + var styles = {}; + styles["keyword"] = "keyword"; + styles["definition"] = "def"; + styles["simpleDefinition"] = "def"; + styles["signalingCalls"] = "builtin"; + + // protected words lookup table + var wordLookup = {}; + var styleLookup = {}; + + forEach([ + "keyword", + "definition", + "simpleDefinition", + "signalingCalls" + ], function(type) { + forEach(words[type], function(word) { + wordLookup[word] = type; + styleLookup[word] = styles[type]; + }); + }); + + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenBase(stream, state) { + // String + var ch = stream.peek(); + if (ch == "'" || ch == '"') { + stream.next(); + return chain(stream, state, tokenString(ch, "string")); + } + // Comment + else if (ch == "/") { + stream.next(); + if (stream.eat("*")) { + return chain(stream, state, tokenComment); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + stream.backUp(1); + } + // Decimal + else if (/[+\-\d\.]/.test(ch)) { + if (stream.match(/^[+-]?[0-9]*\.[0-9]*([esdx][+-]?[0-9]+)?/i) || + stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) || + stream.match(/^[+-]?\d+/)) { + return "number"; + } + } + // Hash + else if (ch == "#") { + stream.next(); + // Symbol with string syntax + ch = stream.peek(); + if (ch == '"') { + stream.next(); + return chain(stream, state, tokenString('"', "string")); + } + // Binary number + else if (ch == "b") { + stream.next(); + stream.eatWhile(/[01]/); + return "number"; + } + // Hex number + else if (ch == "x") { + stream.next(); + stream.eatWhile(/[\da-f]/i); + return "number"; + } + // Octal number + else if (ch == "o") { + stream.next(); + stream.eatWhile(/[0-7]/); + return "number"; + } + // Token concatenation in macros + else if (ch == '#') { + stream.next(); + return "punctuation"; + } + // Sequence literals + else if ((ch == '[') || (ch == '(')) { + stream.next(); + return "bracket"; + // Hash symbol + } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) { + return "atom"; + } else { + stream.eatWhile(/[-a-zA-Z]/); + return "error"; + } + } else if (ch == "~") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + return "operator"; + } + return "operator"; + } + return "operator"; + } else if (ch == ":") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + return "operator"; + } else if (ch == ":") { + stream.next(); + return "punctuation"; + } + } else if ("[](){}".indexOf(ch) != -1) { + stream.next(); + return "bracket"; + } else if (".,".indexOf(ch) != -1) { + stream.next(); + return "punctuation"; + } else if (stream.match("end")) { + return "keyword"; + } + for (var name in patterns) { + if (patterns.hasOwnProperty(name)) { + var pattern = patterns[name]; + if ((pattern instanceof Array && some(pattern, function(p) { + return stream.match(p); + })) || stream.match(pattern)) + return patternStyles[name]; + } + } + if (/[+\-*\/^=<>&|]/.test(ch)) { + stream.next(); + return "operator"; + } + if (stream.match("define")) { + return "def"; + } else { + stream.eatWhile(/[\w\-]/); + // Keyword + if (wordLookup.hasOwnProperty(stream.current())) { + return styleLookup[stream.current()]; + } else if (stream.current().match(symbol)) { + return "variable"; + } else { + stream.next(); + return "variable-2"; + } + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; + while ((ch = stream.next())) { + if (ch == "/" && maybeEnd) { + if (nestedCount > 0) { + nestedCount--; + } else { + state.tokenize = tokenBase; + break; + } + } else if (ch == "*" && maybeNested) { + nestedCount++; + } + maybeEnd = (ch == "*"); + maybeNested = (ch == "/"); + } + return "comment"; + } + + function tokenString(quote, style) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) { + state.tokenize = tokenBase; + } + return style; + }; + } + + // Interface + return { + startState: function() { + return { + tokenize: tokenBase, + currentIndent: 0 + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) + return null; + var style = state.tokenize(stream, state); + return style; + }, + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +CodeMirror.defineMIME("text/x-dylan", "dylan"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js new file mode 100644 index 0000000000..d8fb3f3a2f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ebnf", function (config) { + var commentType = {slash: 0, parenthesis: 1}; + var stateType = {comment: 0, _string: 1, characterClass: 2}; + var bracesMode = null; + + if (config.bracesMode) + bracesMode = CodeMirror.getMode(config, config.bracesMode); + + return { + startState: function () { + return { + stringType: null, + commentType: null, + braced: 0, + lhs: true, + localState: null, + stack: [], + inDefinition: false + }; + }, + token: function (stream, state) { + if (!stream) return; + + //check for state changes + if (state.stack.length === 0) { + //strings + if ((stream.peek() == '"') || (stream.peek() == "'")) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.stack.unshift(stateType._string); + } else if (stream.match('/*')) { //comments starting with /* + state.stack.unshift(stateType.comment); + state.commentType = commentType.slash; + } else if (stream.match('(*')) { //comments starting with (* + state.stack.unshift(stateType.comment); + state.commentType = commentType.parenthesis; + } + } + + //return state + //stack has + switch (state.stack[0]) { + case stateType._string: + while (state.stack[0] === stateType._string && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.stack.shift(); // Clear flag + } else if (stream.peek() === "\\") { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + + case stateType.comment: + while (state.stack[0] === stateType.comment && !stream.eol()) { + if (state.commentType === commentType.slash && stream.match('*/')) { + state.stack.shift(); // Clear flag + state.commentType = null; + } else if (state.commentType === commentType.parenthesis && stream.match('*)')) { + state.stack.shift(); // Clear flag + state.commentType = null; + } else { + stream.match(/^.[^\*]*/); + } + } + return "comment"; + + case stateType.characterClass: + while (state.stack[0] === stateType.characterClass && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match('.'))) { + state.stack.shift(); + } + } + return "operator"; + } + + var peek = stream.peek(); + + if (bracesMode !== null && (state.braced || peek === "{")) { + if (state.localState === null) + state.localState = CodeMirror.startState(bracesMode); + + var token = bracesMode.token(stream, state.localState), + text = stream.current(); + + if (!token) { + for (var i = 0; i < text.length; i++) { + if (text[i] === "{") { + if (state.braced === 0) { + token = "matchingbracket"; + } + state.braced++; + } else if (text[i] === "}") { + state.braced--; + if (state.braced === 0) { + token = "matchingbracket"; + } + } + } + } + return token; + } + + //no stack + switch (peek) { + case "[": + stream.next(); + state.stack.unshift(stateType.characterClass); + return "bracket"; + case ":": + case "|": + case ";": + stream.next(); + return "operator"; + case "%": + if (stream.match("%%")) { + return "header"; + } else if (stream.match(/[%][A-Za-z]+/)) { + return "keyword"; + } else if (stream.match(/[%][}]/)) { + return "matchingbracket"; + } + break; + case "/": + if (stream.match(/[\/][A-Za-z]+/)) { + return "keyword"; + } + case "\\": + if (stream.match(/[\][a-z]+/)) { + return "string-2"; + } + case ".": + if (stream.match(".")) { + return "atom"; + } + case "*": + case "-": + case "+": + case "^": + if (stream.match(peek)) { + return "atom"; + } + case "$": + if (stream.match("$$")) { + return "builtin"; + } else if (stream.match(/[$][0-9]+/)) { + return "variable-3"; + } + case "<": + if (stream.match(/<<[a-zA-Z_]+>>/)) { + return "builtin"; + } + } + + if (stream.match('//')) { + stream.skipToEnd(); + return "comment"; + } else if (stream.match('return')) { + return "operator"; + } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) { + if (stream.match(/(?=[\(.])/)) { + return "variable"; + } else if (stream.match(/(?=[\s\n]*[:=])/)) { + return "def"; + } + return "variable-2"; + } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) { + stream.next(); + return "bracket"; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; + }); + + CodeMirror.defineMIME("text/x-ebnf", "ebnf"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js new file mode 100644 index 0000000000..9af8aee180 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js @@ -0,0 +1,206 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ecl", function(config) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function metaHook(stream, state) { + if (!state.startOfLine) return false; + stream.skipToEnd(); + return "meta"; + } + + var indentUnit = config.indentUnit; + var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode"); + var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait"); + var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath"); + var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode"); + var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when"); + var blockKeywords = words("catch class do else finally for if switch try while"); + var atoms = words("true false null"); + var hooks = {"#": metaHook}; + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var cur = stream.current().toLowerCase(); + if (keyword.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "keyword"; + } else if (variable.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable"; + } else if (variable_2.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable-2"; + } else if (variable_3.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable-3"; + } else if (builtin.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "builtin"; + } else { //Data types are of from KEYWORD## + var i = cur.length - 1; + while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_')) + --i; + + if (i > 0) { + var cur2 = cur.substr(0, i + 1); + if (variable_3.propertyIsEnumerable(cur2)) { + if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement"; + return "variable-3"; + } + } + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return null; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !escaped) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}" + }; +}); + +CodeMirror.defineMIME("text/x-ecl", "ecl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js new file mode 100644 index 0000000000..f6f3f458b6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("eiffel", function() { + function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; + } + var keywords = wordObj([ + 'note', + 'across', + 'when', + 'variant', + 'until', + 'unique', + 'undefine', + 'then', + 'strip', + 'select', + 'retry', + 'rescue', + 'require', + 'rename', + 'reference', + 'redefine', + 'prefix', + 'once', + 'old', + 'obsolete', + 'loop', + 'local', + 'like', + 'is', + 'inspect', + 'infix', + 'include', + 'if', + 'frozen', + 'from', + 'external', + 'export', + 'ensure', + 'end', + 'elseif', + 'else', + 'do', + 'creation', + 'create', + 'check', + 'alias', + 'agent', + 'separate', + 'invariant', + 'inherit', + 'indexing', + 'feature', + 'expanded', + 'deferred', + 'class', + 'Void', + 'True', + 'Result', + 'Precursor', + 'False', + 'Current', + 'create', + 'attached', + 'detachable', + 'as', + 'and', + 'implies', + 'not', + 'or' + ]); + var operators = wordObj([":=", "and then","and", "or","<<",">>"]); + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + var ch = stream.next(); + if (ch == '"'||ch == "'") { + return chain(readQuoted(ch, "string"), stream, state); + } else if (ch == "-"&&stream.eat("-")) { + stream.skipToEnd(); + return "comment"; + } else if (ch == ":"&&stream.eat("=")) { + return "operator"; + } else if (/[0-9]/.test(ch)) { + stream.eatWhile(/[xXbBCc0-9\.]/); + stream.eat(/[\?\!]/); + return "ident"; + } else if (/[a-zA-Z_0-9]/.test(ch)) { + stream.eatWhile(/[a-zA-Z_0-9]/); + stream.eat(/[\?\!]/); + return "ident"; + } else if (/[=+\-\/*^%<>~]/.test(ch)) { + stream.eatWhile(/[=+\-\/*^%<>~]/); + return "operator"; + } else { + return null; + } + } + + function readQuoted(quote, style, unescaped) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + escaped = !escaped && ch == "%"; + } + return style; + }; + } + + return { + startState: function() { + return {tokenize: [tokenBase]}; + }, + + token: function(stream, state) { + var style = state.tokenize[state.tokenize.length-1](stream, state); + if (style == "ident") { + var word = stream.current(); + style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : operators.propertyIsEnumerable(stream.current()) ? "operator" + : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" + : /^0[bB][0-1]+$/g.test(word) ? "number" + : /^0[cC][0-7]+$/g.test(word) ? "number" + : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" + : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" + : /^[0-9]+$/g.test(word) ? "number" + : "variable"; + } + return style; + }, + lineComment: "--" + }; +}); + +CodeMirror.defineMIME("text/x-eiffel", "eiffel"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js new file mode 100644 index 0000000000..6ce940fe82 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js @@ -0,0 +1,243 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("elm", function() { + + function switchState(source, setState, f) + { + setState(f); + return f(source, setState); + } + + var lowerRE = /[a-z]/; + var upperRE = /[A-Z]/; + var innerRE = /[a-zA-Z0-9_]/; + + var digitRE = /[0-9]/; + var hexRE = /[0-9A-Fa-f]/; + var symbolRE = /[-&*+.\\/<>=?^|:]/; + var specialRE = /[(),[\]{}]/; + var spacesRE = /[ \v\f]/; // newlines are handled in tokenizer + + function normal() + { + return function(source, setState) + { + if (source.eatWhile(spacesRE)) + { + return null; + } + + var char = source.next(); + + if (specialRE.test(char)) + { + return (char === '{' && source.eat('-')) + ? switchState(source, setState, chompMultiComment(1)) + : (char === '[' && source.match('glsl|')) + ? switchState(source, setState, chompGlsl) + : 'builtin'; + } + + if (char === '\'') + { + return switchState(source, setState, chompChar); + } + + if (char === '"') + { + return source.eat('"') + ? source.eat('"') + ? switchState(source, setState, chompMultiString) + : 'string' + : switchState(source, setState, chompSingleString); + } + + if (upperRE.test(char)) + { + source.eatWhile(innerRE); + return 'variable-2'; + } + + if (lowerRE.test(char)) + { + var isDef = source.pos === 1; + source.eatWhile(innerRE); + return isDef ? "def" : "variable"; + } + + if (digitRE.test(char)) + { + if (char === '0') + { + if (source.eat(/[xX]/)) + { + source.eatWhile(hexRE); // should require at least 1 + return "number"; + } + } + else + { + source.eatWhile(digitRE); + } + if (source.eat('.')) + { + source.eatWhile(digitRE); // should require at least 1 + } + if (source.eat(/[eE]/)) + { + source.eat(/[-+]/); + source.eatWhile(digitRE); // should require at least 1 + } + return "number"; + } + + if (symbolRE.test(char)) + { + if (char === '-' && source.eat('-')) + { + source.skipToEnd(); + return "comment"; + } + source.eatWhile(symbolRE); + return "keyword"; + } + + if (char === '_') + { + return "keyword"; + } + + return "error"; + } + } + + function chompMultiComment(nest) + { + if (nest == 0) + { + return normal(); + } + return function(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char == '{' && source.eat('-')) + { + ++nest; + } + else if (char == '-' && source.eat('}')) + { + --nest; + if (nest === 0) + { + setState(normal()); + return 'comment'; + } + } + } + setState(chompMultiComment(nest)); + return 'comment'; + } + } + + function chompMultiString(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char === '"' && source.eat('"') && source.eat('"')) + { + setState(normal()); + return 'string'; + } + } + return 'string'; + } + + function chompSingleString(source, setState) + { + while (source.skipTo('\\"')) { source.next(); source.next(); } + if (source.skipTo('"')) + { + source.next(); + setState(normal()); + return 'string'; + } + source.skipToEnd(); + setState(normal()); + return 'error'; + } + + function chompChar(source, setState) + { + while (source.skipTo("\\'")) { source.next(); source.next(); } + if (source.skipTo("'")) + { + source.next(); + setState(normal()); + return 'string'; + } + source.skipToEnd(); + setState(normal()); + return 'error'; + } + + function chompGlsl(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char === '|' && source.eat(']')) + { + setState(normal()); + return 'string'; + } + } + return 'string'; + } + + var wellKnownWords = { + case: 1, + of: 1, + as: 1, + if: 1, + then: 1, + else: 1, + let: 1, + in: 1, + type: 1, + alias: 1, + module: 1, + where: 1, + import: 1, + exposing: 1, + port: 1 + }; + + return { + startState: function () { return { f: normal() }; }, + copyState: function (s) { return { f: s.f }; }, + + token: function(stream, state) { + var type = state.f(stream, function(s) { state.f = s; }); + var word = stream.current(); + return (wellKnownWords.hasOwnProperty(word)) ? 'keyword' : type; + } + }; + + }); + + CodeMirror.defineMIME("text/x-elm", "elm"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js new file mode 100644 index 0000000000..d827296f3b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js @@ -0,0 +1,619 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/*jshint unused:true, eqnull:true, curly:true, bitwise:true */ +/*jshint undef:true, latedef:true, trailing:true */ +/*global CodeMirror:true */ + +// erlang mode. +// tokenizer -> token types -> CodeMirror styles +// tokenizer maintains a parse stack +// indenter uses the parse stack + +// TODO indenter: +// bit syntax +// old guard/bif/conversion clashes (e.g. "float/1") +// type/spec/opaque + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMIME("text/x-erlang", "erlang"); + +CodeMirror.defineMode("erlang", function(cmCfg) { + "use strict"; + +///////////////////////////////////////////////////////////////////////////// +// constants + + var typeWords = [ + "-type", "-spec", "-export_type", "-opaque"]; + + var keywordWords = [ + "after","begin","catch","case","cond","end","fun","if", + "let","of","query","receive","try","when"]; + + var separatorRE = /[\->,;]/; + var separatorWords = [ + "->",";",","]; + + var operatorAtomWords = [ + "and","andalso","band","bnot","bor","bsl","bsr","bxor", + "div","not","or","orelse","rem","xor"]; + + var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/; + var operatorSymbolWords = [ + "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"]; + + var openParenRE = /[<\(\[\{]/; + var openParenWords = [ + "<<","(","[","{"]; + + var closeParenRE = /[>\)\]\}]/; + var closeParenWords = [ + "}","]",")",">>"]; + + var guardWords = [ + "is_atom","is_binary","is_bitstring","is_boolean","is_float", + "is_function","is_integer","is_list","is_number","is_pid", + "is_port","is_record","is_reference","is_tuple", + "atom","binary","bitstring","boolean","function","integer","list", + "number","pid","port","record","reference","tuple"]; + + var bifWords = [ + "abs","adler32","adler32_combine","alive","apply","atom_to_binary", + "atom_to_list","binary_to_atom","binary_to_existing_atom", + "binary_to_list","binary_to_term","bit_size","bitstring_to_list", + "byte_size","check_process_code","contact_binary","crc32", + "crc32_combine","date","decode_packet","delete_module", + "disconnect_node","element","erase","exit","float","float_to_list", + "garbage_collect","get","get_keys","group_leader","halt","hd", + "integer_to_list","internal_bif","iolist_size","iolist_to_binary", + "is_alive","is_atom","is_binary","is_bitstring","is_boolean", + "is_float","is_function","is_integer","is_list","is_number","is_pid", + "is_port","is_process_alive","is_record","is_reference","is_tuple", + "length","link","list_to_atom","list_to_binary","list_to_bitstring", + "list_to_existing_atom","list_to_float","list_to_integer", + "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded", + "monitor_node","node","node_link","node_unlink","nodes","notalive", + "now","open_port","pid_to_list","port_close","port_command", + "port_connect","port_control","pre_loaded","process_flag", + "process_info","processes","purge_module","put","register", + "registered","round","self","setelement","size","spawn","spawn_link", + "spawn_monitor","spawn_opt","split_binary","statistics", + "term_to_binary","time","throw","tl","trunc","tuple_size", + "tuple_to_list","unlink","unregister","whereis"]; + +// upper case: [A-Z] [Ø-Þ] [À-Ö] +// lower case: [a-z] [ß-ö] [ø-ÿ] + var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/; + var escapesRE = + /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/; + +///////////////////////////////////////////////////////////////////////////// +// tokenizer + + function tokenizer(stream,state) { + // in multi-line string + if (state.in_string) { + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); + } + + // in multi-line atom + if (state.in_atom) { + state.in_atom = (!singleQuote(stream)); + return rval(state,stream,"atom"); + } + + // whitespace + if (stream.eatSpace()) { + return rval(state,stream,"whitespace"); + } + + // attributes and type specs + if (!peekToken(state) && + stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) { + if (is_member(stream.current(),typeWords)) { + return rval(state,stream,"type"); + }else{ + return rval(state,stream,"attribute"); + } + } + + var ch = stream.next(); + + // comment + if (ch == '%') { + stream.skipToEnd(); + return rval(state,stream,"comment"); + } + + // colon + if (ch == ":") { + return rval(state,stream,"colon"); + } + + // macro + if (ch == '?') { + stream.eatSpace(); + stream.eatWhile(anumRE); + return rval(state,stream,"macro"); + } + + // record + if (ch == "#") { + stream.eatSpace(); + stream.eatWhile(anumRE); + return rval(state,stream,"record"); + } + + // dollar escape + if (ch == "$") { + if (stream.next() == "\\" && !stream.match(escapesRE)) { + return rval(state,stream,"error"); + } + return rval(state,stream,"number"); + } + + // dot + if (ch == ".") { + return rval(state,stream,"dot"); + } + + // quoted atom + if (ch == '\'') { + if (!(state.in_atom = (!singleQuote(stream)))) { + if (stream.match(/\s*\/\s*[0-9]/,false)) { + stream.match(/\s*\/\s*[0-9]/,true); + return rval(state,stream,"fun"); // 'f'/0 style fun + } + if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) { + return rval(state,stream,"function"); + } + } + return rval(state,stream,"atom"); + } + + // string + if (ch == '"') { + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); + } + + // variable + if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) { + stream.eatWhile(anumRE); + return rval(state,stream,"variable"); + } + + // atom/keyword/BIF/function + if (/[a-z_ß-öø-ÿ]/.test(ch)) { + stream.eatWhile(anumRE); + + if (stream.match(/\s*\/\s*[0-9]/,false)) { + stream.match(/\s*\/\s*[0-9]/,true); + return rval(state,stream,"fun"); // f/0 style fun + } + + var w = stream.current(); + + if (is_member(w,keywordWords)) { + return rval(state,stream,"keyword"); + }else if (is_member(w,operatorAtomWords)) { + return rval(state,stream,"operator"); + }else if (stream.match(/\s*\(/,false)) { + // 'put' and 'erlang:put' are bifs, 'foo:put' is not + if (is_member(w,bifWords) && + ((peekToken(state).token != ":") || + (peekToken(state,2).token == "erlang"))) { + return rval(state,stream,"builtin"); + }else if (is_member(w,guardWords)) { + return rval(state,stream,"guard"); + }else{ + return rval(state,stream,"function"); + } + }else if (lookahead(stream) == ":") { + if (w == "erlang") { + return rval(state,stream,"builtin"); + } else { + return rval(state,stream,"function"); + } + }else if (is_member(w,["true","false"])) { + return rval(state,stream,"boolean"); + }else{ + return rval(state,stream,"atom"); + } + } + + // number + var digitRE = /[0-9]/; + var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int + if (digitRE.test(ch)) { + stream.eatWhile(digitRE); + if (stream.eat('#')) { // 36#aZ style integer + if (!stream.eatWhile(radixRE)) { + stream.backUp(1); //"36#" - syntax error + } + } else if (stream.eat('.')) { // float + if (!stream.eatWhile(digitRE)) { + stream.backUp(1); // "3." - probably end of function + } else { + if (stream.eat(/[eE]/)) { // float with exponent + if (stream.eat(/[-+]/)) { + if (!stream.eatWhile(digitRE)) { + stream.backUp(2); // "2e-" - syntax error + } + } else { + if (!stream.eatWhile(digitRE)) { + stream.backUp(1); // "2e" - syntax error + } + } + } + } + } + return rval(state,stream,"number"); // normal integer + } + + // open parens + if (nongreedy(stream,openParenRE,openParenWords)) { + return rval(state,stream,"open_paren"); + } + + // close parens + if (nongreedy(stream,closeParenRE,closeParenWords)) { + return rval(state,stream,"close_paren"); + } + + // separators + if (greedy(stream,separatorRE,separatorWords)) { + return rval(state,stream,"separator"); + } + + // operators + if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) { + return rval(state,stream,"operator"); + } + + return rval(state,stream,null); + } + +///////////////////////////////////////////////////////////////////////////// +// utilities + function nongreedy(stream,re,words) { + if (stream.current().length == 1 && re.test(stream.current())) { + stream.backUp(1); + while (re.test(stream.peek())) { + stream.next(); + if (is_member(stream.current(),words)) { + return true; + } + } + stream.backUp(stream.current().length-1); + } + return false; + } + + function greedy(stream,re,words) { + if (stream.current().length == 1 && re.test(stream.current())) { + while (re.test(stream.peek())) { + stream.next(); + } + while (0 < stream.current().length) { + if (is_member(stream.current(),words)) { + return true; + }else{ + stream.backUp(1); + } + } + stream.next(); + } + return false; + } + + function doubleQuote(stream) { + return quote(stream, '"', '\\'); + } + + function singleQuote(stream) { + return quote(stream,'\'','\\'); + } + + function quote(stream,quoteChar,escapeChar) { + while (!stream.eol()) { + var ch = stream.next(); + if (ch == quoteChar) { + return true; + }else if (ch == escapeChar) { + stream.next(); + } + } + return false; + } + + function lookahead(stream) { + var m = stream.match(/^\s*([^\s%])/, false) + return m ? m[1] : ""; + } + + function is_member(element,list) { + return (-1 < list.indexOf(element)); + } + + function rval(state,stream,type) { + + // parse stack + pushToken(state,realToken(type,stream)); + + // map erlang token type to CodeMirror style class + // erlang -> CodeMirror tag + switch (type) { + case "atom": return "atom"; + case "attribute": return "attribute"; + case "boolean": return "atom"; + case "builtin": return "builtin"; + case "close_paren": return null; + case "colon": return null; + case "comment": return "comment"; + case "dot": return null; + case "error": return "error"; + case "fun": return "meta"; + case "function": return "tag"; + case "guard": return "property"; + case "keyword": return "keyword"; + case "macro": return "variable-2"; + case "number": return "number"; + case "open_paren": return null; + case "operator": return "operator"; + case "record": return "bracket"; + case "separator": return null; + case "string": return "string"; + case "type": return "def"; + case "variable": return "variable"; + default: return null; + } + } + + function aToken(tok,col,ind,typ) { + return {token: tok, + column: col, + indent: ind, + type: typ}; + } + + function realToken(type,stream) { + return aToken(stream.current(), + stream.column(), + stream.indentation(), + type); + } + + function fakeToken(type) { + return aToken(type,0,0,type); + } + + function peekToken(state,depth) { + var len = state.tokenStack.length; + var dep = (depth ? depth : 1); + + if (len < dep) { + return false; + }else{ + return state.tokenStack[len-dep]; + } + } + + function pushToken(state,token) { + + if (!(token.type == "comment" || token.type == "whitespace")) { + state.tokenStack = maybe_drop_pre(state.tokenStack,token); + state.tokenStack = maybe_drop_post(state.tokenStack); + } + } + + function maybe_drop_pre(s,token) { + var last = s.length-1; + + if (0 < last && s[last].type === "record" && token.type === "dot") { + s.pop(); + }else if (0 < last && s[last].type === "group") { + s.pop(); + s.push(token); + }else{ + s.push(token); + } + return s; + } + + function maybe_drop_post(s) { + if (!s.length) return s + var last = s.length-1; + + if (s[last].type === "dot") { + return []; + } + if (last > 1 && s[last].type === "fun" && s[last-1].token === "fun") { + return s.slice(0,last-1); + } + switch (s[last].token) { + case "}": return d(s,{g:["{"]}); + case "]": return d(s,{i:["["]}); + case ")": return d(s,{i:["("]}); + case ">>": return d(s,{i:["<<"]}); + case "end": return d(s,{i:["begin","case","fun","if","receive","try"]}); + case ",": return d(s,{e:["begin","try","when","->", + ",","(","[","{","<<"]}); + case "->": return d(s,{r:["when"], + m:["try","if","case","receive"]}); + case ";": return d(s,{E:["case","fun","if","receive","try","when"]}); + case "catch":return d(s,{e:["try"]}); + case "of": return d(s,{e:["case"]}); + case "after":return d(s,{e:["receive","try"]}); + default: return s; + } + } + + function d(stack,tt) { + // stack is a stack of Token objects. + // tt is an object; {type:tokens} + // type is a char, tokens is a list of token strings. + // The function returns (possibly truncated) stack. + // It will descend the stack, looking for a Token such that Token.token + // is a member of tokens. If it does not find that, it will normally (but + // see "E" below) return stack. If it does find a match, it will remove + // all the Tokens between the top and the matched Token. + // If type is "m", that is all it does. + // If type is "i", it will also remove the matched Token and the top Token. + // If type is "g", like "i", but add a fake "group" token at the top. + // If type is "r", it will remove the matched Token, but not the top Token. + // If type is "e", it will keep the matched Token but not the top Token. + // If type is "E", it behaves as for type "e", except if there is no match, + // in which case it will return an empty stack. + + for (var type in tt) { + var len = stack.length-1; + var tokens = tt[type]; + for (var i = len-1; -1 < i ; i--) { + if (is_member(stack[i].token,tokens)) { + var ss = stack.slice(0,i); + switch (type) { + case "m": return ss.concat(stack[i]).concat(stack[len]); + case "r": return ss.concat(stack[len]); + case "i": return ss; + case "g": return ss.concat(fakeToken("group")); + case "E": return ss.concat(stack[i]); + case "e": return ss.concat(stack[i]); + } + } + } + } + return (type == "E" ? [] : stack); + } + +///////////////////////////////////////////////////////////////////////////// +// indenter + + function indenter(state,textAfter) { + var t; + var unit = cmCfg.indentUnit; + var wordAfter = wordafter(textAfter); + var currT = peekToken(state,1); + var prevT = peekToken(state,2); + + if (state.in_string || state.in_atom) { + return CodeMirror.Pass; + }else if (!prevT) { + return 0; + }else if (currT.token == "when") { + return currT.column+unit; + }else if (wordAfter === "when" && prevT.type === "function") { + return prevT.indent+unit; + }else if (wordAfter === "(" && currT.token === "fun") { + return currT.column+3; + }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) { + return t.column; + }else if (is_member(wordAfter,["end","after","of"])) { + t = getToken(state,["begin","case","fun","if","receive","try"]); + return t ? t.column : CodeMirror.Pass; + }else if (is_member(wordAfter,closeParenWords)) { + t = getToken(state,openParenWords); + return t ? t.column : CodeMirror.Pass; + }else if (is_member(currT.token,[",","|","||"]) || + is_member(wordAfter,[",","|","||"])) { + t = postcommaToken(state); + return t ? t.column+t.token.length : unit; + }else if (currT.token == "->") { + if (is_member(prevT.token, ["receive","case","if","try"])) { + return prevT.column+unit+unit; + }else{ + return prevT.column+unit; + } + }else if (is_member(currT.token,openParenWords)) { + return currT.column+currT.token.length; + }else{ + t = defaultToken(state); + return truthy(t) ? t.column+unit : 0; + } + } + + function wordafter(str) { + var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/); + + return truthy(m) && (m.index === 0) ? m[0] : ""; + } + + function postcommaToken(state) { + var objs = state.tokenStack.slice(0,-1); + var i = getTokenIndex(objs,"type",["open_paren"]); + + return truthy(objs[i]) ? objs[i] : false; + } + + function defaultToken(state) { + var objs = state.tokenStack; + var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]); + var oper = getTokenIndex(objs,"type",["operator"]); + + if (truthy(stop) && truthy(oper) && stop < oper) { + return objs[stop+1]; + } else if (truthy(stop)) { + return objs[stop]; + } else { + return false; + } + } + + function getToken(state,tokens) { + var objs = state.tokenStack; + var i = getTokenIndex(objs,"token",tokens); + + return truthy(objs[i]) ? objs[i] : false; + } + + function getTokenIndex(objs,propname,propvals) { + + for (var i = objs.length-1; -1 < i ; i--) { + if (is_member(objs[i][propname],propvals)) { + return i; + } + } + return false; + } + + function truthy(x) { + return (x !== false) && (x != null); + } + +///////////////////////////////////////////////////////////////////////////// +// this object defines the mode + + return { + startState: + function() { + return {tokenStack: [], + in_string: false, + in_atom: false}; + }, + + token: + function(stream, state) { + return tokenizer(stream, state); + }, + + indent: + function(state, textAfter) { + return indenter(state,textAfter); + }, + + lineComment: "%" + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js new file mode 100644 index 0000000000..d3f7d499cb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js @@ -0,0 +1,85 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Factor syntax highlight - simple mode +// +// by Dimage Sapelkin (https://github.com/kerabromsmu) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode("factor", { + // The start state contains the rules that are initially used + start: [ + // comments + {regex: /#?!.*/, token: "comment"}, + // strings """, multiline --> state + {regex: /"""/, token: "string", next: "string3"}, + {regex: /(STRING:)(\s)/, token: ["keyword", null], next: "string2"}, + {regex: /\S*?"/, token: "string", next: "string"}, + // numbers: dec, hex, unicode, bin, fractional, complex + {regex: /(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\-?\d+.?\d*)(?=\s)/, token: "number"}, + //{regex: /[+-]?/} //fractional + // definition: defining word, defined word, etc + {regex: /((?:GENERIC)|\:?\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "bracket"], next: "stack"}, + // method definition: defining word, type, defined word, etc + {regex: /(M\:)(\s+)(\S+)(\s+)(\S+)/, token: ["keyword", null, "def", null, "tag"]}, + // vocabulary using --> state + {regex: /USING\:/, token: "keyword", next: "vocabulary"}, + // vocabulary definition/use + {regex: /(USE\:|IN\:)(\s+)(\S+)(?=\s|$)/, token: ["keyword", null, "tag"]}, + // definition: a defining word, defined word + {regex: /(\S+\:)(\s+)(\S+)(?=\s|$)/, token: ["keyword", null, "def"]}, + // "keywords", incl. ; t f . [ ] { } defining words + {regex: /(?:;|\\|t|f|if|loop|while|until|do|PRIVATE>| and the like + {regex: /\S+[\)>\.\*\?]+(?=\s|$)/, token: "builtin"}, + {regex: /[\)><]+\S+(?=\s|$)/, token: "builtin"}, + // operators + {regex: /(?:[\+\-\=\/\*<>])(?=\s|$)/, token: "keyword"}, + // any id (?) + {regex: /\S+/, token: "variable"}, + {regex: /\s+|./, token: null} + ], + vocabulary: [ + {regex: /;/, token: "keyword", next: "start"}, + {regex: /\S+/, token: "tag"}, + {regex: /\s+|./, token: null} + ], + string: [ + {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"}, + {regex: /.*/, token: "string"} + ], + string2: [ + {regex: /^;/, token: "keyword", next: "start"}, + {regex: /.*/, token: "string"} + ], + string3: [ + {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"}, + {regex: /.*/, token: "string"} + ], + stack: [ + {regex: /\)/, token: "bracket", next: "start"}, + {regex: /--/, token: "bracket"}, + {regex: /\S+/, token: "meta"}, + {regex: /\s+|./, token: null} + ], + // The meta property contains global information about the mode. It + // can contain properties like lineComment, which are supported by + // all modes, and also directives like dontIndentStates, which are + // specific to simple modes. + meta: { + dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"], + lineComment: "!" + } + }); + + CodeMirror.defineMIME("text/x-factor", "factor"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js new file mode 100644 index 0000000000..2d3f2001d3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js @@ -0,0 +1,173 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("fcl", function(config) { + var indentUnit = config.indentUnit; + + var keywords = { + "term": true, + "method": true, "accu": true, + "rule": true, "then": true, "is": true, "and": true, "or": true, + "if": true, "default": true + }; + + var start_blocks = { + "var_input": true, + "var_output": true, + "fuzzify": true, + "defuzzify": true, + "function_block": true, + "ruleblock": true + }; + + var end_blocks = { + "end_ruleblock": true, + "end_defuzzify": true, + "end_function_block": true, + "end_fuzzify": true, + "end_var": true + }; + + var atoms = { + "true": true, "false": true, "nan": true, + "real": true, "min": true, "max": true, "cog": true, "cogs": true + }; + + var isOperatorChar = /[+\-*&^%:=<>!|\/]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (/[\d\.]/.test(ch)) { + if (ch == ".") { + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + } else if (ch == "0") { + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + } else { + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + } + return "number"; + } + + if (ch == "/" || ch == "(") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + + var cur = stream.current().toLowerCase(); + if (keywords.propertyIsEnumerable(cur) || + start_blocks.propertyIsEnumerable(cur) || + end_blocks.propertyIsEnumerable(cur)) { + return "keyword"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if ((ch == "/" || ch == ")") && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + + function popContext(state) { + if (!state.context.prev) return; + var t = state.context.type; + if (t == "end_block") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + var cur = stream.current().toLowerCase(); + + if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), "end_block"); + else if (end_blocks.propertyIsEnumerable(cur)) popContext(state); + + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + var ctx = state.context; + + var closing = end_blocks.propertyIsEnumerable(textAfter); + if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "ryk", + fold: "brace", + blockCommentStart: "(*", + blockCommentEnd: "*)", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-fcl", "fcl"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js new file mode 100644 index 0000000000..f2caa27af8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js @@ -0,0 +1,180 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Author: Aliaksei Chapyzhenka + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function toWordList(words) { + var ret = []; + words.split(' ').forEach(function(e){ + ret.push({name: e}); + }); + return ret; + } + + var coreWordList = toWordList( +'INVERT AND OR XOR\ + 2* 2/ LSHIFT RSHIFT\ + 0= = 0< < > U< MIN MAX\ + 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ + >R R> R@\ + + - 1+ 1- ABS NEGATE\ + S>D * M* UM*\ + FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ + HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ + ALIGN ALIGNED +! ALLOT\ + CHAR [CHAR] [ ] BL\ + FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ + ; DOES> >BODY\ + EVALUATE\ + SOURCE >IN\ + <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ + FILL MOVE\ + . CR EMIT SPACE SPACES TYPE U. .R U.R\ + ACCEPT\ + TRUE FALSE\ + <> U> 0<> 0>\ + NIP TUCK ROLL PICK\ + 2>R 2R@ 2R>\ + WITHIN UNUSED MARKER\ + I J\ + TO\ + COMPILE, [COMPILE]\ + SAVE-INPUT RESTORE-INPUT\ + PAD ERASE\ + 2LITERAL DNEGATE\ + D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ + M+ M*/ D. D.R 2ROT DU<\ + CATCH THROW\ + FREE RESIZE ALLOCATE\ + CS-PICK CS-ROLL\ + GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ + PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ + -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL'); + + var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE'); + + CodeMirror.defineMode('forth', function() { + function searchWordList (wordList, word) { + var i; + for (i = wordList.length - 1; i >= 0; i--) { + if (wordList[i].name === word.toUpperCase()) { + return wordList[i]; + } + } + return undefined; + } + return { + startState: function() { + return { + state: '', + base: 10, + coreWordList: coreWordList, + immediateWordList: immediateWordList, + wordList: [] + }; + }, + token: function (stream, stt) { + var mat; + if (stream.eatSpace()) { + return null; + } + if (stt.state === '') { // interpretation + if (stream.match(/^(\]|:NONAME)(\s|$)/i)) { + stt.state = ' compilation'; + return 'builtin compilation'; + } + mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/); + if (mat) { + stt.wordList.push({name: mat[2].toUpperCase()}); + stt.state = ' compilation'; + return 'def' + stt.state; + } + mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i); + if (mat) { + stt.wordList.push({name: mat[2].toUpperCase()}); + return 'def' + stt.state; + } + mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/); + if (mat) { + return 'builtin' + stt.state; + } + } else { // compilation + // ; [ + if (stream.match(/^(\;|\[)(\s)/)) { + stt.state = ''; + stream.backUp(1); + return 'builtin compilation'; + } + if (stream.match(/^(\;|\[)($)/)) { + stt.state = ''; + return 'builtin compilation'; + } + if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) { + return 'builtin'; + } + } + + // dynamic wordlist + mat = stream.match(/^(\S+)(\s+|$)/); + if (mat) { + if (searchWordList(stt.wordList, mat[1]) !== undefined) { + return 'variable' + stt.state; + } + + // comments + if (mat[1] === '\\') { + stream.skipToEnd(); + return 'comment' + stt.state; + } + + // core words + if (searchWordList(stt.coreWordList, mat[1]) !== undefined) { + return 'builtin' + stt.state; + } + if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) { + return 'keyword' + stt.state; + } + + if (mat[1] === '(') { + stream.eatWhile(function (s) { return s !== ')'; }); + stream.eat(')'); + return 'comment' + stt.state; + } + + // // strings + if (mat[1] === '.(') { + stream.eatWhile(function (s) { return s !== ')'; }); + stream.eat(')'); + return 'string' + stt.state; + } + if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') { + stream.eatWhile(function (s) { return s !== '"'; }); + stream.eat('"'); + return 'string' + stt.state; + } + + // numbers + if (mat[1] - 0xfffffffff) { + return 'number' + stt.state; + } + // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) { + // return 'number' + stt.state; + // } + + return 'atom' + stt.state; + } + } + }; + }); + CodeMirror.defineMIME("text/x-forth", "forth"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js new file mode 100644 index 0000000000..c33cf63edd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js @@ -0,0 +1,188 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("fortran", function() { + function words(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i]] = true; + } + return keys; + } + + var keywords = words([ + "abstract", "accept", "allocatable", "allocate", + "array", "assign", "asynchronous", "backspace", + "bind", "block", "byte", "call", "case", + "class", "close", "common", "contains", + "continue", "cycle", "data", "deallocate", + "decode", "deferred", "dimension", "do", + "elemental", "else", "encode", "end", + "endif", "entry", "enumerator", "equivalence", + "exit", "external", "extrinsic", "final", + "forall", "format", "function", "generic", + "go", "goto", "if", "implicit", "import", "include", + "inquire", "intent", "interface", "intrinsic", + "module", "namelist", "non_intrinsic", + "non_overridable", "none", "nopass", + "nullify", "open", "optional", "options", + "parameter", "pass", "pause", "pointer", + "print", "private", "program", "protected", + "public", "pure", "read", "recursive", "result", + "return", "rewind", "save", "select", "sequence", + "stop", "subroutine", "target", "then", "to", "type", + "use", "value", "volatile", "where", "while", + "write"]); + var builtins = words(["abort", "abs", "access", "achar", "acos", + "adjustl", "adjustr", "aimag", "aint", "alarm", + "all", "allocated", "alog", "amax", "amin", + "amod", "and", "anint", "any", "asin", + "associated", "atan", "besj", "besjn", "besy", + "besyn", "bit_size", "btest", "cabs", "ccos", + "ceiling", "cexp", "char", "chdir", "chmod", + "clog", "cmplx", "command_argument_count", + "complex", "conjg", "cos", "cosh", "count", + "cpu_time", "cshift", "csin", "csqrt", "ctime", + "c_funloc", "c_loc", "c_associated", "c_null_ptr", + "c_null_funptr", "c_f_pointer", "c_null_char", + "c_alert", "c_backspace", "c_form_feed", + "c_new_line", "c_carriage_return", + "c_horizontal_tab", "c_vertical_tab", "dabs", + "dacos", "dasin", "datan", "date_and_time", + "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy", + "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf", + "derfc", "dexp", "digits", "dim", "dint", "dlog", + "dlog", "dmax", "dmin", "dmod", "dnint", + "dot_product", "dprod", "dsign", "dsinh", + "dsin", "dsqrt", "dtanh", "dtan", "dtime", + "eoshift", "epsilon", "erf", "erfc", "etime", + "exit", "exp", "exponent", "extends_type_of", + "fdate", "fget", "fgetc", "float", "floor", + "flush", "fnum", "fputc", "fput", "fraction", + "fseek", "fstat", "ftell", "gerror", "getarg", + "get_command", "get_command_argument", + "get_environment_variable", "getcwd", + "getenv", "getgid", "getlog", "getpid", + "getuid", "gmtime", "hostnm", "huge", "iabs", + "iachar", "iand", "iargc", "ibclr", "ibits", + "ibset", "ichar", "idate", "idim", "idint", + "idnint", "ieor", "ierrno", "ifix", "imag", + "imagpart", "index", "int", "ior", "irand", + "isatty", "ishft", "ishftc", "isign", + "iso_c_binding", "is_iostat_end", "is_iostat_eor", + "itime", "kill", "kind", "lbound", "len", "len_trim", + "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc", + "log", "logical", "long", "lshift", "lstat", "ltime", + "matmul", "max", "maxexponent", "maxloc", "maxval", + "mclock", "merge", "move_alloc", "min", "minexponent", + "minloc", "minval", "mod", "modulo", "mvbits", + "nearest", "new_line", "nint", "not", "or", "pack", + "perror", "precision", "present", "product", "radix", + "rand", "random_number", "random_seed", "range", + "real", "realpart", "rename", "repeat", "reshape", + "rrspacing", "rshift", "same_type_as", "scale", + "scan", "second", "selected_int_kind", + "selected_real_kind", "set_exponent", "shape", + "short", "sign", "signal", "sinh", "sin", "sleep", + "sngl", "spacing", "spread", "sqrt", "srand", "stat", + "sum", "symlnk", "system", "system_clock", "tan", + "tanh", "time", "tiny", "transfer", "transpose", + "trim", "ttynam", "ubound", "umask", "unlink", + "unpack", "verify", "xor", "zabs", "zcos", "zexp", + "zlog", "zsin", "zsqrt"]); + + var dataTypes = words(["c_bool", "c_char", "c_double", "c_double_complex", + "c_float", "c_float_complex", "c_funptr", "c_int", + "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t", + "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t", + "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t", + "c_int_least64_t", "c_int_least8_t", "c_intmax_t", + "c_intptr_t", "c_long", "c_long_double", + "c_long_double_complex", "c_long_long", "c_ptr", + "c_short", "c_signed_char", "c_size_t", "character", + "complex", "double", "integer", "logical", "real"]); + var isOperatorChar = /[+\-*&=<>\/\:]/; + var litOperator = /^\.(and|or|eq|lt|le|gt|ge|ne|not|eqv|neqv)\./i; + + function tokenBase(stream, state) { + + if (stream.match(litOperator)){ + return 'operator'; + } + + var ch = stream.next(); + if (ch == "!") { + stream.skipToEnd(); + return "comment"; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]\(\),]/.test(ch)) { + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var word = stream.current().toLowerCase(); + + if (keywords.hasOwnProperty(word)){ + return 'keyword'; + } + if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) { + return 'builtin'; + } + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) state.tokenize = null; + return "string"; + }; + } + + // Interface + + return { + startState: function() { + return {tokenize: null}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-fortran", "fortran"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js new file mode 100644 index 0000000000..016dc29d60 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js @@ -0,0 +1,353 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("gas", function(_config, parserConfig) { + 'use strict'; + + // If an architecture is specified, its initialization function may + // populate this array with custom parsing functions which will be + // tried in the event that the standard functions do not find a match. + var custom = []; + + // The symbol used to start a line comment changes based on the target + // architecture. + // If no architecture is pased in "parserConfig" then only multiline + // comments will have syntax support. + var lineCommentStartSymbol = ""; + + // These directives are architecture independent. + // Machine specific directives should go in their respective + // architecture initialization function. + // Reference: + // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops + var directives = { + ".abort" : "builtin", + ".align" : "builtin", + ".altmacro" : "builtin", + ".ascii" : "builtin", + ".asciz" : "builtin", + ".balign" : "builtin", + ".balignw" : "builtin", + ".balignl" : "builtin", + ".bundle_align_mode" : "builtin", + ".bundle_lock" : "builtin", + ".bundle_unlock" : "builtin", + ".byte" : "builtin", + ".cfi_startproc" : "builtin", + ".comm" : "builtin", + ".data" : "builtin", + ".def" : "builtin", + ".desc" : "builtin", + ".dim" : "builtin", + ".double" : "builtin", + ".eject" : "builtin", + ".else" : "builtin", + ".elseif" : "builtin", + ".end" : "builtin", + ".endef" : "builtin", + ".endfunc" : "builtin", + ".endif" : "builtin", + ".equ" : "builtin", + ".equiv" : "builtin", + ".eqv" : "builtin", + ".err" : "builtin", + ".error" : "builtin", + ".exitm" : "builtin", + ".extern" : "builtin", + ".fail" : "builtin", + ".file" : "builtin", + ".fill" : "builtin", + ".float" : "builtin", + ".func" : "builtin", + ".global" : "builtin", + ".gnu_attribute" : "builtin", + ".hidden" : "builtin", + ".hword" : "builtin", + ".ident" : "builtin", + ".if" : "builtin", + ".incbin" : "builtin", + ".include" : "builtin", + ".int" : "builtin", + ".internal" : "builtin", + ".irp" : "builtin", + ".irpc" : "builtin", + ".lcomm" : "builtin", + ".lflags" : "builtin", + ".line" : "builtin", + ".linkonce" : "builtin", + ".list" : "builtin", + ".ln" : "builtin", + ".loc" : "builtin", + ".loc_mark_labels" : "builtin", + ".local" : "builtin", + ".long" : "builtin", + ".macro" : "builtin", + ".mri" : "builtin", + ".noaltmacro" : "builtin", + ".nolist" : "builtin", + ".octa" : "builtin", + ".offset" : "builtin", + ".org" : "builtin", + ".p2align" : "builtin", + ".popsection" : "builtin", + ".previous" : "builtin", + ".print" : "builtin", + ".protected" : "builtin", + ".psize" : "builtin", + ".purgem" : "builtin", + ".pushsection" : "builtin", + ".quad" : "builtin", + ".reloc" : "builtin", + ".rept" : "builtin", + ".sbttl" : "builtin", + ".scl" : "builtin", + ".section" : "builtin", + ".set" : "builtin", + ".short" : "builtin", + ".single" : "builtin", + ".size" : "builtin", + ".skip" : "builtin", + ".sleb128" : "builtin", + ".space" : "builtin", + ".stab" : "builtin", + ".string" : "builtin", + ".struct" : "builtin", + ".subsection" : "builtin", + ".symver" : "builtin", + ".tag" : "builtin", + ".text" : "builtin", + ".title" : "builtin", + ".type" : "builtin", + ".uleb128" : "builtin", + ".val" : "builtin", + ".version" : "builtin", + ".vtable_entry" : "builtin", + ".vtable_inherit" : "builtin", + ".warning" : "builtin", + ".weak" : "builtin", + ".weakref" : "builtin", + ".word" : "builtin" + }; + + var registers = {}; + + function x86(_parserConfig) { + lineCommentStartSymbol = "#"; + + registers.al = "variable"; + registers.ah = "variable"; + registers.ax = "variable"; + registers.eax = "variable-2"; + registers.rax = "variable-3"; + + registers.bl = "variable"; + registers.bh = "variable"; + registers.bx = "variable"; + registers.ebx = "variable-2"; + registers.rbx = "variable-3"; + + registers.cl = "variable"; + registers.ch = "variable"; + registers.cx = "variable"; + registers.ecx = "variable-2"; + registers.rcx = "variable-3"; + + registers.dl = "variable"; + registers.dh = "variable"; + registers.dx = "variable"; + registers.edx = "variable-2"; + registers.rdx = "variable-3"; + + registers.si = "variable"; + registers.esi = "variable-2"; + registers.rsi = "variable-3"; + + registers.di = "variable"; + registers.edi = "variable-2"; + registers.rdi = "variable-3"; + + registers.sp = "variable"; + registers.esp = "variable-2"; + registers.rsp = "variable-3"; + + registers.bp = "variable"; + registers.ebp = "variable-2"; + registers.rbp = "variable-3"; + + registers.ip = "variable"; + registers.eip = "variable-2"; + registers.rip = "variable-3"; + + registers.cs = "keyword"; + registers.ds = "keyword"; + registers.ss = "keyword"; + registers.es = "keyword"; + registers.fs = "keyword"; + registers.gs = "keyword"; + } + + function armv6(_parserConfig) { + // Reference: + // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf + // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf + lineCommentStartSymbol = "@"; + directives.syntax = "builtin"; + + registers.r0 = "variable"; + registers.r1 = "variable"; + registers.r2 = "variable"; + registers.r3 = "variable"; + registers.r4 = "variable"; + registers.r5 = "variable"; + registers.r6 = "variable"; + registers.r7 = "variable"; + registers.r8 = "variable"; + registers.r9 = "variable"; + registers.r10 = "variable"; + registers.r11 = "variable"; + registers.r12 = "variable"; + + registers.sp = "variable-2"; + registers.lr = "variable-2"; + registers.pc = "variable-2"; + registers.r13 = registers.sp; + registers.r14 = registers.lr; + registers.r15 = registers.pc; + + custom.push(function(ch, stream) { + if (ch === '#') { + stream.eatWhile(/\w/); + return "number"; + } + }); + } + + var arch = (parserConfig.architecture || "x86").toLowerCase(); + if (arch === "x86") { + x86(parserConfig); + } else if (arch === "arm" || arch === "armv6") { + armv6(parserConfig); + } + + function nextUntilUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next === end && !escaped) { + return false; + } + escaped = !escaped && next === "\\"; + } + return escaped; + } + + function clikeComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (ch === "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch === "*"); + } + return "comment"; + } + + return { + startState: function() { + return { + tokenize: null + }; + }, + + token: function(stream, state) { + if (state.tokenize) { + return state.tokenize(stream, state); + } + + if (stream.eatSpace()) { + return null; + } + + var style, cur, ch = stream.next(); + + if (ch === "/") { + if (stream.eat("*")) { + state.tokenize = clikeComment; + return clikeComment(stream, state); + } + } + + if (ch === lineCommentStartSymbol) { + stream.skipToEnd(); + return "comment"; + } + + if (ch === '"') { + nextUntilUnescaped(stream, '"'); + return "string"; + } + + if (ch === '.') { + stream.eatWhile(/\w/); + cur = stream.current().toLowerCase(); + style = directives[cur]; + return style || null; + } + + if (ch === '=') { + stream.eatWhile(/\w/); + return "tag"; + } + + if (ch === '{') { + return "bracket"; + } + + if (ch === '}') { + return "bracket"; + } + + if (/\d/.test(ch)) { + if (ch === "0" && stream.eat("x")) { + stream.eatWhile(/[0-9a-fA-F]/); + return "number"; + } + stream.eatWhile(/\d/); + return "number"; + } + + if (/\w/.test(ch)) { + stream.eatWhile(/\w/); + if (stream.eat(":")) { + return 'tag'; + } + cur = stream.current().toLowerCase(); + style = registers[cur]; + return style || null; + } + + for (var i = 0; i < custom.length; i++) { + style = custom[i](ch, stream, state); + if (style) { + return style; + } + } + }, + + lineComment: lineCommentStartSymbol, + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js new file mode 100644 index 0000000000..492c9487a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js @@ -0,0 +1,129 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i + +CodeMirror.defineMode("gfm", function(config, modeConfig) { + var codeDepth = 0; + function blankLine(state) { + state.code = false; + return null; + } + var gfmOverlay = { + startState: function() { + return { + code: false, + codeBlock: false, + ateSpace: false + }; + }, + copyState: function(s) { + return { + code: s.code, + codeBlock: s.codeBlock, + ateSpace: s.ateSpace + }; + }, + token: function(stream, state) { + state.combineTokens = null; + + // Hack to prevent formatting override inside code blocks (block and inline) + if (state.codeBlock) { + if (stream.match(/^```+/)) { + state.codeBlock = false; + return null; + } + stream.skipToEnd(); + return null; + } + if (stream.sol()) { + state.code = false; + } + if (stream.sol() && stream.match(/^```+/)) { + stream.skipToEnd(); + state.codeBlock = true; + return null; + } + // If this block is changed, it may need to be updated in Markdown mode + if (stream.peek() === '`') { + stream.next(); + var before = stream.pos; + stream.eatWhile('`'); + var difference = 1 + stream.pos - before; + if (!state.code) { + codeDepth = difference; + state.code = true; + } else { + if (difference === codeDepth) { // Must be exact + state.code = false; + } + } + return null; + } else if (state.code) { + stream.next(); + return null; + } + // Check if space. If so, links can be formatted later on + if (stream.eatSpace()) { + state.ateSpace = true; + return null; + } + if (stream.sol() || state.ateSpace) { + state.ateSpace = false; + if (modeConfig.gitHubSpice !== false) { + if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/)) { + // User/Project@SHA + // User@SHA + // SHA + state.combineTokens = true; + return "link"; + } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) { + // User/Project#Num + // User#Num + // #Num + state.combineTokens = true; + return "link"; + } + } + } + if (stream.match(urlRE) && + stream.string.slice(stream.start - 2, stream.start) != "](" && + (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) { + // URLs + // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls + // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine + // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL + state.combineTokens = true; + return "link"; + } + stream.next(); + return null; + }, + blankLine: blankLine + }; + + var markdownConfig = { + taskLists: true, + strikethrough: true, + emoji: true + }; + for (var attr in modeConfig) { + markdownConfig[attr] = modeConfig[attr]; + } + markdownConfig.name = "markdown"; + return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay); + +}, "markdown"); + + CodeMirror.defineMIME("text/x-gfm", "gfm"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js new file mode 100644 index 0000000000..1b438b9057 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* +Gherkin mode - http://www.cukes.info/ +Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues +*/ + +// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js +//var Quotes = { +// SINGLE: 1, +// DOUBLE: 2 +//}; + +//var regex = { +// keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/ +//}; + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("gherkin", function () { + return { + startState: function () { + return { + lineNumber: 0, + tableHeaderLine: false, + allowFeature: true, + allowBackground: false, + allowScenario: false, + allowSteps: false, + allowPlaceholders: false, + allowMultilineArgument: false, + inMultilineString: false, + inMultilineTable: false, + inKeywordLine: false + }; + }, + token: function (stream, state) { + if (stream.sol()) { + state.lineNumber++; + state.inKeywordLine = false; + if (state.inMultilineTable) { + state.tableHeaderLine = false; + if (!stream.match(/\s*\|/, false)) { + state.allowMultilineArgument = false; + state.inMultilineTable = false; + } + } + } + + stream.eatSpace(); + + if (state.allowMultilineArgument) { + + // STRING + if (state.inMultilineString) { + if (stream.match('"""')) { + state.inMultilineString = false; + state.allowMultilineArgument = false; + } else { + stream.match(/.*/); + } + return "string"; + } + + // TABLE + if (state.inMultilineTable) { + if (stream.match(/\|\s*/)) { + return "bracket"; + } else { + stream.match(/[^\|]*/); + return state.tableHeaderLine ? "header" : "string"; + } + } + + // DETECT START + if (stream.match('"""')) { + // String + state.inMultilineString = true; + return "string"; + } else if (stream.match("|")) { + // Table + state.inMultilineTable = true; + state.tableHeaderLine = true; + return "bracket"; + } + + } + + // LINE COMMENT + if (stream.match(/#.*/)) { + return "comment"; + + // TAG + } else if (!state.inKeywordLine && stream.match(/@\S+/)) { + return "tag"; + + // FEATURE + } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) { + state.allowScenario = true; + state.allowBackground = true; + state.allowPlaceholders = false; + state.allowSteps = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // BACKGROUND + } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // SCENARIO OUTLINE + } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) { + state.allowPlaceholders = true; + state.allowSteps = true; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // EXAMPLES + } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = true; + return "keyword"; + + // SCENARIO + } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // STEPS + } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) { + state.inStep = true; + state.allowPlaceholders = true; + state.allowMultilineArgument = true; + state.inKeywordLine = true; + return "keyword"; + + // INLINE STRING + } else if (stream.match(/"[^"]*"?/)) { + return "string"; + + // PLACEHOLDER + } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) { + return "variable"; + + // Fall through + } else { + stream.next(); + stream.eatWhile(/[^@"<#]/); + return null; + } + } + }; +}); + +CodeMirror.defineMIME("text/x-feature", "gherkin"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js new file mode 100644 index 0000000000..c005e42ddc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js @@ -0,0 +1,187 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("go", function(config) { + var indentUnit = config.indentUnit; + + var keywords = { + "break":true, "case":true, "chan":true, "const":true, "continue":true, + "default":true, "defer":true, "else":true, "fallthrough":true, "for":true, + "func":true, "go":true, "goto":true, "if":true, "import":true, + "interface":true, "map":true, "package":true, "range":true, "return":true, + "select":true, "struct":true, "switch":true, "type":true, "var":true, + "bool":true, "byte":true, "complex64":true, "complex128":true, + "float32":true, "float64":true, "int8":true, "int16":true, "int32":true, + "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true, + "uint64":true, "int":true, "uint":true, "uintptr":true, "error": true, + "rune":true + }; + + var atoms = { + "true":true, "false":true, "iota":true, "nil":true, "append":true, + "cap":true, "close":true, "complex":true, "copy":true, "delete":true, "imag":true, + "len":true, "make":true, "new":true, "panic":true, "print":true, + "println":true, "real":true, "recover":true + }; + + var isOperatorChar = /[+\-*&^%:=<>!|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'" || ch == "`") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\d\.]/.test(ch)) { + if (ch == ".") { + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + } else if (ch == "0") { + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + } else { + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + } + return "number"; + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) { + if (cur == "case" || cur == "default") curPunc = "case"; + return "keyword"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && quote != "`" && next == "\\"; + } + if (end || !(escaped || quote == "`")) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + if (!state.context.prev) return; + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + if (ctx.type == "case") ctx.type = "}"; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "case") ctx.type = "case"; + else if (curPunc == "}" && ctx.type == "}") popContext(state); + else if (curPunc == ctx.type) popContext(state); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) { + state.context.type = "}"; + return ctx.indented; + } + var closing = firstChar == ctx.type; + if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}):", + closeBrackets: "()[]{}''\"\"``", + fold: "brace", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-go", "go"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js new file mode 100644 index 0000000000..848a07719f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js @@ -0,0 +1,247 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("groovy", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words( + "abstract as assert boolean break byte case catch char class const continue def default " + + "do double else enum extends final finally float for goto if implements import in " + + "instanceof int interface long native new package private protected public return " + + "short static strictfp super switch synchronized threadsafe throw throws trait transient " + + "try void volatile while"); + var blockKeywords = words("catch class def do else enum finally for if interface switch trait try while"); + var standaloneKeywords = words("return break continue"); + var atoms = words("null true false this"); + + var curPunc; + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + return startString(ch, stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize.push(tokenComment); + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + if (expectExpression(state.lastToken, false)) { + return startString(ch, stream, state); + } + } + if (ch == "-" && stream.eat(">")) { + curPunc = "->"; + return null; + } + if (/[+\-*&%=<>!?|\/~]/.test(ch)) { + stream.eatWhile(/[+\-*&%=<>|~]/); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } + if (state.lastToken == ".") return "property"; + if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } + var cur = stream.current(); + if (atoms.propertyIsEnumerable(cur)) { return "atom"; } + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone"; + return "keyword"; + } + return "variable"; + } + tokenBase.isBase = true; + + function startString(quote, stream, state) { + var tripleQuoted = false; + if (quote != "/" && stream.eat(quote)) { + if (stream.eat(quote)) tripleQuoted = true; + else return "string"; + } + function t(stream, state) { + var escaped = false, next, end = !tripleQuoted; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + if (!tripleQuoted) { break; } + if (stream.match(quote + quote)) { end = true; break; } + } + if (quote == '"' && next == "$" && !escaped) { + if (stream.eat("{")) { + state.tokenize.push(tokenBaseUntilBrace()); + return "string"; + } else if (stream.match(/^\w/, false)) { + state.tokenize.push(tokenVariableDeref); + return "string"; + } + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize.pop(); + return "string"; + } + state.tokenize.push(t); + return t(stream, state); + } + + function tokenBaseUntilBrace() { + var depth = 1; + function t(stream, state) { + if (stream.peek() == "}") { + depth--; + if (depth == 0) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + } else if (stream.peek() == "{") { + depth++; + } + return tokenBase(stream, state); + } + t.isBase = true; + return t; + } + + function tokenVariableDeref(stream, state) { + var next = stream.match(/^(\.|[\w\$_]+)/) + if (!next) { + state.tokenize.pop() + return state.tokenize[state.tokenize.length-1](stream, state) + } + return next[0] == "." ? null : "variable" + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize.pop(); + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function expectExpression(last, newline) { + return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || + last == "newstatement" || last == "keyword" || last == "proplabel" || + (last == "standalone" && !newline); + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: [tokenBase], + context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), + indented: 0, + startOfLine: true, + lastToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + // Automatic semicolon insertion + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) { + popContext(state); ctx = state.context; + } + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = state.tokenize[state.tokenize.length-1](stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + // Handle indentation for {x -> \n ... } + else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { + popContext(state); + state.context.align = false; + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + state.lastToken = curPunc || style; + return style; + }, + + indent: function(state, textAfter) { + if (!state.tokenize[state.tokenize.length-1].isBase) return CodeMirror.Pass; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : config.indentUnit); + }, + + electricChars: "{}", + closeBrackets: {triples: "'\""}, + fold: "brace", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-groovy", "groovy"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js new file mode 100644 index 0000000000..d941d97433 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js @@ -0,0 +1,161 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + + // full haml mode. This handled embedded ruby and html fragments too + CodeMirror.defineMode("haml", function(config) { + var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); + var rubyMode = CodeMirror.getMode(config, "ruby"); + + function rubyInQuote(endQuote) { + return function(stream, state) { + var ch = stream.peek(); + if (ch == endQuote && state.rubyState.tokenize.length == 1) { + // step out of ruby context as it seems to complete processing all the braces + stream.next(); + state.tokenize = html; + return "closeAttributeTag"; + } else { + return ruby(stream, state); + } + }; + } + + function ruby(stream, state) { + if (stream.match("-#")) { + stream.skipToEnd(); + return "comment"; + } + return rubyMode.token(stream, state.rubyState); + } + + function html(stream, state) { + var ch = stream.peek(); + + // handle haml declarations. All declarations that cant be handled here + // will be passed to html mode + if (state.previousToken.style == "comment" ) { + if (state.indented > state.previousToken.indented) { + stream.skipToEnd(); + return "commentLine"; + } + } + + if (state.startOfLine) { + if (ch == "!" && stream.match("!!")) { + stream.skipToEnd(); + return "tag"; + } else if (stream.match(/^%[\w:#\.]+=/)) { + state.tokenize = ruby; + return "hamlTag"; + } else if (stream.match(/^%[\w:]+/)) { + return "hamlTag"; + } else if (ch == "/" ) { + stream.skipToEnd(); + return "comment"; + } + } + + if (state.startOfLine || state.previousToken.style == "hamlTag") { + if ( ch == "#" || ch == ".") { + stream.match(/[\w-#\.]*/); + return "hamlAttribute"; + } + } + + // do not handle --> as valid ruby, make it HTML close comment instead + if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) { + state.tokenize = ruby; + return state.tokenize(stream, state); + } + + if (state.previousToken.style == "hamlTag" || + state.previousToken.style == "closeAttributeTag" || + state.previousToken.style == "hamlAttribute") { + if (ch == "(") { + state.tokenize = rubyInQuote(")"); + return state.tokenize(stream, state); + } else if (ch == "{") { + if (!stream.match(/^\{%.*/)) { + state.tokenize = rubyInQuote("}"); + return state.tokenize(stream, state); + } + } + } + + return htmlMode.token(stream, state.htmlState); + } + + return { + // default to html mode + startState: function() { + var htmlState = CodeMirror.startState(htmlMode); + var rubyState = CodeMirror.startState(rubyMode); + return { + htmlState: htmlState, + rubyState: rubyState, + indented: 0, + previousToken: { style: null, indented: 0}, + tokenize: html + }; + }, + + copyState: function(state) { + return { + htmlState : CodeMirror.copyState(htmlMode, state.htmlState), + rubyState: CodeMirror.copyState(rubyMode, state.rubyState), + indented: state.indented, + previousToken: state.previousToken, + tokenize: state.tokenize + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + state.startOfLine = false; + // dont record comment line as we only want to measure comment line with + // the opening comment block + if (style && style != "commentLine") { + state.previousToken = { style: style, indented: state.indented }; + } + // if current state is ruby and the previous token is not `,` reset the + // tokenize to html + if (stream.eol() && state.tokenize == ruby) { + stream.backUp(1); + var ch = stream.peek(); + stream.next(); + if (ch && ch != ",") { + state.tokenize = html; + } + } + // reprocess some of the specific style tag when finish setting previousToken + if (style == "hamlTag") { + style = "tag"; + } else if (style == "commentLine") { + style = "comment"; + } else if (style == "hamlAttribute") { + style = "attribute"; + } else if (style == "closeAttributeTag") { + style = null; + } + return style; + } + }; + }, "htmlmixed", "ruby"); + + CodeMirror.defineMIME("text/x-haml", "haml"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js new file mode 100644 index 0000000000..359871a20d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js @@ -0,0 +1,70 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple"), require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple", "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode("handlebars-tags", { + start: [ + { regex: /\{\{\{/, push: "handlebars_raw", token: "tag" }, + { regex: /\{\{!--/, push: "dash_comment", token: "comment" }, + { regex: /\{\{!/, push: "comment", token: "comment" }, + { regex: /\{\{/, push: "handlebars", token: "tag" } + ], + handlebars_raw: [ + { regex: /\}\}\}/, pop: true, token: "tag" }, + ], + handlebars: [ + { regex: /\}\}/, pop: true, token: "tag" }, + + // Double and single quotes + { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, + { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, + + // Handlebars keywords + { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" }, + { regex: /(?:else|this)\b/, token: "keyword" }, + + // Numeral + { regex: /\d+/i, token: "number" }, + + // Atoms like = and . + { regex: /=|~|@|true|false/, token: "atom" }, + + // Paths + { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" } + ], + dash_comment: [ + { regex: /--\}\}/, pop: true, token: "comment" }, + + // Commented code + { regex: /./, token: "comment"} + ], + comment: [ + { regex: /\}\}/, pop: true, token: "comment" }, + { regex: /./, token: "comment" } + ], + meta: { + blockCommentStart: "{{--", + blockCommentEnd: "--}}" + } + }); + + CodeMirror.defineMode("handlebars", function(config, parserConfig) { + var handlebars = CodeMirror.getMode(config, "handlebars-tags"); + if (!parserConfig || !parserConfig.base) return handlebars; + return CodeMirror.multiplexingMode( + CodeMirror.getMode(config, parserConfig.base), + {open: "{{", close: /\}\}\}?/, mode: handlebars, parseDelimiters: true} + ); + }); + + CodeMirror.defineMIME("text/x-handlebars-template", "handlebars"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js new file mode 100644 index 0000000000..4bb9268491 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js @@ -0,0 +1,43 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../haskell/haskell")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../haskell/haskell"], mod) + else // Plain browser env + mod(CodeMirror) +})(function (CodeMirror) { + "use strict" + + CodeMirror.defineMode("haskell-literate", function (config, parserConfig) { + var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell") + + return { + startState: function () { + return { + inCode: false, + baseState: CodeMirror.startState(baseMode) + } + }, + token: function (stream, state) { + if (stream.sol()) { + if (state.inCode = stream.eat(">")) + return "meta" + } + if (state.inCode) { + return baseMode.token(stream, state.baseState) + } else { + stream.skipToEnd() + return "comment" + } + }, + innerMode: function (state) { + return state.inCode ? {state: state.baseState, mode: baseMode} : null + } + } + }, "haskell") + + CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js new file mode 100644 index 0000000000..2e882dc600 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js @@ -0,0 +1,268 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("haskell", function(_config, modeConfig) { + + function switchState(source, setState, f) { + setState(f); + return f(source, setState); + } + + // These should all be Unicode extended, as per the Haskell 2010 report + var smallRE = /[a-z_]/; + var largeRE = /[A-Z]/; + var digitRE = /\d/; + var hexitRE = /[0-9A-Fa-f]/; + var octitRE = /[0-7]/; + var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/; + var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; + var specialRE = /[(),;[\]`{}]/; + var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer + + function normal(source, setState) { + if (source.eatWhile(whiteCharRE)) { + return null; + } + + var ch = source.next(); + if (specialRE.test(ch)) { + if (ch == '{' && source.eat('-')) { + var t = "comment"; + if (source.eat('#')) { + t = "meta"; + } + return switchState(source, setState, ncomment(t, 1)); + } + return null; + } + + if (ch == '\'') { + if (source.eat('\\')) { + source.next(); // should handle other escapes here + } + else { + source.next(); + } + if (source.eat('\'')) { + return "string"; + } + return "string error"; + } + + if (ch == '"') { + return switchState(source, setState, stringLiteral); + } + + if (largeRE.test(ch)) { + source.eatWhile(idRE); + if (source.eat('.')) { + return "qualifier"; + } + return "variable-2"; + } + + if (smallRE.test(ch)) { + source.eatWhile(idRE); + return "variable"; + } + + if (digitRE.test(ch)) { + if (ch == '0') { + if (source.eat(/[xX]/)) { + source.eatWhile(hexitRE); // should require at least 1 + return "integer"; + } + if (source.eat(/[oO]/)) { + source.eatWhile(octitRE); // should require at least 1 + return "number"; + } + } + source.eatWhile(digitRE); + var t = "number"; + if (source.match(/^\.\d+/)) { + t = "number"; + } + if (source.eat(/[eE]/)) { + t = "number"; + source.eat(/[-+]/); + source.eatWhile(digitRE); // should require at least 1 + } + return t; + } + + if (ch == "." && source.eat(".")) + return "keyword"; + + if (symbolRE.test(ch)) { + if (ch == '-' && source.eat(/-/)) { + source.eatWhile(/-/); + if (!source.eat(symbolRE)) { + source.skipToEnd(); + return "comment"; + } + } + var t = "variable"; + if (ch == ':') { + t = "variable-2"; + } + source.eatWhile(symbolRE); + return t; + } + + return "error"; + } + + function ncomment(type, nest) { + if (nest == 0) { + return normal; + } + return function(source, setState) { + var currNest = nest; + while (!source.eol()) { + var ch = source.next(); + if (ch == '{' && source.eat('-')) { + ++currNest; + } + else if (ch == '-' && source.eat('}')) { + --currNest; + if (currNest == 0) { + setState(normal); + return type; + } + } + } + setState(ncomment(type, currNest)); + return type; + }; + } + + function stringLiteral(source, setState) { + while (!source.eol()) { + var ch = source.next(); + if (ch == '"') { + setState(normal); + return "string"; + } + if (ch == '\\') { + if (source.eol() || source.eat(whiteCharRE)) { + setState(stringGap); + return "string"; + } + if (source.eat('&')) { + } + else { + source.next(); // should handle other escapes here + } + } + } + setState(normal); + return "string error"; + } + + function stringGap(source, setState) { + if (source.eat('\\')) { + return switchState(source, setState, stringLiteral); + } + source.next(); + setState(normal); + return "error"; + } + + + var wellKnownWords = (function() { + var wkw = {}; + function setType(t) { + return function () { + for (var i = 0; i < arguments.length; i++) + wkw[arguments[i]] = t; + }; + } + + setType("keyword")( + "case", "class", "data", "default", "deriving", "do", "else", "foreign", + "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", + "module", "newtype", "of", "then", "type", "where", "_"); + + setType("keyword")( + "\.\.", ":", "::", "=", "\\", "<-", "->", "@", "~", "=>"); + + setType("builtin")( + "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<*", "<=", + "<$>", "<*>", "=<<", "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", + "*>", "**"); + + setType("builtin")( + "Applicative", "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", + "Eq", "False", "FilePath", "Float", "Floating", "Fractional", "Functor", + "GT", "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left", + "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read", + "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS", + "String", "True"); + + setType("builtin")( + "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf", + "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling", + "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", + "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", + "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", + "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter", + "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap", + "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", + "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents", + "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized", + "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", + "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map", + "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound", + "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or", + "otherwise", "pi", "pred", "print", "product", "properFraction", "pure", + "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", + "readIO", "readList", "readLn", "readParen", "reads", "readsPrec", + "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse", + "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", + "sequence", "sequence_", "show", "showChar", "showList", "showParen", + "showString", "shows", "showsPrec", "significand", "signum", "sin", + "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum", + "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger", + "toRational", "truncate", "uncurry", "undefined", "unlines", "until", + "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", + "zip3", "zipWith", "zipWith3"); + + var override = modeConfig.overrideKeywords; + if (override) for (var word in override) if (override.hasOwnProperty(word)) + wkw[word] = override[word]; + + return wkw; + })(); + + + + return { + startState: function () { return { f: normal }; }, + copyState: function (s) { return { f: s.f }; }, + + token: function(stream, state) { + var t = state.f(stream, function(s) { state.f = s; }); + var w = stream.current(); + return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t; + }, + + blockCommentStart: "{-", + blockCommentEnd: "-}", + lineComment: "--" + }; + +}); + +CodeMirror.defineMIME("text/x-haskell", "haskell"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js new file mode 100644 index 0000000000..45376852a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js @@ -0,0 +1,515 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("haxe", function(config, parserConfig) { + var indentUnit = config.indentUnit; + + // Tokenizer + + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}; + var type = kw("typedef"); + var keywords = { + "if": A, "while": A, "else": B, "do": B, "try": B, + "return": C, "break": C, "continue": C, "new": C, "throw": C, + "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"), + "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"), + "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "never": kw("property_access"), "trace":kw("trace"), + "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type, + "true": atom, "false": atom, "null": atom + }; + + var isOperatorChar = /[+\-*&%=<>!?|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function toUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next == end && !escaped) + return true; + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + + function haxeTokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + return chain(stream, state, haxeTokenString(ch)); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { + stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) { + toUnescaped(stream, "/"); + stream.eatWhile(/[gimsu]/); + return ret("regexp", "string-2"); + } else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, haxeTokenComment); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + } else if (ch == "#") { + stream.skipToEnd(); + return ret("conditional", "meta"); + } else if (ch == "@") { + stream.eat(/:/); + stream.eatWhile(/[\w_]/); + return ret ("metadata", "meta"); + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } else { + var word; + if(/[A-Z]/.test(ch)) { + stream.eatWhile(/[\w_<>]/); + word = stream.current(); + return ret("type", "variable-3", word); + } else { + stream.eatWhile(/[\w_]/); + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.kwAllowed) ? ret(known.type, known.style, word) : + ret("variable", "variable", word); + } + } + } + + function haxeTokenString(quote) { + return function(stream, state) { + if (toUnescaped(stream, quote)) + state.tokenize = haxeTokenBase; + return ret("string", "string"); + }; + } + + function haxeTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = haxeTokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; + + function HaxeLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + } + + function parseHaxe(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + if (type == "variable" && imported(state, content)) return "variable-3"; + return style; + } + } + } + + function imported(state, typename) { + if (/[a-z]/.test(typename.charAt(0))) + return false; + var len = state.importedtypes.length; + for (var i = 0; i= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) + if (v.name == name) return true; + return false; + } + function register(varname) { + var state = cx.state; + if (state.context) { + cx.marked = "def"; + if (inList(varname, state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else if (state.globalVars) { + if (inList(varname, state.globalVars)) return; + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: null}; + function pushcontext() { + if (!cx.state.context) cx.state.localVars = defaultVars; + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + popcontext.lex = true; + function pushlex(type, info) { + var result = function() { + var state = cx.state; + state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function f(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(f); + } + return f; + } + + function statement(type) { + if (type == "@") return cont(metadef); + if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "attribute") return cont(maybeattribute); + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), + poplex, statement, poplex); + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + if (type == "import") return cont(importdef, expect(";")); + if (type == "typedef") return cont(typedef); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); + if (type == "type" ) return cont(maybeoperator); + if (type == "function") return cont(functiondef); + if (type == "keyword c") return cont(maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); + if (type == "operator") return cont(expression); + if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator); + if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperator(type, value) { + if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); + if (type == "operator" || type == ":") return cont(expression); + if (type == ";") return; + if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); + if (type == ".") return cont(property, maybeoperator); + if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); + } + + function maybeattribute(type) { + if (type == "attribute") return cont(maybeattribute); + if (type == "function") return cont(functiondef); + if (type == "var") return cont(vardef1); + } + + function metadef(type) { + if(type == ":") return cont(metadef); + if(type == "variable") return cont(metadef); + if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement); + } + function metaargs(type) { + if(type == "variable") return cont(); + } + + function importdef (type, value) { + if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } + else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef); + } + + function typedef (type, value) + { + if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } + else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); } + } + + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperator, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type) { + if (type == "variable") cx.marked = "property"; + if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") return cont(what, proceed); + if (type == end) return cont(); + return cont(expect(end)); + } + return function(type) { + if (type == end) return cont(); + else return pass(what, proceed); + }; + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function vardef1(type, value) { + if (type == "variable"){register(value); return cont(typeuse, vardef2);} + return cont(); + } + function vardef2(type, value) { + if (value == "=") return cont(expression, vardef2); + if (type == ",") return cont(vardef1); + } + function forspec1(type, value) { + if (type == "variable") { + register(value); + return cont(forin, expression) + } else { + return pass() + } + } + function forin(_type, value) { + if (value == "in") return cont(); + } + function functiondef(type, value) { + //function names starting with upper-case letters are recognised as types, so cludging them together here. + if (type == "variable" || type == "type") {register(value); return cont(functiondef);} + if (value == "new") return cont(functiondef); + if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext); + } + function typeuse(type) { + if(type == ":") return cont(typestring); + } + function typestring(type) { + if(type == "type") return cont(); + if(type == "variable") return cont(); + if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex); + } + function typeprop(type) { + if(type == "variable") return cont(typeuse); + } + function funarg(type, value) { + if (type == "variable") {register(value); return cont(typeuse);} + } + + // Interface + return { + startState: function(basecolumn) { + var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"]; + var state = { + tokenize: haxeTokenBase, + reAllowed: true, + kwAllowed: true, + cc: [], + lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + importedtypes: defaulttypes, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/)); + state.kwAllowed = type != '.'; + return parseHaxe(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize != haxeTokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + if (type == "vardef") return lexical.indented + 4; + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "stat" || type == "form") return lexical.indented + indentUnit; + else if (lexical.info == "switch" && !closing) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-haxe", "haxe"); + +CodeMirror.defineMode("hxml", function () { + + return { + startState: function () { + return { + define: false, + inString: false + }; + }, + token: function (stream, state) { + var ch = stream.peek(); + var sol = stream.sol(); + + ///* comments */ + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + if (sol && ch == "-") { + var style = "variable-2"; + + stream.eat(/-/); + + if (stream.peek() == "-") { + stream.eat(/-/); + style = "keyword a"; + } + + if (stream.peek() == "D") { + stream.eat(/[D]/); + style = "keyword c"; + state.define = true; + } + + stream.eatWhile(/[A-Z]/i); + return style; + } + + var ch = stream.peek(); + + if (state.inString == false && ch == "'") { + state.inString = true; + stream.next(); + } + + if (state.inString == true) { + if (stream.skipTo("'")) { + + } else { + stream.skipToEnd(); + } + + if (stream.peek() == "'") { + stream.next(); + state.inString = false; + } + + return "string"; + } + + stream.next(); + return null; + }, + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-hxml", "hxml"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js new file mode 100644 index 0000000000..439e63a427 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js @@ -0,0 +1,37 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { + var closeComment = parserConfig.closeComment || "--%>" + return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { + open: parserConfig.openComment || "<%--", + close: closeComment, + delimStyle: "comment", + mode: {token: function(stream) { + stream.skipTo(closeComment) || stream.skipToEnd() + return "comment" + }} + }, { + open: parserConfig.open || parserConfig.scriptStartRegex || "<%", + close: parserConfig.close || parserConfig.scriptEndRegex || "%>", + mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) + }); + }, "htmlmixed"); + + CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); + CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); + CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); + CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js new file mode 100644 index 0000000000..af3138179a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js @@ -0,0 +1,153 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaultTags = { + script: [ + ["lang", /(javascript|babel)/i, "javascript"], + ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, "javascript"], + ["type", /./, "text/plain"], + [null, null, "javascript"] + ], + style: [ + ["lang", /^css$/i, "css"], + ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], + ["type", /./, "text/plain"], + [null, null, "css"] + ] + }; + + function maybeBackup(stream, pat, style) { + var cur = stream.current(), close = cur.search(pat); + if (close > -1) { + stream.backUp(cur.length - close); + } else if (cur.match(/<\/?$/)) { + stream.backUp(cur.length); + if (!stream.match(pat, false)) stream.match(cur); + } + return style; + } + + var attrRegexpCache = {}; + function getAttrRegexp(attr) { + var regexp = attrRegexpCache[attr]; + if (regexp) return regexp; + return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*"); + } + + function getAttrValue(text, attr) { + var match = text.match(getAttrRegexp(attr)) + return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : "" + } + + function getTagRegexp(tagName, anchored) { + return new RegExp((anchored ? "^" : "") + "<\/\\s*" + tagName + "\\s*>", "i"); + } + + function addTags(from, to) { + for (var tag in from) { + var dest = to[tag] || (to[tag] = []); + var source = from[tag]; + for (var i = source.length - 1; i >= 0; i--) + dest.unshift(source[i]) + } + } + + function findMatchingMode(tagInfo, tagText) { + for (var i = 0; i < tagInfo.length; i++) { + var spec = tagInfo[i]; + if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; + } + } + + CodeMirror.defineMode("htmlmixed", function (config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, { + name: "xml", + htmlMode: true, + multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, + multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag, + allowMissingTagName: parserConfig.allowMissingTagName, + }); + + var tags = {}; + var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; + addTags(defaultTags, tags); + if (configTags) addTags(configTags, tags); + if (configScript) for (var i = configScript.length - 1; i >= 0; i--) + tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]) + + function html(stream, state) { + var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName + if (tag && !/[<>\s\/]/.test(stream.current()) && + (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && + tags.hasOwnProperty(tagName)) { + state.inTag = tagName + " " + } else if (state.inTag && tag && />$/.test(stream.current())) { + var inTag = /^([\S]+) (.*)/.exec(state.inTag) + state.inTag = null + var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]) + var mode = CodeMirror.getMode(config, modeSpec) + var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); + state.token = function (stream, state) { + if (stream.match(endTagA, false)) { + state.token = html; + state.localState = state.localMode = null; + return null; + } + return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState)); + }; + state.localMode = mode; + state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "", "")); + } else if (state.inTag) { + state.inTag += stream.current() + if (stream.eol()) state.inTag += " " + } + return style; + }; + + return { + startState: function () { + var state = CodeMirror.startState(htmlMode); + return {token: html, inTag: null, localMode: null, localState: null, htmlState: state}; + }, + + copyState: function (state) { + var local; + if (state.localState) { + local = CodeMirror.copyState(state.localMode, state.localState); + } + return {token: state.token, inTag: state.inTag, + localMode: state.localMode, localState: local, + htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; + }, + + token: function (stream, state) { + return state.token(stream, state); + }, + + indent: function (state, textAfter, line) { + if (!state.localMode || /^\s*<\//.test(textAfter)) + return htmlMode.indent(state.htmlState, textAfter, line); + else if (state.localMode.indent) + return state.localMode.indent(state.localState, textAfter, line); + else + return CodeMirror.Pass; + }, + + innerMode: function (state) { + return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; + } + }; + }, "xml", "javascript", "css"); + + CodeMirror.defineMIME("text/html", "htmlmixed"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js new file mode 100644 index 0000000000..092353259f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js @@ -0,0 +1,113 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("http", function() { + function failFirstLine(stream, state) { + stream.skipToEnd(); + state.cur = header; + return "error"; + } + + function start(stream, state) { + if (stream.match(/^HTTP\/\d\.\d/)) { + state.cur = responseStatusCode; + return "keyword"; + } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) { + state.cur = requestPath; + return "keyword"; + } else { + return failFirstLine(stream, state); + } + } + + function responseStatusCode(stream, state) { + var code = stream.match(/^\d+/); + if (!code) return failFirstLine(stream, state); + + state.cur = responseStatusText; + var status = Number(code[0]); + if (status >= 100 && status < 200) { + return "positive informational"; + } else if (status >= 200 && status < 300) { + return "positive success"; + } else if (status >= 300 && status < 400) { + return "positive redirect"; + } else if (status >= 400 && status < 500) { + return "negative client-error"; + } else if (status >= 500 && status < 600) { + return "negative server-error"; + } else { + return "error"; + } + } + + function responseStatusText(stream, state) { + stream.skipToEnd(); + state.cur = header; + return null; + } + + function requestPath(stream, state) { + stream.eatWhile(/\S/); + state.cur = requestProtocol; + return "string-2"; + } + + function requestProtocol(stream, state) { + if (stream.match(/^HTTP\/\d\.\d$/)) { + state.cur = header; + return "keyword"; + } else { + return failFirstLine(stream, state); + } + } + + function header(stream) { + if (stream.sol() && !stream.eat(/[ \t]/)) { + if (stream.match(/^.*?:/)) { + return "atom"; + } else { + stream.skipToEnd(); + return "error"; + } + } else { + stream.skipToEnd(); + return "string"; + } + } + + function body(stream) { + stream.skipToEnd(); + return null; + } + + return { + token: function(stream, state) { + var cur = state.cur; + if (cur != header && cur != body && stream.eatSpace()) return null; + return cur(stream, state); + }, + + blankLine: function(state) { + state.cur = body; + }, + + startState: function() { + return {cur: start}; + } + }; +}); + +CodeMirror.defineMIME("message/http", "http"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js new file mode 100644 index 0000000000..37302bb90f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js @@ -0,0 +1,290 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp('^((' + words.join(')|(') + '))\\b', 'i'); + }; + + var builtinArray = [ + 'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog', + 'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir', + 'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices', + 'arrow', 'ascii_template', 'asin', 'assoc', 'atan', + 'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot', + 'bar_plot', 'beseli', 'beselj', 'beselk', 'besely', + 'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template', + 'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy', + 'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor', + 'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr', + 'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar', + 'caldat', 'call_external', 'call_function', 'call_method', + 'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil', + 'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc', + 'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close', + 'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage', + 'color_convert', 'color_exchange', 'color_quan', 'color_range_map', + 'colorbar', 'colorize_sample', 'colormap_applicable', + 'colormap_gradient', 'colormap_rotation', 'colortable', + 'comfit', 'command_line_args', 'common', 'compile_opt', 'complex', + 'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid', + 'conj', 'constrained_min', 'contour', 'contour', 'convert_coord', + 'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate', + 'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata', + 'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength', + 'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord', + 'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load', + 'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index', + 'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form', + 'cw_fslider', 'cw_light_editor', 'cw_light_editor_get', + 'cw_light_editor_set', 'cw_orient', 'cw_palette_editor', + 'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu', + 'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists', + 'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key', + 'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv', + 'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig', + 'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect', + 'dialog_message', 'dialog_pickfile', 'dialog_printersetup', + 'dialog_printjob', 'dialog_read_image', + 'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen', + 'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register', + 'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont', + 'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss', + 'empty', 'enable_sysrtn', 'eof', 'eos', 'erase', + 'erf', 'erfc', 'erfcx', 'erode', 'errorplot', + 'errplot', 'estimator_filter', 'execute', 'exit', 'exp', + 'expand', 'expand_path', 'expint', 'extract', 'extract_slice', + 'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename', + 'file_chmod', 'file_copy', 'file_delete', 'file_dirname', + 'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info', + 'file_lines', 'file_link', 'file_mkdir', 'file_move', + 'file_poll_input', 'file_readlink', 'file_same', + 'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip', + 'file_which', 'file_zip', 'filepath', 'findgen', 'finite', + 'fix', 'flick', 'float', 'floor', 'flow3', + 'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun', + 'fstat', 'fulstr', 'funct', 'function', 'fv_test', + 'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf', + 'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit', + 'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects', + 'get_kbrd', 'get_login_info', + 'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul', + 'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata', + 'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash', + 'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave', + 'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d', + 'hist_equal', 'histogram', 'hls', 'hough', 'hqr', + 'hsv', 'i18n_multibytetoutf8', + 'i18n_multibytetowidechar', 'i18n_utf8tomultibyte', + 'i18n_widechartomultibyte', + 'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity', + 'idl_base64', 'idl_container', 'idl_validname', + 'idlexbr_assistant', 'idlitsys_createtool', + 'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata', + 'igetid', 'igetproperty', 'iimage', 'image', 'image_cont', + 'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen', + 'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol', + 'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen', + 'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata', + 'iregister', 'ireset', 'iresolve', 'irotate', 'isa', + 'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft', + 'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate', + 'ivector', 'ivolume', 'izoom', 'journal', 'json_parse', + 'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d', + 'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove', + 'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec', + 'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert', + 'la_least_square_equality', 'la_least_squares', 'la_linear_equation', + 'la_ludc', 'la_lumprove', 'la_lusol', + 'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired', + 'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre', + 'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter', + 'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen', + 'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit', + 'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get', + 'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr', + 'long', 'long64', 'lsode', 'lu_complex', 'ludc', + 'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array', + 'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid', + 'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch', + 'map_proj_forward', 'map_proj_image', 'map_proj_info', + 'map_proj_init', 'map_proj_inverse', + 'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test', + 'mean', 'meanabsdev', 'mean_filter', 'median', 'memory', + 'mesh_clip', 'mesh_decimate', 'mesh_issolid', + 'mesh_merge', 'mesh_numtriangles', + 'mesh_obj', 'mesh_smooth', 'mesh_surfacearea', + 'mesh_validate', 'mesh_volume', + 'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct', + 'moment', 'morph_close', 'morph_distance', + 'morph_gradient', 'morph_hitormiss', + 'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements', + 'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl', + 'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class', + 'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid', + 'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr', + 'openu', 'openw', 'oplot', 'oploterr', 'orderedhash', + 'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep', + 'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox', + 'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface', + 'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot', + 'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv', + 'polygon', 'polyline', 'polywarp', 'popd', 'powell', + 'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes', + 'print', 'printf', 'printd', 'pro', 'product', + 'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts', + 'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid', + 'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb', + 'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp', + 'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg', + 'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm', + 'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate', + 'r_test', 'radon', 'randomn', 'randomu', 'ranks', + 'rdpix', 'read', 'readf', 'read_ascii', 'read_binary', + 'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image', + 'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict', + 'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk', + 'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap', + 'read_xwd', 'reads', 'readu', 'real_part', 'rebin', + 'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow', + 'register_cursor', 'regress', 'replicate', + 'replicate_inplace', 'resolve_all', + 'resolve_routine', 'restore', 'retall', 'return', 'reverse', + 'rk4', 'roberts', 'rot', 'rotate', 'round', + 'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save', + 'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d', + 'scope_level', 'scope_traceback', 'scope_varfetch', + 'scope_varname', 'search2d', + 'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release', + 'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf', + 'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug', + 'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont', + 'signum', 'simplex', 'sin', 'sindgen', 'sinh', + 'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image', + 'smooth', 'sobel', 'socket', 'sort', 'spawn', + 'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp', + 'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin', + 'sprstp', 'sqrt', 'standardize', 'stddev', 'stop', + 'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline', + 'stregex', 'stretch', 'string', 'strjoin', 'strlen', + 'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos', + 'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide', + 'strupcase', 'surface', 'surface', 'surfr', 'svdc', + 'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol', + 'systime', 't_cvf', 't_pdf', 't3d', 'tag_names', + 'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size', + 'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin', + 'thread', 'threed', 'tic', 'time_test2', 'timegen', + 'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc', + 'total', 'trace', 'transpose', 'tri_surf', 'triangulate', + 'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun', + 'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv', + 'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename', + 'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen', + 'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq', + 'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector', + 'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt', + 'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri', + 'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base', + 'widget_button', 'widget_combobox', 'widget_control', + 'widget_displaycontextmenu', 'widget_draw', + 'widget_droplist', 'widget_event', 'widget_info', + 'widget_label', 'widget_list', + 'widget_propertysheet', 'widget_slider', 'widget_tab', + 'widget_table', 'widget_text', + 'widget_tree', 'widget_tree_move', 'widget_window', + 'wiener_filter', 'window', + 'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image', + 'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png', + 'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff', + 'write_video', 'write_wav', 'write_wave', 'writeu', 'wset', + 'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet', + 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet', + 'wv_fn_daubechies', 'wv_fn_gaussian', + 'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul', + 'wv_fn_symlet', 'wv_import_data', + 'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires', + 'wv_pwt', 'wv_tool_denoise', + 'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate', + 'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview', + 'xobjview_rotate', 'xobjview_write_image', + 'xpalette', 'xpcolor', 'xplot3d', + 'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit', + 'xvolume', 'xvolume_rotate', 'xvolume_write_image', + 'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24' + ]; + var builtins = wordRegexp(builtinArray); + + var keywordArray = [ + 'begin', 'end', 'endcase', 'endfor', + 'endwhile', 'endif', 'endrep', 'endforeach', + 'break', 'case', 'continue', 'for', + 'foreach', 'goto', 'if', 'then', 'else', + 'repeat', 'until', 'switch', 'while', + 'do', 'pro', 'function' + ]; + var keywords = wordRegexp(keywordArray); + + CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray)); + + var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i'); + + var singleOperators = /[+\-*&=<>\/@#~$]/; + var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i'); + + function tokenBase(stream) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match(';')) { + stream.skipToEnd(); + return 'comment'; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) + return 'number'; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) + return 'number'; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) + return 'number'; + } + + // Handle Strings + if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } + if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } + + // Handle words + if (stream.match(keywords)) { return 'keyword'; } + if (stream.match(builtins)) { return 'builtin'; } + if (stream.match(identifiers)) { return 'variable'; } + + if (stream.match(singleOperators) || stream.match(boolOperators)) { + return 'operator'; } + + // Handle non-detected items + stream.next(); + return null; + }; + + CodeMirror.defineMode('idl', function() { + return { + token: function(stream) { + return tokenBase(stream); + } + }; + }); + + CodeMirror.defineMIME('text/x-idl', 'idl'); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js new file mode 100644 index 0000000000..7cfee313a3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js @@ -0,0 +1,960 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + return { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, + "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, + "await": C + }; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property") + } else if (ch == "<" && stream.match("!--") || + (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) { + stream.skipToEnd() + return ret("comment", "comment") + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("=") + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch) + if (ch == ">") stream.eat(ch) + } + } + if (ch == "?" && stream.eat(".")) return ret(".") + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current() + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word] + return ret(kw.type, kw.style, word) + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) + return ret("async", "keyword", word) + } + return ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + if (isTS) { // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) + if (m) arrow = m.index + } + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) { if (ch == "(") sawSomething = true; break; } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (;; --pos) { + if (pos == 0) return + var next = stream.string.charAt(pos - 1) + if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, + "regexp": true, "this": true, "import": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + if (!trackScope) return false + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + // FIXME function decls are also not block scoped + var newContext = registerVarScoped(varname, state.context) + if (newContext != null) { + state.context = newContext + return + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars) + return + } + } + // Fall through means this is global + if (parserConfig.globalVars && !inList(varname, state.globalVars)) + state.globalVars = new Var(varname, state.globalVars) + } + function registerVarScoped(varname, context) { + if (!context) { + return null + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev) + if (!inner) return null + if (inner == context.prev) return context + return new Context(inner, context.vars, true) + } else if (inList(varname, context.vars)) { + return context + } else { + return new Context(context.prev, new Var(varname, context.vars), false) + } + } + + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" + } + + // Combinators + + function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block } + function Var(name, next) { this.name = name; this.next = next } + + var defaultVars = new Var("this", new Var("arguments", null)) + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false) + cx.state.localVars = defaultVars + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true) + cx.state.localVars = null + } + pushcontext.lex = pushblockcontext.lex = true + function popcontext() { + cx.state.localVars = cx.state.context.vars + cx.state.context = cx.state.context.prev + } + popcontext.lex = true + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type == "debugger") return cont(expect(";")); + if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type == "class" || (isTS && value == "interface")) { + cx.marked = "keyword" + return cont(pushlex("form", type == "class" ? type : value), className, poplex) + } + if (type == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword" + return cont(statement) + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword" + if (value == "enum") return cont(enumdef); + else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";")); + else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + } else if (isTS && value == "namespace") { + cx.marked = "keyword" + return cont(pushlex("form"), expression, statement, poplex) + } else if (isTS && value == "abstract") { + cx.marked = "keyword" + return cont(statement) + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, + block, poplex, poplex, popcontext); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "async") return cont(statement) + if (value == "@") return cont(expression, statement) + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type) { + if (type == "(") return cont(funarg, expect(")")) + } + function expression(type, value) { + return expressionInner(type, value, false); + } + function expressionNoComma(type, value) { + return expressionInner(type, value, true); + } + function parenExpr(type) { + if (type != "(") return pass() + return cont(pushlex(")"), maybeexpression, expect(")"), poplex) + } + function expressionInner(type, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); } + if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) + return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } + if (type == "regexp") { + cx.state.lastType = cx.marked = "operator" + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1) + return cont(expr) + } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type) { + if (type == ".") return cont(noComma ? targetNoComma : target); + else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } + } + function targetNoComma(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) + cx.state.fatArrowAt = cx.stream.pos + m[0].length + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword" + return cont(objprop) + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type == ":") { + return pass(afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type, value) { + if (type == end || value == end) return pass() + return pass(what) + }, proceed); + } + if (type == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what) + return cont(expect(end)); + } + return function(type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type, value) { + if (isTS && (type == ":" || value == "in")) return cont(typeexpr) + } + function mayberettype(type) { + if (isTS && type == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) + else return cont(typeexpr) + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword" + return cont() + } + } + function typeexpr(type, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword" + return cont(value == "typeof" ? expressionNoComma : typeexpr) + } + if (type == "variable" || value == "void") { + cx.marked = "type" + return cont(afterType) + } + if (value == "|" || value == "&") return cont(typeexpr) + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) + if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType) + if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) + if (type == "quasi") { return pass(quasiType, afterType); } + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprops(type) { + if (type.match(/[\}\)\]]/)) return cont() + if (type == "," || type == ";") return cont(typeprops) + return pass(typeprop, typeprops) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?" || type == "number" || type == "string") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop) + } else if (type == "(") { + return pass(functiondecl, typeprop) + } else if (!type.match(/[;\}\)\],]/)) { + return cont() + } + } + function quasiType(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type, value) { + if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) + if (type == ":") return cont(typeexpr) + if (type == "spread") return cont(typearg) + return pass(typeexpr) + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + if (value == "|" || type == "." || value == "&") return cont(typeexpr) + if (type == "[") return cont(typeexpr, expect("]"), afterType) + if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr) + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault) + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr) + } + function vardef(_, value) { + if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)} + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) } + if (type == "variable") { register(value); return cont(); } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(eltpattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign) + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type, value) { + if (value == "await") return cont(forspec); + if (type == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, forspec2); + if (type == "variable") return cont(forspec2); + return pass(forspec2) + } + function forspec2(type, value) { + if (type == ")") return cont() + if (type == ";") return cont(forspec2) + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) } + return pass(expression, forspec2) + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) + } + function functiondecl(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);} + if (type == "variable") {register(value); return cont(functiondecl);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl) + } + function typename(type, value) { + if (type == "keyword" || type == "variable") { + cx.marked = "type" + return cont(typename) + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex) + } + } + function funarg(type, value) { + if (value == "@") cont(expression, funarg) + if (type == "spread") return cont(funarg); + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); } + if (isTS && type == "this") return cont(maybetype, maybeAssign) + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) + if (value == "extends" || value == "implements" || (isTS && type == ",")) { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "async" || + (type == "variable" && + (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type == "number" || type == "string") return cont(classfield, classBody); + if (type == "[") + return cont(expression, maybetype, expect("]"), classfield, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type == "(") return pass(functiondecl, classBody) + if (type == ";" || type == ",") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "!") return cont(classfield) + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + var context = cx.state.lexical.prev, isInterface = context && context.info == "interface" + return pass(isInterface ? functiondecl : functiondef) + } + function afterExport(type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + if (type == "(") return pass(expression); + if (type == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports) + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex) + } + function enummember() { + return pass(pattern, maybeAssign); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && + /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && + (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && + (top == maybeoperatorComma || top == maybeoperatorNoComma) && + !/^[,\.=+\-*:?[\(]/.test(textAfter)))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + + expressionAllowed: expressionAllowed, + + skipExpression: function(state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)) + } + }; +}); + +CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/x-javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", { name: "javascript", json: true }); +CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }); +CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true }) +CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js new file mode 100644 index 0000000000..77c9b22cae --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js @@ -0,0 +1,146 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("jinja2", function() { + var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif", + "extends", "filter", "endfilter", "firstof", "for", + "endfor", "if", "endif", "ifchanged", "endifchanged", + "ifequal", "endifequal", "ifnotequal", + "endifnotequal", "in", "include", "load", "not", "now", "or", + "parsed", "regroup", "reversed", "spaceless", + "endspaceless", "ssi", "templatetag", "openblock", + "closeblock", "openvariable", "closevariable", + "openbrace", "closebrace", "opencomment", + "closecomment", "widthratio", "url", "with", "endwith", + "get_current_language", "trans", "endtrans", "noop", "blocktrans", + "endblocktrans", "get_available_languages", + "get_current_language_bidi", "plural"], + operator = /^[+\-*&%=<>!?|~^]/, + sign = /^[:\[\(\{]/, + atom = ["true", "false"], + number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; + + keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); + atom = new RegExp("((" + atom.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + var ch = stream.peek(); + + //Comment + if (state.incomment) { + if(!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Tag + } else if (state.intag) { + //After operator + if(state.operator) { + state.operator = false; + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + } + //After sign + if(state.sign) { + state.sign = false; + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + } + + if(state.instring) { + if(ch == state.instring) { + state.instring = false; + } + stream.next(); + return "string"; + } else if(ch == "'" || ch == '"') { + state.instring = ch; + stream.next(); + return "string"; + } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { + state.intag = false; + return "tag"; + } else if(stream.match(operator)) { + state.operator = true; + return "operator"; + } else if(stream.match(sign)) { + state.sign = true; + } else { + if(stream.eat(" ") || stream.sol()) { + if(stream.match(keywords)) { + return "keyword"; + } + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + if(stream.sol()) { + stream.next(); + } + } else { + stream.next(); + } + + } + return "variable"; + } else if (stream.eat("{")) { + if (stream.eat("#")) { + state.incomment = true; + if(!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Open tag + } else if (ch = stream.eat(/\{|%/)) { + //Cache close tag + state.intag = ch; + if(ch == "{") { + state.intag = "}"; + } + stream.eat("-"); + return "tag"; + } + } + stream.next(); + }; + + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + }, + blockCommentStart: "{#", + blockCommentEnd: "#}" + }; + }); + + CodeMirror.defineMIME("text/jinja2", "jinja2"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js new file mode 100644 index 0000000000..beea3b9139 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js @@ -0,0 +1,148 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + // Depth means the amount of open braces in JS context, in XML + // context 0 means not in tag, 1 means in tag, and 2 means in tag + // and js block comment. + function Context(state, mode, depth, prev) { + this.state = state; this.mode = mode; this.depth = depth; this.prev = prev + } + + function copyContext(context) { + return new Context(CodeMirror.copyState(context.mode, context.state), + context.mode, + context.depth, + context.prev && copyContext(context.prev)) + } + + CodeMirror.defineMode("jsx", function(config, modeConfig) { + var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false, allowMissingTagName: true}) + var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript") + + function flatXMLIndent(state) { + var tagName = state.tagName + state.tagName = null + var result = xmlMode.indent(state, "", "") + state.tagName = tagName + return result + } + + function token(stream, state) { + if (state.context.mode == xmlMode) + return xmlToken(stream, state, state.context) + else + return jsToken(stream, state, state.context) + } + + function xmlToken(stream, state, cx) { + if (cx.depth == 2) { // Inside a JS /* */ comment + if (stream.match(/^.*?\*\//)) cx.depth = 1 + else stream.skipToEnd() + return "comment" + } + + if (stream.peek() == "{") { + xmlMode.skipAttribute(cx.state) + + var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context + // If JS starts on same line as tag + if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) { + while (xmlContext.prev && !xmlContext.startOfLine) + xmlContext = xmlContext.prev + // If tag starts the line, use XML indentation level + if (xmlContext.startOfLine) indent -= config.indentUnit + // Else use JS indentation level + else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented + // Else if inside of tag + } else if (cx.depth == 1) { + indent += config.indentUnit + } + + state.context = new Context(CodeMirror.startState(jsMode, indent), + jsMode, 0, state.context) + return null + } + + if (cx.depth == 1) { // Inside of tag + if (stream.peek() == "<") { // Tag inside of tag + xmlMode.skipAttribute(cx.state) + state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)), + xmlMode, 0, state.context) + return null + } else if (stream.match("//")) { + stream.skipToEnd() + return "comment" + } else if (stream.match("/*")) { + cx.depth = 2 + return token(stream, state) + } + } + + var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop + if (/\btag\b/.test(style)) { + if (/>$/.test(cur)) { + if (cx.state.context) cx.depth = 0 + else state.context = state.context.prev + } else if (/^ -1) { + stream.backUp(cur.length - stop) + } + return style + } + + function jsToken(stream, state, cx) { + if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) { + state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "", "")), + xmlMode, 0, state.context) + jsMode.skipExpression(cx.state) + return null + } + + var style = jsMode.token(stream, cx.state) + if (!style && cx.depth != null) { + var cur = stream.current() + if (cur == "{") { + cx.depth++ + } else if (cur == "}") { + if (--cx.depth == 0) state.context = state.context.prev + } + } + return style + } + + return { + startState: function() { + return {context: new Context(CodeMirror.startState(jsMode), jsMode)} + }, + + copyState: function(state) { + return {context: copyContext(state.context)} + }, + + token: token, + + indent: function(state, textAfter, fullLine) { + return state.context.mode.indent(state.context.state, textAfter, fullLine) + }, + + innerMode: function(state) { + return state.context + } + } + }, "xml", "javascript") + + CodeMirror.defineMIME("text/jsx", "jsx") + CodeMirror.defineMIME("text/typescript-jsx", {name: "jsx", base: {name: "javascript", typescript: true}}) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js new file mode 100644 index 0000000000..cb0d69c8e2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js @@ -0,0 +1,390 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("julia", function(config, parserConf) { + function wordRegexp(words, end, pre) { + if (typeof pre === "undefined") { pre = ""; } + if (typeof end === "undefined") { end = "\\b"; } + return new RegExp("^" + pre + "((" + words.join(")|(") + "))" + end); + } + + var octChar = "\\\\[0-7]{1,3}"; + var hexChar = "\\\\x[A-Fa-f0-9]{1,2}"; + var sChar = "\\\\[abefnrtv0%?'\"\\\\]"; + var uChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])"; + + var asciiOperatorsList = [ + "[<>]:", "[<>=]=", "<<=?", ">>>?=?", "=>", "--?>", "<--[->]?", "\\/\\/", + "\\.{2,3}", "[\\.\\\\%*+\\-<>!\\/^|&]=?", "\\?", "\\$", "~", ":" + ]; + var operators = parserConf.operators || wordRegexp([ + "[<>]:", "[<>=]=", "<<=?", ">>>?=?", "=>", "--?>", "<--[->]?", "\\/\\/", + "[\\\\%*+\\-<>!\\/^|&\\u00F7\\u22BB]=?", "\\?", "\\$", "~", ":", + "\\u00D7", "\\u2208", "\\u2209", "\\u220B", "\\u220C", "\\u2218", + "\\u221A", "\\u221B", "\\u2229", "\\u222A", "\\u2260", "\\u2264", + "\\u2265", "\\u2286", "\\u2288", "\\u228A", "\\u22C5", + "\\b(in|isa)\\b(?!\.?\\()" + ], ""); + var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; + var identifiers = parserConf.identifiers || + /^[_A-Za-z\u00A1-\u2217\u2219-\uFFFF][\w\u00A1-\u2217\u2219-\uFFFF]*!*/; + + var chars = wordRegexp([octChar, hexChar, sChar, uChar], "'"); + + var openersList = ["begin", "function", "type", "struct", "immutable", "let", + "macro", "for", "while", "quote", "if", "else", "elseif", "try", + "finally", "catch", "do"]; + + var closersList = ["end", "else", "elseif", "catch", "finally"]; + + var keywordsList = ["if", "else", "elseif", "while", "for", "begin", "let", + "end", "do", "try", "catch", "finally", "return", "break", "continue", + "global", "local", "const", "export", "import", "importall", "using", + "function", "where", "macro", "module", "baremodule", "struct", "type", + "mutable", "immutable", "quote", "typealias", "abstract", "primitive", + "bitstype"]; + + var builtinsList = ["true", "false", "nothing", "NaN", "Inf"]; + + CodeMirror.registerHelper("hintWords", "julia", keywordsList.concat(builtinsList)); + + var openers = wordRegexp(openersList); + var closers = wordRegexp(closersList); + var keywords = wordRegexp(keywordsList); + var builtins = wordRegexp(builtinsList); + + var macro = /^@[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; + var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; + var stringPrefixes = /^(`|([_A-Za-z\u00A1-\uFFFF]*"("")?))/; + + var macroOperators = wordRegexp(asciiOperatorsList, "", "@"); + var symbolOperators = wordRegexp(asciiOperatorsList, "", ":"); + + function inArray(state) { + return (state.nestedArrays > 0); + } + + function inGenerator(state) { + return (state.nestedGenerators > 0); + } + + function currentScope(state, n) { + if (typeof(n) === "undefined") { n = 0; } + if (state.scopes.length <= n) { + return null; + } + return state.scopes[state.scopes.length - (n + 1)]; + } + + // tokenizers + function tokenBase(stream, state) { + // Handle multiline comments + if (stream.match('#=', false)) { + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + + // Handle scope changes + var leavingExpr = state.leavingExpr; + if (stream.sol()) { + leavingExpr = false; + } + state.leavingExpr = false; + + if (leavingExpr) { + if (stream.match(/^'+/)) { + return "operator"; + } + } + + if (stream.match(/\.{4,}/)) { + return "error"; + } else if (stream.match(/\.{1,3}/)) { + return "operator"; + } + + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle single line comments + if (ch === '#') { + stream.skipToEnd(); + return "comment"; + } + + if (ch === '[') { + state.scopes.push('['); + state.nestedArrays++; + } + + if (ch === '(') { + state.scopes.push('('); + state.nestedGenerators++; + } + + if (inArray(state) && ch === ']') { + while (state.scopes.length && currentScope(state) !== "[") { state.scopes.pop(); } + state.scopes.pop(); + state.nestedArrays--; + state.leavingExpr = true; + } + + if (inGenerator(state) && ch === ')') { + while (state.scopes.length && currentScope(state) !== "(") { state.scopes.pop(); } + state.scopes.pop(); + state.nestedGenerators--; + state.leavingExpr = true; + } + + if (inArray(state)) { + if (state.lastToken == "end" && stream.match(':')) { + return "operator"; + } + if (stream.match('end')) { + return "number"; + } + } + + var match; + if (match = stream.match(openers, false)) { + state.scopes.push(match[0]); + } + + if (stream.match(closers, false)) { + state.scopes.pop(); + } + + // Handle type annotations + if (stream.match(/^::(?![:\$])/)) { + state.tokenize = tokenAnnotation; + return state.tokenize(stream, state); + } + + // Handle symbols + if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) { + return "builtin"; + } + + // Handle parametric types + //if (stream.match(/^{[^}]*}(?=\()/)) { + // return "builtin"; + //} + + // Handle operators and Delimiters + if (stream.match(operators)) { + return "operator"; + } + + // Handle Number Literals + if (stream.match(/^\.?\d/, false)) { + var imMatcher = RegExp(/^im\b/); + var numberLiteral = false; + if (stream.match(/^0x\.[0-9a-f_]+p[\+\-]?[_\d]+/i)) { numberLiteral = true; } + // Integers + if (stream.match(/^0x[0-9a-f_]+/i)) { numberLiteral = true; } // Hex + if (stream.match(/^0b[01_]+/i)) { numberLiteral = true; } // Binary + if (stream.match(/^0o[0-7_]+/i)) { numberLiteral = true; } // Octal + // Floats + if (stream.match(/^(?:(?:\d[_\d]*)?\.(?!\.)(?:\d[_\d]*)?|\d[_\d]*\.(?!\.)(?:\d[_\d]*))?([Eef][\+\-]?[_\d]+)?/i)) { numberLiteral = true; } + if (stream.match(/^\d[_\d]*(e[\+\-]?\d+)?/i)) { numberLiteral = true; } // Decimal + if (numberLiteral) { + // Integer literals may be "long" + stream.match(imMatcher); + state.leavingExpr = true; + return "number"; + } + } + + // Handle Chars + if (stream.match('\'')) { + state.tokenize = tokenChar; + return state.tokenize(stream, state); + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + if (stream.match(macro) || stream.match(macroOperators)) { + return "meta"; + } + + if (stream.match(delimiters)) { + return null; + } + + if (stream.match(keywords)) { + return "keyword"; + } + + if (stream.match(builtins)) { + return "builtin"; + } + + var isDefinition = state.isDefinition || state.lastToken == "function" || + state.lastToken == "macro" || state.lastToken == "type" || + state.lastToken == "struct" || state.lastToken == "immutable"; + + if (stream.match(identifiers)) { + if (isDefinition) { + if (stream.peek() === '.') { + state.isDefinition = true; + return "variable"; + } + state.isDefinition = false; + return "def"; + } + state.leavingExpr = true; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return "error"; + } + + function tokenAnnotation(stream, state) { + stream.match(/.*?(?=[,;{}()=\s]|$)/); + if (stream.match('{')) { + state.nestedParameters++; + } else if (stream.match('}') && state.nestedParameters > 0) { + state.nestedParameters--; + } + if (state.nestedParameters > 0) { + stream.match(/.*?(?={|})/) || stream.next(); + } else if (state.nestedParameters == 0) { + state.tokenize = tokenBase; + } + return "builtin"; + } + + function tokenComment(stream, state) { + if (stream.match('#=')) { + state.nestedComments++; + } + if (!stream.match(/.*?(?=(#=|=#))/)) { + stream.skipToEnd(); + } + if (stream.match('=#')) { + state.nestedComments--; + if (state.nestedComments == 0) + state.tokenize = tokenBase; + } + return "comment"; + } + + function tokenChar(stream, state) { + var isChar = false, match; + if (stream.match(chars)) { + isChar = true; + } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) { + var value = parseInt(match[1], 16); + if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF) + isChar = true; + stream.next(); + } + } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) { + var value = parseInt(match[1], 16); + if (value <= 1114111) { // U+10FFFF + isChar = true; + stream.next(); + } + } + if (isChar) { + state.leavingExpr = true; + state.tokenize = tokenBase; + return "string"; + } + if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); } + if (stream.match('\'')) { state.tokenize = tokenBase; } + return "error"; + } + + function tokenStringFactory(delimiter) { + if (delimiter.substr(-3) === '"""') { + delimiter = '"""'; + } else if (delimiter.substr(-1) === '"') { + delimiter = '"'; + } + function tokenString(stream, state) { + if (stream.eat('\\')) { + stream.next(); + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + state.leavingExpr = true; + return "string"; + } else { + stream.eat(/[`"]/); + } + stream.eatWhile(/[^\\`"]/); + return "string"; + } + return tokenString; + } + + var external = { + startState: function() { + return { + tokenize: tokenBase, + scopes: [], + lastToken: null, + leavingExpr: false, + isDefinition: false, + nestedArrays: 0, + nestedComments: 0, + nestedGenerators: 0, + nestedParameters: 0, + firstParenPos: -1 + }; + }, + + token: function(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + if (current && style) { + state.lastToken = current; + } + + return style; + }, + + indent: function(state, textAfter) { + var delta = 0; + if ( textAfter === ']' || textAfter === ')' || /^end\b/.test(textAfter) || + /^else/.test(textAfter) || /^catch\b/.test(textAfter) || /^elseif\b/.test(textAfter) || + /^finally/.test(textAfter) ) { + delta = -1; + } + return (state.scopes.length + delta) * config.indentUnit; + }, + + electricInput: /\b(end|else|catch|finally)\b/, + blockCommentStart: "#=", + blockCommentEnd: "=#", + lineComment: "#", + closeBrackets: "()[]{}\"\"", + fold: "indent" + }; + return external; +}); + + +CodeMirror.defineMIME("text/x-julia", "julia"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js new file mode 100644 index 0000000000..595e067d16 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js @@ -0,0 +1,280 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Link to the project's GitHub page: + * https://github.com/duralog/CodeMirror + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode('livescript', function(){ + var tokenBase = function(stream, state) { + var next_rule = state.next || "start"; + if (next_rule) { + state.next = state.next; + var nr = Rules[next_rule]; + if (nr.splice) { + for (var i$ = 0; i$ < nr.length; ++i$) { + var r = nr[i$]; + if (r.regex && stream.match(r.regex)) { + state.next = r.next || state.next; + return r.token; + } + } + stream.next(); + return 'error'; + } + if (stream.match(r = Rules[next_rule])) { + if (r.regex && stream.match(r.regex)) { + state.next = r.next; + return r.token; + } else { + stream.next(); + return 'error'; + } + } + } + stream.next(); + return 'error'; + }; + var external = { + startState: function(){ + return { + next: 'start', + lastToken: {style: null, indent: 0, content: ""} + }; + }, + token: function(stream, state){ + while (stream.pos == stream.start) + var style = tokenBase(stream, state); + state.lastToken = { + style: style, + indent: stream.indentation(), + content: stream.current() + }; + return style.replace(/\./g, ' '); + }, + indent: function(state){ + var indentation = state.lastToken.indent; + if (state.lastToken.content.match(indenter)) { + indentation += 2; + } + return indentation; + } + }; + return external; + }); + + var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; + var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); + var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; + var stringfill = { + token: 'string', + regex: '.+' + }; + var Rules = { + start: [ + { + token: 'comment.doc', + regex: '/\\*', + next: 'comment' + }, { + token: 'comment', + regex: '#.*' + }, { + token: 'keyword', + regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend + }, { + token: 'constant.language', + regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend + }, { + token: 'invalid.illegal', + regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend + }, { + token: 'language.support.class', + regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend + }, { + token: 'language.support.function', + regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend + }, { + token: 'variable.language', + regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend + }, { + token: 'identifier', + regex: identifier + '\\s*:(?![:=])' + }, { + token: 'variable', + regex: identifier + }, { + token: 'keyword.operator', + regex: '(?:\\.{3}|\\s+\\?)' + }, { + token: 'keyword.variable', + regex: '(?:@+|::|\\.\\.)', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\.\\s*', + next: 'key' + }, { + token: 'string', + regex: '\\\\\\S[^\\s,;)}\\]]*' + }, { + token: 'string.doc', + regex: '\'\'\'', + next: 'qdoc' + }, { + token: 'string.doc', + regex: '"""', + next: 'qqdoc' + }, { + token: 'string', + regex: '\'', + next: 'qstring' + }, { + token: 'string', + regex: '"', + next: 'qqstring' + }, { + token: 'string', + regex: '`', + next: 'js' + }, { + token: 'string', + regex: '<\\[', + next: 'words' + }, { + token: 'string.regex', + regex: '//', + next: 'heregex' + }, { + token: 'string.regex', + regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', + next: 'key' + }, { + token: 'constant.numeric', + regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' + }, { + token: 'lparen', + regex: '[({[]' + }, { + token: 'rparen', + regex: '[)}\\]]', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\S+' + }, { + token: 'text', + regex: '\\s+' + } + ], + heregex: [ + { + token: 'string.regex', + regex: '.*?//[gimy$?]{0,4}', + next: 'start' + }, { + token: 'string.regex', + regex: '\\s*#{' + }, { + token: 'comment.regex', + regex: '\\s+(?:#.*)?' + }, { + token: 'string.regex', + regex: '\\S+' + } + ], + key: [ + { + token: 'keyword.operator', + regex: '[.?@!]+' + }, { + token: 'identifier', + regex: identifier, + next: 'start' + }, { + token: 'text', + regex: '', + next: 'start' + } + ], + comment: [ + { + token: 'comment.doc', + regex: '.*?\\*/', + next: 'start' + }, { + token: 'comment.doc', + regex: '.+' + } + ], + qdoc: [ + { + token: 'string', + regex: ".*?'''", + next: 'key' + }, stringfill + ], + qqdoc: [ + { + token: 'string', + regex: '.*?"""', + next: 'key' + }, stringfill + ], + qstring: [ + { + token: 'string', + regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', + next: 'key' + }, stringfill + ], + qqstring: [ + { + token: 'string', + regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next: 'key' + }, stringfill + ], + js: [ + { + token: 'string', + regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', + next: 'key' + }, stringfill + ], + words: [ + { + token: 'string', + regex: '.*?\\]>', + next: 'key' + }, stringfill + ] + }; + for (var idx in Rules) { + var r = Rules[idx]; + if (r.splice) { + for (var i = 0, len = r.length; i < len; ++i) { + var rr = r[i]; + if (typeof rr.regex === 'string') { + Rules[idx][i].regex = new RegExp('^' + rr.regex); + } + } + } else if (typeof rr.regex === 'string') { + Rules[idx].regex = new RegExp('^' + r.regex); + } + } + + CodeMirror.defineMIME('text/x-livescript', 'livescript'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js new file mode 100644 index 0000000000..2fad0180ff --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's +// CodeMirror 1 mode. +// highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("lua", function(config, parserConfig) { + var indentUnit = config.indentUnit; + + function prefixRE(words) { + return new RegExp("^(?:" + words.join("|") + ")", "i"); + } + function wordRE(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var specials = wordRE(parserConfig.specials || []); + + // long list of standard functions from lua manual + var builtins = wordRE([ + "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load", + "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require", + "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall", + + "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield", + + "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable", + "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable", + "debug.setupvalue","debug.traceback", + + "close","flush","lines","read","seek","setvbuf","write", + + "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin", + "io.stdout","io.tmpfile","io.type","io.write", + + "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg", + "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max", + "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh", + "math.sqrt","math.tan","math.tanh", + + "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale", + "os.time","os.tmpname", + + "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload", + "package.seeall", + + "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub", + "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper", + + "table.concat","table.insert","table.maxn","table.remove","table.sort" + ]); + var keywords = wordRE(["and","break","elseif","false","nil","not","or","return", + "true","function", "end", "if", "then", "else", "do", + "while", "repeat", "until", "for", "in", "local" ]); + + var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]); + var dedentTokens = wordRE(["end", "until", "\\)", "}"]); + var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]); + + function readBracket(stream) { + var level = 0; + while (stream.eat("=")) ++level; + stream.eat("["); + return level; + } + + function normal(stream, state) { + var ch = stream.next(); + if (ch == "-" && stream.eat("-")) { + if (stream.eat("[") && stream.eat("[")) + return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state); + stream.skipToEnd(); + return "comment"; + } + if (ch == "\"" || ch == "'") + return (state.cur = string(ch))(stream, state); + if (ch == "[" && /[\[=]/.test(stream.peek())) + return (state.cur = bracketed(readBracket(stream), "string"))(stream, state); + if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return "number"; + } + if (/[\w_]/.test(ch)) { + stream.eatWhile(/[\w\\\-_.]/); + return "variable"; + } + return null; + } + + function bracketed(level, style) { + return function(stream, state) { + var curlev = null, ch; + while ((ch = stream.next()) != null) { + if (curlev == null) {if (ch == "]") curlev = 0;} + else if (ch == "=") ++curlev; + else if (ch == "]" && curlev == level) { state.cur = normal; break; } + else curlev = null; + } + return style; + }; + } + + function string(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.cur = normal; + return "string"; + }; + } + + return { + startState: function(basecol) { + return {basecol: basecol || 0, indentDepth: 0, cur: normal}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.cur(stream, state); + var word = stream.current(); + if (style == "variable") { + if (keywords.test(word)) style = "keyword"; + else if (builtins.test(word)) style = "builtin"; + else if (specials.test(word)) style = "variable-2"; + } + if ((style != "comment") && (style != "string")){ + if (indentTokens.test(word)) ++state.indentDepth; + else if (dedentTokens.test(word)) --state.indentDepth; + } + return style; + }, + + indent: function(state, textAfter) { + var closing = dedentPartial.test(textAfter); + return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0)); + }, + + electricInput: /^\s*(?:end|until|else|\)|\})$/, + lineComment: "--", + blockCommentStart: "--[[", + blockCommentEnd: "]]" + }; +}); + +CodeMirror.defineMIME("text/x-lua", "lua"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js new file mode 100644 index 0000000000..a9e272ea81 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js @@ -0,0 +1,886 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../meta"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { + + var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); + var htmlModeMissing = htmlMode.name == "null" + + function getMode(name) { + if (CodeMirror.findModeByName) { + var found = CodeMirror.findModeByName(name); + if (found) name = found.mime || found.mimes[0]; + } + var mode = CodeMirror.getMode(cmCfg, name); + return mode.name == "null" ? null : mode; + } + + // Should characters that affect highlighting be highlighted separate? + // Does not include characters that will be output (such as `1.` and `-` for lists) + if (modeCfg.highlightFormatting === undefined) + modeCfg.highlightFormatting = false; + + // Maximum number of nested blockquotes. Set to 0 for infinite nesting. + // Excess `>` will emit `error` token. + if (modeCfg.maxBlockquoteDepth === undefined) + modeCfg.maxBlockquoteDepth = 0; + + // Turn on task lists? ("- [ ] " and "- [x] ") + if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; + + // Turn on strikethrough syntax + if (modeCfg.strikethrough === undefined) + modeCfg.strikethrough = false; + + if (modeCfg.emoji === undefined) + modeCfg.emoji = false; + + if (modeCfg.fencedCodeBlockHighlighting === undefined) + modeCfg.fencedCodeBlockHighlighting = true; + + if (modeCfg.fencedCodeBlockDefaultMode === undefined) + modeCfg.fencedCodeBlockDefaultMode = 'text/plain'; + + if (modeCfg.xml === undefined) + modeCfg.xml = true; + + // Allow token types to be overridden by user-provided token types. + if (modeCfg.tokenTypeOverrides === undefined) + modeCfg.tokenTypeOverrides = {}; + + var tokenTypes = { + header: "header", + code: "comment", + quote: "quote", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + hr: "hr", + image: "image", + imageAltText: "image-alt-text", + imageMarker: "image-marker", + formatting: "formatting", + linkInline: "link", + linkEmail: "link", + linkText: "link", + linkHref: "string", + em: "em", + strong: "strong", + strikethrough: "strikethrough", + emoji: "builtin" + }; + + for (var tokenType in tokenTypes) { + if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { + tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; + } + } + + var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ + , listRE = /^(?:[*\-+]|^[0-9]+([.)]))\s+/ + , taskListRE = /^\[(x| )\](?=\s)/i // Must follow listRE + , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/ + , setextHeaderRE = /^ {0,3}(?:\={1,}|-{2,})\s*$/ + , textRE = /^[^#!\[\]*_\\<>` "'(~:]+/ + , fencedCodeRE = /^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/ + , linkDefRE = /^\s*\[[^\]]+?\]:.*$/ // naive link-definition + , punctuation = /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/ + , expandedTab = " " // CommonMark specifies tab as 4 spaces + + function switchInline(stream, state, f) { + state.f = state.inline = f; + return f(stream, state); + } + + function switchBlock(stream, state, f) { + state.f = state.block = f; + return f(stream, state); + } + + function lineIsEmpty(line) { + return !line || !/\S/.test(line.string) + } + + // Blocks + + function blankLine(state) { + // Reset linkTitle state + state.linkTitle = false; + state.linkHref = false; + state.linkText = false; + // Reset EM state + state.em = false; + // Reset STRONG state + state.strong = false; + // Reset strikethrough state + state.strikethrough = false; + // Reset state.quote + state.quote = 0; + // Reset state.indentedCode + state.indentedCode = false; + if (state.f == htmlBlock) { + var exit = htmlModeMissing + if (!exit) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState) + exit = inner.mode.name == "xml" && inner.state.tagStart === null && + (!inner.state.context && inner.state.tokenize.isInText) + } + if (exit) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + // Mark this line as blank + state.prevLine = state.thisLine + state.thisLine = {stream: null} + return null; + } + + function blockNormal(stream, state) { + var firstTokenOnLine = stream.column() === state.indentation; + var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream); + var prevLineIsIndentedCode = state.indentedCode; + var prevLineIsHr = state.prevLine.hr; + var prevLineIsList = state.list !== false; + var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3; + + state.indentedCode = false; + + var lineIndentation = state.indentation; + // compute once per line (on first token) + if (state.indentationDiff === null) { + state.indentationDiff = state.indentation; + if (prevLineIsList) { + state.list = null; + // While this list item's marker's indentation is less than the deepest + // list item's content's indentation,pop the deepest list item + // indentation off the stack, and update block indentation state + while (lineIndentation < state.listStack[state.listStack.length - 1]) { + state.listStack.pop(); + if (state.listStack.length) { + state.indentation = state.listStack[state.listStack.length - 1]; + // less than the first list's indent -> the line is no longer a list + } else { + state.list = false; + } + } + if (state.list !== false) { + state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1] + } + } + } + + // not comprehensive (currently only for setext detection purposes) + var allowsInlineContinuation = ( + !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header && + (!prevLineIsList || !prevLineIsIndentedCode) && + !state.prevLine.fencedCodeEnd + ); + + var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) && + state.indentation <= maxNonCodeIndentation && stream.match(hrRE); + + var match = null; + if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd || + state.prevLine.header || prevLineLineIsEmpty)) { + stream.skipToEnd(); + state.indentedCode = true; + return tokenTypes.code; + } else if (stream.eatSpace()) { + return null; + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) { + state.quote = 0; + state.header = match[1].length; + state.thisLine.header = true; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) { + state.quote = firstTokenOnLine ? 1 : state.quote + 1; + if (modeCfg.highlightFormatting) state.formatting = "quote"; + stream.eatSpace(); + return getType(state); + } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) { + var listType = match[1] ? "ol" : "ul"; + + state.indentation = lineIndentation + stream.current().length; + state.list = true; + state.quote = 0; + + // Add this list item's content's indentation to the stack + state.listStack.push(state.indentation); + // Reset inline styles which shouldn't propagate across list items + state.em = false; + state.strong = false; + state.code = false; + state.strikethrough = false; + + if (modeCfg.taskLists && stream.match(taskListRE, false)) { + state.taskList = true; + } + state.f = state.inline; + if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; + return getType(state); + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) { + state.quote = 0; + state.fencedEndRE = new RegExp(match[1] + "+ *$"); + // try switching mode + state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode ); + if (state.localMode) state.localState = CodeMirror.startState(state.localMode); + state.f = state.block = local; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = -1 + return getType(state); + // SETEXT has lowest block-scope precedence after HR, so check it after + // the others (code, blockquote, list...) + } else if ( + // if setext set, indicates line after ---/=== + state.setext || ( + // line before ---/=== + (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false && + !state.code && !isHr && !linkDefRE.test(stream.string) && + (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE)) + ) + ) { + if ( !state.setext ) { + state.header = match[0].charAt(0) == '=' ? 1 : 2; + state.setext = state.header; + } else { + state.header = state.setext; + // has no effect on type so we can reset it now + state.setext = 0; + stream.skipToEnd(); + if (modeCfg.highlightFormatting) state.formatting = "header"; + } + state.thisLine.header = true; + state.f = state.inline; + return getType(state); + } else if (isHr) { + stream.skipToEnd(); + state.hr = true; + state.thisLine.hr = true; + return tokenTypes.hr; + } else if (stream.peek() === '[') { + return switchInline(stream, state, footnoteLink); + } + + return switchInline(stream, state, state.inline); + } + + function htmlBlock(stream, state) { + var style = htmlMode.token(stream, state.htmlState); + if (!htmlModeMissing) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState) + if ((inner.mode.name == "xml" && inner.state.tagStart === null && + (!inner.state.context && inner.state.tokenize.isInText)) || + (state.md_inside && stream.current().indexOf(">") > -1)) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + return style; + } + + function local(stream, state) { + var currListInd = state.listStack[state.listStack.length - 1] || 0; + var hasExitedList = state.indentation < currListInd; + var maxFencedEndInd = currListInd + 3; + if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) { + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + var returnType; + if (!hasExitedList) returnType = getType(state) + state.localMode = state.localState = null; + state.block = blockNormal; + state.f = inlineNormal; + state.fencedEndRE = null; + state.code = 0 + state.thisLine.fencedCodeEnd = true; + if (hasExitedList) return switchBlock(stream, state, state.block); + return returnType; + } else if (state.localMode) { + return state.localMode.token(stream, state.localState); + } else { + stream.skipToEnd(); + return tokenTypes.code; + } + } + + // Inline + function getType(state) { + var styles = []; + + if (state.formatting) { + styles.push(tokenTypes.formatting); + + if (typeof state.formatting === "string") state.formatting = [state.formatting]; + + for (var i = 0; i < state.formatting.length; i++) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i]); + + if (state.formatting[i] === "header") { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); + } + + // Add `formatting-quote` and `formatting-quote-#` for blockquotes + // Add `error` instead if the maximum blockquote nesting depth is passed + if (state.formatting[i] === "quote") { + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); + } else { + styles.push("error"); + } + } + } + } + + if (state.taskOpen) { + styles.push("meta"); + return styles.length ? styles.join(' ') : null; + } + if (state.taskClosed) { + styles.push("property"); + return styles.length ? styles.join(' ') : null; + } + + if (state.linkHref) { + styles.push(tokenTypes.linkHref, "url"); + } else { // Only apply inline styles to non-url text + if (state.strong) { styles.push(tokenTypes.strong); } + if (state.em) { styles.push(tokenTypes.em); } + if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } + if (state.emoji) { styles.push(tokenTypes.emoji); } + if (state.linkText) { styles.push(tokenTypes.linkText); } + if (state.code) { styles.push(tokenTypes.code); } + if (state.image) { styles.push(tokenTypes.image); } + if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); } + if (state.imageMarker) { styles.push(tokenTypes.imageMarker); } + } + + if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } + + if (state.quote) { + styles.push(tokenTypes.quote); + + // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.quote + "-" + state.quote); + } else { + styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); + } + } + + if (state.list !== false) { + var listMod = (state.listStack.length - 1) % 3; + if (!listMod) { + styles.push(tokenTypes.list1); + } else if (listMod === 1) { + styles.push(tokenTypes.list2); + } else { + styles.push(tokenTypes.list3); + } + } + + if (state.trailingSpaceNewLine) { + styles.push("trailing-space-new-line"); + } else if (state.trailingSpace) { + styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); + } + + return styles.length ? styles.join(' ') : null; + } + + function handleText(stream, state) { + if (stream.match(textRE, true)) { + return getType(state); + } + return undefined; + } + + function inlineNormal(stream, state) { + var style = state.text(stream, state); + if (typeof style !== 'undefined') + return style; + + if (state.list) { // List marker (*, +, -, 1., etc) + state.list = null; + return getType(state); + } + + if (state.taskList) { + var taskOpen = stream.match(taskListRE, true)[1] === " "; + if (taskOpen) state.taskOpen = true; + else state.taskClosed = true; + if (modeCfg.highlightFormatting) state.formatting = "task"; + state.taskList = false; + return getType(state); + } + + state.taskOpen = false; + state.taskClosed = false; + + if (state.header && stream.match(/^#+$/, true)) { + if (modeCfg.highlightFormatting) state.formatting = "header"; + return getType(state); + } + + var ch = stream.next(); + + // Matches link titles present on next line + if (state.linkTitle) { + state.linkTitle = false; + var matchCh = ch; + if (ch === '(') { + matchCh = ')'; + } + matchCh = (matchCh+'').replace(/([.?*+^\[\]\\(){}|-])/g, "\\$1"); + var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; + if (stream.match(new RegExp(regex), true)) { + return tokenTypes.linkHref; + } + } + + // If this block is changed, it may need to be updated in GFM mode + if (ch === '`') { + var previousFormatting = state.formatting; + if (modeCfg.highlightFormatting) state.formatting = "code"; + stream.eatWhile('`'); + var count = stream.current().length + if (state.code == 0 && (!state.quote || count == 1)) { + state.code = count + return getType(state) + } else if (count == state.code) { // Must be exact + var t = getType(state) + state.code = 0 + return t + } else { + state.formatting = previousFormatting + return getType(state) + } + } else if (state.code) { + return getType(state); + } + + if (ch === '\\') { + stream.next(); + if (modeCfg.highlightFormatting) { + var type = getType(state); + var formattingEscape = tokenTypes.formatting + "-escape"; + return type ? type + " " + formattingEscape : formattingEscape; + } + } + + if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { + state.imageMarker = true; + state.image = true; + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === '[' && state.imageMarker && stream.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/, false)) { + state.imageMarker = false; + state.imageAltText = true + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === ']' && state.imageAltText) { + if (modeCfg.highlightFormatting) state.formatting = "image"; + var type = getType(state); + state.imageAltText = false; + state.image = false; + state.inline = state.f = linkHref; + return type; + } + + if (ch === '[' && !state.image) { + if (state.linkText && stream.match(/^.*?\]/)) return getType(state) + state.linkText = true; + if (modeCfg.highlightFormatting) state.formatting = "link"; + return getType(state); + } + + if (ch === ']' && state.linkText) { + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + state.linkText = false; + state.inline = state.f = stream.match(/\(.*?\)| ?\[.*?\]/, false) ? linkHref : inlineNormal + return type; + } + + if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkEmail; + } + + if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i, false)) { + var end = stream.string.indexOf(">", stream.pos); + if (end != -1) { + var atts = stream.string.substring(stream.start, end); + if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; + } + stream.backUp(1); + state.htmlState = CodeMirror.startState(htmlMode); + return switchBlock(stream, state, htmlBlock); + } + + if (modeCfg.xml && ch === '<' && stream.match(/^\/\w*?>/)) { + state.md_inside = false; + return "tag"; + } else if (ch === "*" || ch === "_") { + var len = 1, before = stream.pos == 1 ? " " : stream.string.charAt(stream.pos - 2) + while (len < 3 && stream.eat(ch)) len++ + var after = stream.peek() || " " + // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis + var leftFlanking = !/\s/.test(after) && (!punctuation.test(after) || /\s/.test(before) || punctuation.test(before)) + var rightFlanking = !/\s/.test(before) && (!punctuation.test(before) || /\s/.test(after) || punctuation.test(after)) + var setEm = null, setStrong = null + if (len % 2) { // Em + if (!state.em && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setEm = true + else if (state.em == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setEm = false + } + if (len > 1) { // Strong + if (!state.strong && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setStrong = true + else if (state.strong == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setStrong = false + } + if (setStrong != null || setEm != null) { + if (modeCfg.highlightFormatting) state.formatting = setEm == null ? "strong" : setStrong == null ? "em" : "strong em" + if (setEm === true) state.em = ch + if (setStrong === true) state.strong = ch + var t = getType(state) + if (setEm === false) state.em = false + if (setStrong === false) state.strong = false + return t + } + } else if (ch === ' ') { + if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(1); + } + } + } + + if (modeCfg.strikethrough) { + if (ch === '~' && stream.eatWhile(ch)) { + if (state.strikethrough) {// Remove strikethrough + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + var t = getType(state); + state.strikethrough = false; + return t; + } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough + state.strikethrough = true; + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.match('~~', true)) { // Probably surrounded by space + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(2); + } + } + } + } + + if (modeCfg.emoji && ch === ":" && stream.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)) { + state.emoji = true; + if (modeCfg.highlightFormatting) state.formatting = "emoji"; + var retType = getType(state); + state.emoji = false; + return retType; + } + + if (ch === ' ') { + if (stream.match(/^ +$/, false)) { + state.trailingSpace++; + } else if (state.trailingSpace) { + state.trailingSpaceNewLine = true; + } + } + + return getType(state); + } + + function linkInline(stream, state) { + var ch = stream.next(); + + if (ch === ">") { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + stream.match(/^[^>]+/, true); + + return tokenTypes.linkInline; + } + + function linkHref(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + var ch = stream.next(); + if (ch === '(' || ch === '[') { + state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]"); + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + state.linkHref = true; + return getType(state); + } + return 'error'; + } + + var linkRE = { + ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, + "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/ + } + + function getLinkHrefInside(endChar) { + return function(stream, state) { + var ch = stream.next(); + + if (ch === endChar) { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + var returnState = getType(state); + state.linkHref = false; + return returnState; + } + + stream.match(linkRE[endChar]) + state.linkHref = true; + return getType(state); + }; + } + + function footnoteLink(stream, state) { + if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { + state.f = footnoteLinkInside; + stream.next(); // Consume [ + if (modeCfg.highlightFormatting) state.formatting = "link"; + state.linkText = true; + return getType(state); + } + return switchInline(stream, state, inlineNormal); + } + + function footnoteLinkInside(stream, state) { + if (stream.match(']:', true)) { + state.f = state.inline = footnoteUrl; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var returnType = getType(state); + state.linkText = false; + return returnType; + } + + stream.match(/^([^\]\\]|\\.)+/, true); + + return tokenTypes.linkText; + } + + function footnoteUrl(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + // Match URL + stream.match(/^[^\s]+/, true); + // Check for link title + if (stream.peek() === undefined) { // End of line, set flag to check next line + state.linkTitle = true; + } else { // More content on line, check if link title + stream.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/, true); + } + state.f = state.inline = inlineNormal; + return tokenTypes.linkHref + " url"; + } + + var mode = { + startState: function() { + return { + f: blockNormal, + + prevLine: {stream: null}, + thisLine: {stream: null}, + + block: blockNormal, + htmlState: null, + indentation: 0, + + inline: inlineNormal, + text: handleText, + + formatting: false, + linkText: false, + linkHref: false, + linkTitle: false, + code: 0, + em: false, + strong: false, + header: 0, + setext: 0, + hr: false, + taskList: false, + list: false, + listStack: [], + quote: 0, + trailingSpace: 0, + trailingSpaceNewLine: false, + strikethrough: false, + emoji: false, + fencedEndRE: null + }; + }, + + copyState: function(s) { + return { + f: s.f, + + prevLine: s.prevLine, + thisLine: s.thisLine, + + block: s.block, + htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), + indentation: s.indentation, + + localMode: s.localMode, + localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, + + inline: s.inline, + text: s.text, + formatting: false, + linkText: s.linkText, + linkTitle: s.linkTitle, + linkHref: s.linkHref, + code: s.code, + em: s.em, + strong: s.strong, + strikethrough: s.strikethrough, + emoji: s.emoji, + header: s.header, + setext: s.setext, + hr: s.hr, + taskList: s.taskList, + list: s.list, + listStack: s.listStack.slice(0), + quote: s.quote, + indentedCode: s.indentedCode, + trailingSpace: s.trailingSpace, + trailingSpaceNewLine: s.trailingSpaceNewLine, + md_inside: s.md_inside, + fencedEndRE: s.fencedEndRE + }; + }, + + token: function(stream, state) { + + // Reset state.formatting + state.formatting = false; + + if (stream != state.thisLine.stream) { + state.header = 0; + state.hr = false; + + if (stream.match(/^\s*$/, true)) { + blankLine(state); + return null; + } + + state.prevLine = state.thisLine + state.thisLine = {stream: stream} + + // Reset state.taskList + state.taskList = false; + + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + + if (!state.localState) { + state.f = state.block; + if (state.f != htmlBlock) { + var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, expandedTab).length; + state.indentation = indentation; + state.indentationDiff = null; + if (indentation > 0) return null; + } + } + } + return state.f(stream, state); + }, + + innerMode: function(state) { + if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; + if (state.localState) return {state: state.localState, mode: state.localMode}; + return {state: state, mode: mode}; + }, + + indent: function(state, textAfter, line) { + if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line) + if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line) + return CodeMirror.Pass + }, + + blankLine: blankLine, + + getType: getType, + + blockCommentStart: "", + closeBrackets: "()[]{}''\"\"``", + fold: "markdown" + }; + return mode; +}, "xml"); + +CodeMirror.defineMIME("text/markdown", "markdown"); + +CodeMirror.defineMIME("text/x-markdown", "markdown"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js new file mode 100644 index 0000000000..72b3492101 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js @@ -0,0 +1,176 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Mathematica mode copyright (c) 2015 by Calin Barbat +// Based on code by Patrick Scheibe (halirutan) +// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('mathematica', function(_config, _parserConfig) { + + // used pattern building blocks + var Identifier = '[a-zA-Z\\$][a-zA-Z0-9\\$]*'; + var pBase = "(?:\\d+)"; + var pFloat = "(?:\\.\\d+|\\d+\\.\\d*|\\d+)"; + var pFloatBase = "(?:\\.\\w+|\\w+\\.\\w*|\\w+)"; + var pPrecision = "(?:`(?:`?"+pFloat+")?)"; + + // regular expressions + var reBaseForm = new RegExp('(?:'+pBase+'(?:\\^\\^'+pFloatBase+pPrecision+'?(?:\\*\\^[+-]?\\d+)?))'); + var reFloatForm = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\*\\^[+-]?\\d+)?)'); + var reIdInContext = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)'); + + function tokenBase(stream, state) { + var ch; + + // get next character + ch = stream.next(); + + // string + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + + // comment + if (ch === '(') { + if (stream.eat('*')) { + state.commentLevel++; + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + } + + // go back one character + stream.backUp(1); + + // look for numbers + // Numbers in a baseform + if (stream.match(reBaseForm, true, false)) { + return 'number'; + } + + // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition + // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow. + if (stream.match(reFloatForm, true, false)) { + return 'number'; + } + + /* In[23] and Out[34] */ + if (stream.match(/(?:In|Out)\[[0-9]*\]/, true, false)) { + return 'atom'; + } + + // usage + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::usage)/, true, false)) { + return 'meta'; + } + + // message + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/, true, false)) { + return 'string-2'; + } + + // this makes a look-ahead match for something like variable:{_Integer} + // the match is then forwarded to the mma-patterns tokenizer. + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/, true, false)) { + return 'variable-2'; + } + + // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___) + // Cannot start with a number, but can have numbers at any other position. Examples + // blub__Integer, a1_, b34_Integer32 + if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { + return 'variable-2'; + } + if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/, true, false)) { + return 'variable-2'; + } + if (stream.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { + return 'variable-2'; + } + + // Named characters in Mathematica, like \[Gamma]. + if (stream.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/, true, false)) { + return 'variable-3'; + } + + // Match all braces separately + if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { + return 'bracket'; + } + + // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match + // only one. + if (stream.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/, true, false)) { + return 'variable-2'; + } + + // Literals like variables, keywords, functions + if (stream.match(reIdInContext, true, false)) { + return 'keyword'; + } + + // operators. Note that operators like @@ or /; are matched separately for each symbol. + if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { + return 'operator'; + } + + // everything else is an error + stream.next(); // advance the stream. + return 'error'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while(state.commentLevel > 0 && (next = stream.next()) != null) { + if (prev === '(' && next === '*') state.commentLevel++; + if (prev === '*' && next === ')') state.commentLevel--; + prev = next; + } + if (state.commentLevel <= 0) { + state.tokenize = tokenBase; + } + return 'comment'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "(*", + blockCommentEnd: "*)" + }; +}); + +CodeMirror.defineMIME('text/x-mathematica', { + name: 'mathematica' +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js new file mode 100644 index 0000000000..640437ed64 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js @@ -0,0 +1,129 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var rfc2822 = [ + "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID", + "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To", + "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received" +]; +var rfc2822NoEmail = [ + "Date", "Subject", "Comments", "Keywords", "Resent-Date" +]; + +CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail)); + +var whitespace = /^[ \t]/; +var separator = /^From /; // See RFC 4155 +var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): "); +var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): "); +var header = /^[^:]+:/; // Optional fields defined in RFC 2822 +var email = /^[^ ]+@[^ ]+/; +var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/; +var bracketedEmail = /^<.*?>/; +var untilBracketedEmail = /^.*?(?=<.*>)/; + +function styleForHeader(header) { + if (header === "Subject") return "header"; + return "string"; +} + +function readToken(stream, state) { + if (stream.sol()) { + // From last line + state.inSeparator = false; + if (state.inHeader && stream.match(whitespace)) { + // Header folding + return null; + } else { + state.inHeader = false; + state.header = null; + } + + if (stream.match(separator)) { + state.inHeaders = true; + state.inSeparator = true; + return "atom"; + } + + var match; + var emailPermitted = false; + if ((match = stream.match(rfc2822HeaderNoEmail)) || + (emailPermitted = true) && (match = stream.match(rfc2822Header))) { + state.inHeaders = true; + state.inHeader = true; + state.emailPermitted = emailPermitted; + state.header = match[1]; + return "atom"; + } + + // Use vim's heuristics: recognize custom headers only if the line is in a + // block of legitimate headers. + if (state.inHeaders && (match = stream.match(header))) { + state.inHeader = true; + state.emailPermitted = true; + state.header = match[1]; + return "atom"; + } + + state.inHeaders = false; + stream.skipToEnd(); + return null; + } + + if (state.inSeparator) { + if (stream.match(email)) return "link"; + if (stream.match(untilEmail)) return "atom"; + stream.skipToEnd(); + return "atom"; + } + + if (state.inHeader) { + var style = styleForHeader(state.header); + + if (state.emailPermitted) { + if (stream.match(bracketedEmail)) return style + " link"; + if (stream.match(untilBracketedEmail)) return style; + } + stream.skipToEnd(); + return style; + } + + stream.skipToEnd(); + return null; +}; + +CodeMirror.defineMode("mbox", function() { + return { + startState: function() { + return { + // Is in a mbox separator + inSeparator: false, + // Is in a mail header + inHeader: false, + // If bracketed email is permitted. Only applicable when inHeader + emailPermitted: false, + // Name of current header + header: null, + // Is in a region of mail headers + inHeaders: false + }; + }, + token: readToken, + blankLine: function(state) { + state.inHeaders = state.inSeparator = state.inHeader = false; + } + }; +}); + +CodeMirror.defineMIME("application/mbox", "mbox"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js new file mode 100644 index 0000000000..38d5e0131d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js @@ -0,0 +1,221 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.modeInfo = [ + {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, + {name: "PGP", mimes: ["application/pgp", "application/pgp-encrypted", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["asc", "pgp", "sig"]}, + {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]}, + {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, + {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]}, + {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h", "ino"]}, + {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, + {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy", "cbl"]}, + {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp", "cs"]}, + {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]}, + {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]}, + {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]}, + {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/}, + {name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, + {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, + {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, + {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, + {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]}, + {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, + {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, + {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, + {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, + {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, + {name: "Django", mime: "text/x-django", mode: "django"}, + {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, + {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, + {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, + {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, + {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, + {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]}, + {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, + {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]}, + {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, + {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, + {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, + {name: "Esper", mime: "text/x-esper", mode: "sql"}, + {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]}, + {name: "FCL", mime: "text/x-fcl", mode: "fcl"}, + {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, + {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90", "f95"]}, + {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, + {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, + {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, + {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i}, + {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, + {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/}, + {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, + {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, + {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]}, + {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, + {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, + {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, + {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm", "handlebars", "hbs"], alias: ["xhtml"]}, + {name: "HTTP", mime: "message/http", mode: "http"}, + {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, + {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]}, + {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, + {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, + {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], + mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, + {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, + {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, + {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]}, + {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]}, + {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"], alias: ["jl"]}, + {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]}, + {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, + {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, + {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, + {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, + {name: "mIRC", mime: "text/mirc", mode: "mirc"}, + {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, + {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb", "wl", "wls"]}, + {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, + {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]}, + {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, + {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]}, + {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, + {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, + {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]}, + {name: "NTriples", mimes: ["application/n-triples", "application/n-quads", "text/n-triples"], + mode: "ntriples", ext: ["nt", "nq"]}, + {name: "Objective-C", mime: "text/x-objectivec", mode: "clike", ext: ["m"], alias: ["objective-c", "objc"]}, + {name: "Objective-C++", mime: "text/x-objectivec++", mode: "clike", ext: ["mm"], alias: ["objective-c++", "objc++"]}, + {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, + {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, + {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]}, + {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, + {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, + {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, + {name: "PHP", mimes: ["text/x-php", "application/x-httpd-php", "application/x-httpd-php-open"], mode: "php", ext: ["php", "php3", "php4", "php5", "php7", "phtml"]}, + {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, + {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, + {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, + {name: "PostgreSQL", mime: "text/x-pgsql", mode: "sql"}, + {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]}, + {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, + {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]}, + {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/}, + {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, + {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, + {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r", "R"], alias: ["rscript"]}, + {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, + {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, + {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, + {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, + {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, + {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]}, + {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, + {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, + {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, + {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, + {name: "Shell", mimes: ["text/x-sh", "application/x-sh"], mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/}, + {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, + {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, + {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, + {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, + {name: "Solr", mime: "text/x-solr", mode: "solr"}, + {name: "SML", mime: "text/x-sml", mode: "mllike", ext: ["sml", "sig", "fun", "smackspec"]}, + {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, + {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, + {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, + {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, + {name: "SQLite", mime: "text/x-sqlite", mode: "sql"}, + {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]}, + {name: "Stylus", mime: "text/x-styl", mode: "stylus", ext: ["styl"]}, + {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]}, + {name: "sTeX", mime: "text/x-stex", mode: "stex"}, + {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx", "tex"], alias: ["tex"]}, + {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v", "sv", "svh"]}, + {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, + {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, + {name: "TiddlyWiki", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, + {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, + {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, + {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, + {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, + {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]}, + {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]}, + {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, + {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, + {name: "TypeScript-JSX", mime: "text/typescript-jsx", mode: "jsx", ext: ["tsx"], alias: ["tsx"]}, + {name: "Twig", mime: "text/x-twig", mode: "twig"}, + {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]}, + {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, + {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, + {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, + {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, + {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]}, + {name: "Vue.js Component", mimes: ["script/x-vue", "text/x-vue"], mode: "vue", ext: ["vue"]}, + {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd", "svg"], alias: ["rss", "wsdl", "xsd"]}, + {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, + {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]}, + {name: "YAML", mimes: ["text/x-yaml", "text/yaml"], mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, + {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}, + {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]}, + {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]}, + {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}, + {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]}, + ]; + // Ensure all modes have a mime property for backwards compatibility + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mimes) info.mime = info.mimes[0]; + } + + CodeMirror.findModeByMIME = function(mime) { + mime = mime.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mime == mime) return info; + if (info.mimes) for (var j = 0; j < info.mimes.length; j++) + if (info.mimes[j] == mime) return info; + } + if (/\+xml$/.test(mime)) return CodeMirror.findModeByMIME("application/xml") + if (/\+json$/.test(mime)) return CodeMirror.findModeByMIME("application/json") + }; + + CodeMirror.findModeByExtension = function(ext) { + ext = ext.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.ext) for (var j = 0; j < info.ext.length; j++) + if (info.ext[j] == ext) return info; + } + }; + + CodeMirror.findModeByFileName = function(filename) { + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.file && info.file.test(filename)) return info; + } + var dot = filename.lastIndexOf("."); + var ext = dot > -1 && filename.substring(dot + 1, filename.length); + if (ext) return CodeMirror.findModeByExtension(ext); + }; + + CodeMirror.findModeByName = function(name) { + name = name.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.name.toLowerCase() == name) return info; + if (info.alias) for (var j = 0; j < info.alias.length; j++) + if (info.alias[j].toLowerCase() == name) return info; + } + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js new file mode 100644 index 0000000000..d27b0152e9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMIME("text/mirc", "mirc"); +CodeMirror.defineMode("mirc", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + + "$activewid $address $addtok $agent $agentname $agentstat $agentver " + + "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + + "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + + "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + + "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + + "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + + "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + + "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + + "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + + "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + + "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + + "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + + "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + + "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + + "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + + "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + + "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + + "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + + "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + + "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + + "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + + "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + + "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + + "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + + "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + + "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + + "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + + "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + + "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + + "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + + "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + + "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + + "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + + "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + + "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); + var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + + "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + + "channel clear clearall cline clipboard close cnick color comclose comopen " + + "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + + "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + + "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + + "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + + "events exit fclose filter findtext finger firewall flash flist flood flush " + + "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + + "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + + "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + + "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + + "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + + "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + + "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + + "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + + "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + + "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + + "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + + "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + + "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + + "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + + "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + + "elseif else goto menu nicklist status title icon size option text edit " + + "button check radio box scroll list combo link tab item"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if (/[\[\]{}\(\),\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + else if (ch == "\\") { + stream.eat("\\"); + stream.eat(/./); + return "number"; + } + else if (ch == "/" && stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else if (ch == ";" && stream.match(/ *\( *\(/)) { + return chain(stream, state, tokenUnparsed); + } + else if (ch == ";" && !state.inParams) { + stream.skipToEnd(); + return "comment"; + } + else if (ch == '"') { + stream.eat(/"/); + return "keyword"; + } + else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.:]/); + if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { + return "keyword"; + } + else { + state.beforeParams = true; + return "builtin"; + } + } + else if (ch == "%") { + stream.eatWhile(/[^,\s()]/); + state.beforeParams = true; + return "string"; + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + stream.eatWhile(/[\w\$_{}]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == ";" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == ")") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + } + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js new file mode 100644 index 0000000000..8f92372782 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js @@ -0,0 +1,359 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('mllike', function(_config, parserConfig) { + var words = { + 'as': 'keyword', + 'do': 'keyword', + 'else': 'keyword', + 'end': 'keyword', + 'exception': 'keyword', + 'fun': 'keyword', + 'functor': 'keyword', + 'if': 'keyword', + 'in': 'keyword', + 'include': 'keyword', + 'let': 'keyword', + 'of': 'keyword', + 'open': 'keyword', + 'rec': 'keyword', + 'struct': 'keyword', + 'then': 'keyword', + 'type': 'keyword', + 'val': 'keyword', + 'while': 'keyword', + 'with': 'keyword' + }; + + var extraWords = parserConfig.extraWords || {}; + for (var prop in extraWords) { + if (extraWords.hasOwnProperty(prop)) { + words[prop] = parserConfig.extraWords[prop]; + } + } + var hintWords = []; + for (var k in words) { hintWords.push(k); } + CodeMirror.registerHelper("hintWords", "mllike", hintWords); + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + if (ch === '{') { + if (stream.eat('|')) { + state.longString = true; + state.tokenize = tokenLongString; + return state.tokenize(stream, state); + } + } + if (ch === '(') { + if (stream.match(/^\*(?!\))/)) { + state.commentLevel++; + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + } + if (ch === '~' || ch === '?') { + stream.eatWhile(/\w/); + return 'variable-2'; + } + if (ch === '`') { + stream.eatWhile(/\w/); + return 'quote'; + } + if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { + stream.skipToEnd(); + return 'comment'; + } + if (/\d/.test(ch)) { + if (ch === '0' && stream.eat(/[bB]/)) { + stream.eatWhile(/[01]/); + } if (ch === '0' && stream.eat(/[xX]/)) { + stream.eatWhile(/[0-9a-fA-F]/) + } if (ch === '0' && stream.eat(/[oO]/)) { + stream.eatWhile(/[0-7]/); + } else { + stream.eatWhile(/[\d_]/); + if (stream.eat('.')) { + stream.eatWhile(/[\d]/); + } + if (stream.eat(/[eE]/)) { + stream.eatWhile(/[\d\-+]/); + } + } + return 'number'; + } + if ( /[+\-*&%=<>!?|@\.~:]/.test(ch)) { + return 'operator'; + } + if (/[\w\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + var cur = stream.current(); + return words.hasOwnProperty(cur) ? words[cur] : 'variable'; + } + return null + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while(state.commentLevel > 0 && (next = stream.next()) != null) { + if (prev === '(' && next === '*') state.commentLevel++; + if (prev === '*' && next === ')') state.commentLevel--; + prev = next; + } + if (state.commentLevel <= 0) { + state.tokenize = tokenBase; + } + return 'comment'; + } + + function tokenLongString(stream, state) { + var prev, next; + while (state.longString && (next = stream.next()) != null) { + if (prev === '|' && next === '}') state.longString = false; + prev = next; + } + if (!state.longString) { + state.tokenize = tokenBase; + } + return 'string'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + + blockCommentStart: "(*", + blockCommentEnd: "*)", + lineComment: parserConfig.slashComments ? "//" : null + }; +}); + +CodeMirror.defineMIME('text/x-ocaml', { + name: 'mllike', + extraWords: { + 'and': 'keyword', + 'assert': 'keyword', + 'begin': 'keyword', + 'class': 'keyword', + 'constraint': 'keyword', + 'done': 'keyword', + 'downto': 'keyword', + 'external': 'keyword', + 'function': 'keyword', + 'initializer': 'keyword', + 'lazy': 'keyword', + 'match': 'keyword', + 'method': 'keyword', + 'module': 'keyword', + 'mutable': 'keyword', + 'new': 'keyword', + 'nonrec': 'keyword', + 'object': 'keyword', + 'private': 'keyword', + 'sig': 'keyword', + 'to': 'keyword', + 'try': 'keyword', + 'value': 'keyword', + 'virtual': 'keyword', + 'when': 'keyword', + + // builtins + 'raise': 'builtin', + 'failwith': 'builtin', + 'true': 'builtin', + 'false': 'builtin', + + // Pervasives builtins + 'asr': 'builtin', + 'land': 'builtin', + 'lor': 'builtin', + 'lsl': 'builtin', + 'lsr': 'builtin', + 'lxor': 'builtin', + 'mod': 'builtin', + 'or': 'builtin', + + // More Pervasives + 'raise_notrace': 'builtin', + 'trace': 'builtin', + 'exit': 'builtin', + 'print_string': 'builtin', + 'print_endline': 'builtin', + + 'int': 'type', + 'float': 'type', + 'bool': 'type', + 'char': 'type', + 'string': 'type', + 'unit': 'type', + + // Modules + 'List': 'builtin' + } +}); + +CodeMirror.defineMIME('text/x-fsharp', { + name: 'mllike', + extraWords: { + 'abstract': 'keyword', + 'assert': 'keyword', + 'base': 'keyword', + 'begin': 'keyword', + 'class': 'keyword', + 'default': 'keyword', + 'delegate': 'keyword', + 'do!': 'keyword', + 'done': 'keyword', + 'downcast': 'keyword', + 'downto': 'keyword', + 'elif': 'keyword', + 'extern': 'keyword', + 'finally': 'keyword', + 'for': 'keyword', + 'function': 'keyword', + 'global': 'keyword', + 'inherit': 'keyword', + 'inline': 'keyword', + 'interface': 'keyword', + 'internal': 'keyword', + 'lazy': 'keyword', + 'let!': 'keyword', + 'match': 'keyword', + 'member': 'keyword', + 'module': 'keyword', + 'mutable': 'keyword', + 'namespace': 'keyword', + 'new': 'keyword', + 'null': 'keyword', + 'override': 'keyword', + 'private': 'keyword', + 'public': 'keyword', + 'return!': 'keyword', + 'return': 'keyword', + 'select': 'keyword', + 'static': 'keyword', + 'to': 'keyword', + 'try': 'keyword', + 'upcast': 'keyword', + 'use!': 'keyword', + 'use': 'keyword', + 'void': 'keyword', + 'when': 'keyword', + 'yield!': 'keyword', + 'yield': 'keyword', + + // Reserved words + 'atomic': 'keyword', + 'break': 'keyword', + 'checked': 'keyword', + 'component': 'keyword', + 'const': 'keyword', + 'constraint': 'keyword', + 'constructor': 'keyword', + 'continue': 'keyword', + 'eager': 'keyword', + 'event': 'keyword', + 'external': 'keyword', + 'fixed': 'keyword', + 'method': 'keyword', + 'mixin': 'keyword', + 'object': 'keyword', + 'parallel': 'keyword', + 'process': 'keyword', + 'protected': 'keyword', + 'pure': 'keyword', + 'sealed': 'keyword', + 'tailcall': 'keyword', + 'trait': 'keyword', + 'virtual': 'keyword', + 'volatile': 'keyword', + + // builtins + 'List': 'builtin', + 'Seq': 'builtin', + 'Map': 'builtin', + 'Set': 'builtin', + 'Option': 'builtin', + 'int': 'builtin', + 'string': 'builtin', + 'not': 'builtin', + 'true': 'builtin', + 'false': 'builtin', + + 'raise': 'builtin', + 'failwith': 'builtin' + }, + slashComments: true +}); + + +CodeMirror.defineMIME('text/x-sml', { + name: 'mllike', + extraWords: { + 'abstype': 'keyword', + 'and': 'keyword', + 'andalso': 'keyword', + 'case': 'keyword', + 'datatype': 'keyword', + 'fn': 'keyword', + 'handle': 'keyword', + 'infix': 'keyword', + 'infixr': 'keyword', + 'local': 'keyword', + 'nonfix': 'keyword', + 'op': 'keyword', + 'orelse': 'keyword', + 'raise': 'keyword', + 'withtype': 'keyword', + 'eqtype': 'keyword', + 'sharing': 'keyword', + 'sig': 'keyword', + 'signature': 'keyword', + 'structure': 'keyword', + 'where': 'keyword', + 'true': 'keyword', + 'false': 'keyword', + + // types + 'int': 'builtin', + 'real': 'builtin', + 'string': 'builtin', + 'char': 'builtin', + 'bool': 'builtin' + }, + slashComments: true +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js new file mode 100644 index 0000000000..2e9622f03f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js @@ -0,0 +1,245 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Modelica support for CodeMirror, copyright (c) by Lennart Ochel + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +}) + +(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("modelica", function(config, parserConfig) { + + var indentUnit = config.indentUnit; + var keywords = parserConfig.keywords || {}; + var builtin = parserConfig.builtin || {}; + var atoms = parserConfig.atoms || {}; + + var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; + var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; + var isDigit = /[0-9]/; + var isNonDigit = /[_a-zA-Z]/; + + function tokenLineComment(stream, state) { + stream.skipToEnd(); + state.tokenize = null; + return "comment"; + } + + function tokenBlockComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == '"' && !escaped) { + state.tokenize = null; + state.sol = false; + break; + } + escaped = !escaped && ch == "\\"; + } + + return "string"; + } + + function tokenIdent(stream, state) { + stream.eatWhile(isDigit); + while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } + + + var cur = stream.current(); + + if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; + else if(state.sol && cur == "end" && state.level > 0) state.level--; + + state.tokenize = null; + state.sol = false; + + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + else if (builtin.propertyIsEnumerable(cur)) return "builtin"; + else if (atoms.propertyIsEnumerable(cur)) return "atom"; + else return "variable"; + } + + function tokenQIdent(stream, state) { + while (stream.eat(/[^']/)) { } + + state.tokenize = null; + state.sol = false; + + if(stream.eat("'")) + return "variable"; + else + return "error"; + } + + function tokenUnsignedNumber(stream, state) { + stream.eatWhile(isDigit); + if (stream.eat('.')) { + stream.eatWhile(isDigit); + } + if (stream.eat('e') || stream.eat('E')) { + if (!stream.eat('-')) + stream.eat('+'); + stream.eatWhile(isDigit); + } + + state.tokenize = null; + state.sol = false; + return "number"; + } + + // Interface + return { + startState: function() { + return { + tokenize: null, + level: 0, + sol: true + }; + }, + + token: function(stream, state) { + if(state.tokenize != null) { + return state.tokenize(stream, state); + } + + if(stream.sol()) { + state.sol = true; + } + + // WHITESPACE + if(stream.eatSpace()) { + state.tokenize = null; + return null; + } + + var ch = stream.next(); + + // LINECOMMENT + if(ch == '/' && stream.eat('/')) { + state.tokenize = tokenLineComment; + } + // BLOCKCOMMENT + else if(ch == '/' && stream.eat('*')) { + state.tokenize = tokenBlockComment; + } + // TWO SYMBOL TOKENS + else if(isDoubleOperatorChar.test(ch+stream.peek())) { + stream.next(); + state.tokenize = null; + return "operator"; + } + // SINGLE SYMBOL TOKENS + else if(isSingleOperatorChar.test(ch)) { + state.tokenize = null; + return "operator"; + } + // IDENT + else if(isNonDigit.test(ch)) { + state.tokenize = tokenIdent; + } + // Q-IDENT + else if(ch == "'" && stream.peek() && stream.peek() != "'") { + state.tokenize = tokenQIdent; + } + // STRING + else if(ch == '"') { + state.tokenize = tokenString; + } + // UNSIGNED_NUMBER + else if(isDigit.test(ch)) { + state.tokenize = tokenUnsignedNumber; + } + // ERROR + else { + state.tokenize = null; + return "error"; + } + + return state.tokenize(stream, state); + }, + + indent: function(state, textAfter) { + if (state.tokenize != null) return CodeMirror.Pass; + + var level = state.level; + if(/(algorithm)/.test(textAfter)) level--; + if(/(equation)/.test(textAfter)) level--; + if(/(initial algorithm)/.test(textAfter)) level--; + if(/(initial equation)/.test(textAfter)) level--; + if(/(end)/.test(textAfter)) level--; + + if(level > 0) + return indentUnit*level; + else + return 0; + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i=0; i", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + }, + xu: { + "keywords" : ["msc", "xu"], + "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"], + "constants" : ["true", "false", "on", "off", "auto"], + "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip", "title", "deactivate", "activate", "activation"], + "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists + "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], + "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + }, + msgenny: { + "keywords" : null, + "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"], + "constants" : ["true", "false", "on", "off", "auto"], + "attributes" : null, + "brackets" : ["\\{", "\\}"], + "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], + "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + } + } + + CodeMirror.defineMode("mscgen", function(_, modeConfig) { + var language = languages[modeConfig && modeConfig.language || "mscgen"] + return { + startState: startStateFn, + copyState: copyStateFn, + token: produceTokenFunction(language), + lineComment : "#", + blockCommentStart : "/*", + blockCommentEnd : "*/" + }; + }); + + CodeMirror.defineMIME("text/x-mscgen", "mscgen"); + CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"}); + CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"}); + + function wordRegexpBoundary(pWords) { + return new RegExp("^\\b(?:" + pWords.join("|") + ")\\b", "i"); + } + + function wordRegexp(pWords) { + return new RegExp("^(?:" + pWords.join("|") + ")", "i"); + } + + function startStateFn() { + return { + inComment : false, + inString : false, + inAttributeList : false, + inScript : false + }; + } + + function copyStateFn(pState) { + return { + inComment : pState.inComment, + inString : pState.inString, + inAttributeList : pState.inAttributeList, + inScript : pState.inScript + }; + } + + function produceTokenFunction(pConfig) { + + return function(pStream, pState) { + if (pStream.match(wordRegexp(pConfig.brackets), true, true)) { + return "bracket"; + } + /* comments */ + if (!pState.inComment) { + if (pStream.match(/\/\*[^\*\/]*/, true, true)) { + pState.inComment = true; + return "comment"; + } + if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) { + pStream.skipToEnd(); + return "comment"; + } + } + if (pState.inComment) { + if (pStream.match(/[^\*\/]*\*\//, true, true)) + pState.inComment = false; + else + pStream.skipToEnd(); + return "comment"; + } + /* strings */ + if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) { + pState.inString = true; + return "string"; + } + if (pState.inString) { + if (pStream.match(/[^\"]*\"/, true, true)) + pState.inString = false; + else + pStream.skipToEnd(); + return "string"; + } + /* keywords & operators */ + if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true)) + return "keyword"; + + if (pStream.match(wordRegexpBoundary(pConfig.options), true, true)) + return "keyword"; + + if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true)) + return "keyword"; + + if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true)) + return "keyword"; + + if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true)) + return "operator"; + + if (!!pConfig.constants && pStream.match(wordRegexp(pConfig.constants), true, true)) + return "variable"; + + /* attribute lists */ + if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) { + pConfig.inAttributeList = true; + return "bracket"; + } + if (pConfig.inAttributeList) { + if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) { + return "attribute"; + } + if (pStream.match(']', true, true)) { + pConfig.inAttributeList = false; + return "bracket"; + } + } + + pStream.next(); + return "base"; + }; + } + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js new file mode 100644 index 0000000000..c53b4bf3a2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js @@ -0,0 +1,148 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + This MUMPS Language script was constructed using vbscript.js as a template. +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("mumps", function() { + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"); + var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"); + var singleDelimiters = new RegExp("^[\\.,:]"); + var brackets = new RegExp("[()]"); + var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*"); + var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"]; + // The following list includes intrinsic functions _and_ special variables + var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"]; + var intrinsicFuncs = wordRegexp(intrinsicFuncsWords); + var command = wordRegexp(commandKeywords); + + function tokenBase(stream, state) { + if (stream.sol()) { + state.label = true; + state.commandMode = 0; + } + + // The character has meaning in MUMPS. Ignoring consecutive + // spaces would interfere with interpreting whether the next non-space + // character belongs to the command or argument context. + + // Examine each character and update a mode variable whose interpretation is: + // >0 => command 0 => argument <0 => command post-conditional + var ch = stream.peek(); + + if (ch == " " || ch == "\t") { // Pre-process + state.label = false; + if (state.commandMode == 0) + state.commandMode = 1; + else if ((state.commandMode < 0) || (state.commandMode == 2)) + state.commandMode = 0; + } else if ((ch != ".") && (state.commandMode > 0)) { + if (ch == ":") + state.commandMode = -1; // SIS - Command post-conditional + else + state.commandMode = 2; + } + + // Do not color parameter list as line tag + if ((ch === "(") || (ch === "\u0009")) + state.label = false; + + // MUMPS comment starts with ";" + if (ch === ";") { + stream.skipToEnd(); + return "comment"; + } + + // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator + if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)) + return "number"; + + // Handle Strings + if (ch == '"') { + if (stream.skipTo('"')) { + stream.next(); + return "string"; + } else { + stream.skipToEnd(); + return "error"; + } + } + + // Handle operators and Delimiters + if (stream.match(doubleOperators) || stream.match(singleOperators)) + return "operator"; + + // Prevents leading "." in DO block from falling through to error + if (stream.match(singleDelimiters)) + return null; + + if (brackets.test(ch)) { + stream.next(); + return "bracket"; + } + + if (state.commandMode > 0 && stream.match(command)) + return "variable-2"; + + if (stream.match(intrinsicFuncs)) + return "builtin"; + + if (stream.match(identifiers)) + return "variable"; + + // Detect dollar-sign when not a documented intrinsic function + // "^" may introduce a GVN or SSVN - Color same as function + if (ch === "$" || ch === "^") { + stream.next(); + return "builtin"; + } + + // MUMPS Indirection + if (ch === "@") { + stream.next(); + return "string-2"; + } + + if (/[\w%]/.test(ch)) { + stream.eatWhile(/[\w%]/); + return "variable"; + } + + // Handle non-detected items + stream.next(); + return "error"; + } + + return { + startState: function() { + return { + label: false, + commandMode: 0 + }; + }, + + token: function(stream, state) { + var style = tokenBase(stream, state); + if (state.label) return "tag"; + return style; + } + }; + }); + + CodeMirror.defineMIME("text/x-mumps", "mumps"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js new file mode 100644 index 0000000000..a09f1501fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("nginx", function(config) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words( + /* ngxDirectiveControl */ "break return rewrite set" + + /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" + ); + + var keywords_block = words( + /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" + ); + + var keywords_important = words( + /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" + ); + + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + + function tokenBase(stream, state) { + + + stream.eatWhile(/[\w\$_]/); + + var cur = stream.current(); + + + if (keywords.propertyIsEnumerable(cur)) { + return "keyword"; + } + else if (keywords_block.propertyIsEnumerable(cur)) { + return "variable-2"; + } + else if (keywords_important.propertyIsEnumerable(cur)) { + return "string-2"; + } + /**/ + + var ch = stream.next(); + if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} + else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + else if (ch == "<" && stream.eat("!")) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } + else if (ch == "=") ret(null, "compare"); + else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + else if (ch == "#") { + stream.skipToEnd(); + return ret("comment", "comment"); + } + else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } + else if (/[,.+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } + else if (/[;{}:\[\]]/.test(ch)) { + return ret(null, ch); + } + else { + stream.eatWhile(/[\w\\\-]/); + return ret("variable", "variable"); + } + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (type == "hash" && context == "rule") style = "atom"; + else if (style == "variable") { + if (context == "rule") style = "number"; + else if (!context || context == "@media{") style = "tag"; + } + + if (context == "rule" && /^[\{\};]$/.test(type)) + state.stack.pop(); + if (type == "{") { + if (context == "@media") state.stack[state.stack.length-1] = "@media{"; + else state.stack.push("{"); + } + else if (type == "}") state.stack.pop(); + else if (type == "@media") state.stack.push("@media"); + else if (context == "{" && type != "comment") state.stack.push("rule"); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + if (/^\}/.test(textAfter)) + n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; + return state.baseIndent + n * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("text/x-nginx-conf", "nginx"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js new file mode 100644 index 0000000000..ebd3c8bf5c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js @@ -0,0 +1,95 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Author: Jan T. Sott (http://github.com/idleberg) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineSimpleMode("nsis",{ + start:[ + // Numbers + {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, + + // Strings + { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, + { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, + { regex: /`(?:[^\\`]|\\.)*`?/, token: "string" }, + + // Compile Time Commands + {regex: /^\s*(?:\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|error|execute|finalize|getdllversion|gettlbversion|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|uninstfinalize|verbose|warning))\b/i, token: "keyword"}, + + // Conditional Compilation + {regex: /^\s*(?:\!(if(?:n?def)?|ifmacron?def|macro))\b/i, token: "keyword", indent: true}, + {regex: /^\s*(?:\!(else|endif|macroend))\b/i, token: "keyword", dedent: true}, + + // Runtime Commands + {regex: /^\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|GetWinVer|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\b/i, token: "keyword"}, + {regex: /^\s*(?:Function|PageEx|Section(?:Group)?)\b/i, token: "keyword", indent: true}, + {regex: /^\s*(?:(Function|PageEx|Section(?:Group)?)End)\b/i, token: "keyword", dedent: true}, + + // Command Options + {regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR(32|64)?|HKCU(32|64)?|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM(32|64)?|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/i, token: "atom"}, + {regex: /\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|false|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|off|on|right|show|silent|silentlog|textonly|top|true|try|un\.components|un\.custom|un\.directory|un\.instfiles|un\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\b/i, token: "builtin"}, + + // LogicLib.nsh + {regex: /\$\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\}/i, token: "variable-2", indent: true}, + + // FileFunc.nsh + {regex: /\$\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\}/i, token: "variable-2", dedent: true}, + + // Memento.nsh + {regex: /\$\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\}/i, token: "variable-2", dedent: true}, + + // TextFunc.nsh + {regex: /\$\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\}/i, token: "variable-2", dedent: true}, + + // WinVer.nsh + {regex: /\$\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\}/i, token: "variable", dedent: true}, + + // WordFunc.nsh + {regex: /\$\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\}/i, token: "variable-2", dedent: true}, + + // x64.nsh + {regex: /\$\{(?:RunningX64)\}/i, token: "variable", dedent: true}, + {regex: /\$\{(?:Disable|Enable)X64FSRedirection\}/i, token: "variable-2", dedent: true}, + + // Line Comment + {regex: /(#|;).*/, token: "comment"}, + + // Block Comment + {regex: /\/\*/, token: "comment", next: "comment"}, + + // Operator + {regex: /[-+\/*=<>!]+/, token: "operator"}, + + // Variable + {regex: /\$\w[\w\.]*/, token: "variable"}, + + // Constant + {regex: /\${[\!\w\.:-]+}/, token: "variable-2"}, + + // Language String + {regex: /\$\([\!\w\.:-]+\)/, token: "variable-3"} + ], + comment: [ + {regex: /.*?\*\//, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"} + ], + meta: { + electricInput: /^\s*((Function|PageEx|Section|Section(Group)?)End|(\!(endif|macroend))|\$\{(End(If|Unless|While)|Loop(Until)|Next)\})$/i, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: ["#", ";"] + } +}); + +CodeMirror.defineMIME("text/x-nsis", "nsis"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js new file mode 100644 index 0000000000..5dd027286a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/********************************************************** +* This script provides syntax highlighting support for +* the N-Triples format. +* N-Triples format specification: +* https://www.w3.org/TR/n-triples/ +***********************************************************/ + +/* + The following expression defines the defined ASF grammar transitions. + + pre_subject -> + { + ( writing_subject_uri | writing_bnode_uri ) + -> pre_predicate + -> writing_predicate_uri + -> pre_object + -> writing_object_uri | writing_object_bnode | + ( + writing_object_literal + -> writing_literal_lang | writing_literal_type + ) + -> post_object + -> BEGIN + } otherwise { + -> ERROR + } +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ntriples", function() { + + var Location = { + PRE_SUBJECT : 0, + WRITING_SUB_URI : 1, + WRITING_BNODE_URI : 2, + PRE_PRED : 3, + WRITING_PRED_URI : 4, + PRE_OBJ : 5, + WRITING_OBJ_URI : 6, + WRITING_OBJ_BNODE : 7, + WRITING_OBJ_LITERAL : 8, + WRITING_LIT_LANG : 9, + WRITING_LIT_TYPE : 10, + POST_OBJ : 11, + ERROR : 12 + }; + function transitState(currState, c) { + var currLocation = currState.location; + var ret; + + // Opening. + if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; + else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; + else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; + else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; + else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; + else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; + + // Closing. + else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; + else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; + + // Closing typed and language literal. + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; + + // Spaces. + else if( c == ' ' && + ( + currLocation == Location.PRE_SUBJECT || + currLocation == Location.PRE_PRED || + currLocation == Location.PRE_OBJ || + currLocation == Location.POST_OBJ + ) + ) ret = currLocation; + + // Reset. + else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; + + // Error + else ret = Location.ERROR; + + currState.location=ret; + } + + return { + startState: function() { + return { + location : Location.PRE_SUBJECT, + uris : [], + anchors : [], + bnodes : [], + langs : [], + types : [] + }; + }, + token: function(stream, state) { + var ch = stream.next(); + if(ch == '<') { + transitState(state, ch); + var parsedURI = ''; + stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); + state.uris.push(parsedURI); + if( stream.match('#', false) ) return 'variable'; + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if(ch == '#') { + var parsedAnchor = ''; + stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); + state.anchors.push(parsedAnchor); + return 'variable-2'; + } + if(ch == '>') { + transitState(state, '>'); + return 'variable'; + } + if(ch == '_') { + transitState(state, ch); + var parsedBNode = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); + state.bnodes.push(parsedBNode); + stream.next(); + transitState(state, ' '); + return 'builtin'; + } + if(ch == '"') { + transitState(state, ch); + stream.eatWhile( function(c) { return c != '"'; } ); + stream.next(); + if( stream.peek() != '@' && stream.peek() != '^' ) { + transitState(state, '"'); + } + return 'string'; + } + if( ch == '@' ) { + transitState(state, '@'); + var parsedLang = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); + state.langs.push(parsedLang); + stream.next(); + transitState(state, ' '); + return 'string-2'; + } + if( ch == '^' ) { + stream.next(); + transitState(state, '^'); + var parsedType = ''; + stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); + state.types.push(parsedType); + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if( ch == ' ' ) { + transitState(state, ch); + } + if( ch == '.' ) { + transitState(state, ch); + } + } + }; +}); + +// define the registered Media Type for n-triples: +// https://www.w3.org/TR/n-triples/#n-triples-mediatype +CodeMirror.defineMIME("application/n-triples", "ntriples"); + +// N-Quads is based on the N-Triples format (so same highlighting works) +// https://www.w3.org/TR/n-quads/ +CodeMirror.defineMIME("application/n-quads", "ntriples"); + +// previously used, though technically incorrect media type for n-triples +CodeMirror.defineMIME("text/n-triples", "ntriples"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js new file mode 100644 index 0000000000..33a03368fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("octave", function() { + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"); + var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;\\.]'); + var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); + var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); + var expressionEnd = new RegExp("^[\\]\\)]"); + var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); + + var builtins = wordRegexp([ + 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', + 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', + 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', + 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', + 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', + 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', + 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' + ]); + + var keywords = wordRegexp([ + 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', + 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', + 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', + 'continue', 'pkg' + ]); + + + // tokenizers + function tokenTranspose(stream, state) { + if (!stream.sol() && stream.peek() === '\'') { + stream.next(); + state.tokenize = tokenBase; + return 'operator'; + } + state.tokenize = tokenBase; + return tokenBase(stream, state); + } + + + function tokenComment(stream, state) { + if (stream.match(/^.*%}/)) { + state.tokenize = tokenBase; + return 'comment'; + }; + stream.skipToEnd(); + return 'comment'; + } + + function tokenBase(stream, state) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match('%{')){ + state.tokenize = tokenComment; + stream.skipToEnd(); + return 'comment'; + } + + if (stream.match(/^[%#]/)){ + stream.skipToEnd(); + return 'comment'; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { + stream.tokenize = tokenBase; + return 'number'; }; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + } + if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; + + // Handle Strings + var m = stream.match(/^"(?:[^"]|"")*("|$)/) || stream.match(/^'(?:[^']|'')*('|$)/) + if (m) { return m[1] ? 'string' : "string error"; } + + // Handle words + if (stream.match(keywords)) { return 'keyword'; } ; + if (stream.match(builtins)) { return 'builtin'; } ; + if (stream.match(identifiers)) { return 'variable'; } ; + + if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; + if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; + + if (stream.match(expressionEnd)) { + state.tokenize = tokenTranspose; + return null; + }; + + + // Handle non-detected items + stream.next(); + return 'error'; + }; + + + return { + startState: function() { + return { + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + var style = state.tokenize(stream, state); + if (style === 'number' || style === 'variable'){ + state.tokenize = tokenTranspose; + } + return style; + }, + + lineComment: '%', + + fold: 'indent' + }; +}); + +CodeMirror.defineMIME("text/x-octave", "octave"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js new file mode 100644 index 0000000000..73857e4c7e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js @@ -0,0 +1,252 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("oz", function (conf) { + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = /[\^@!\|<>#~\.\*\-\+\\/,=]/; + var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/; + var tripleOperators = /(:::)|(\.\.\.)|(=<:)|(>=:)/; + + var middle = ["in", "then", "else", "of", "elseof", "elsecase", "elseif", "catch", + "finally", "with", "require", "prepare", "import", "export", "define", "do"]; + var end = ["end"]; + + var atoms = wordRegexp(["true", "false", "nil", "unit"]); + var commonKeywords = wordRegexp(["andthen", "at", "attr", "declare", "feat", "from", "lex", + "mod", "div", "mode", "orelse", "parser", "prod", "prop", "scanner", "self", "syn", "token"]); + var openingKeywords = wordRegexp(["local", "proc", "fun", "case", "class", "if", "cond", "or", "dis", + "choice", "not", "thread", "try", "raise", "lock", "for", "suchthat", "meth", "functor"]); + var middleKeywords = wordRegexp(middle); + var endKeywords = wordRegexp(end); + + // Tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + // Brackets + if(stream.match(/[{}]/)) { + return "bracket"; + } + + // Special [] keyword + if (stream.match('[]')) { + return "keyword" + } + + // Operators + if (stream.match(tripleOperators) || stream.match(doubleOperators)) { + return "operator"; + } + + // Atoms + if(stream.match(atoms)) { + return 'atom'; + } + + // Opening keywords + var matched = stream.match(openingKeywords); + if (matched) { + if (!state.doInCurrentLine) + state.currentIndent++; + else + state.doInCurrentLine = false; + + // Special matching for signatures + if(matched[0] == "proc" || matched[0] == "fun") + state.tokenize = tokenFunProc; + else if(matched[0] == "class") + state.tokenize = tokenClass; + else if(matched[0] == "meth") + state.tokenize = tokenMeth; + + return 'keyword'; + } + + // Middle and other keywords + if (stream.match(middleKeywords) || stream.match(commonKeywords)) { + return "keyword" + } + + // End keywords + if (stream.match(endKeywords)) { + state.currentIndent--; + return 'keyword'; + } + + // Eat the next char for next comparisons + var ch = stream.next(); + + // Strings + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + + // Numbers + if (/[~\d]/.test(ch)) { + if (ch == "~") { + if(! /^[0-9]/.test(stream.peek())) + return null; + else if (( stream.next() == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) + return "number"; + } + + if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) + return "number"; + + return null; + } + + // Comments + if (ch == "%") { + stream.skipToEnd(); + return 'comment'; + } + else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + } + + // Single operators + if(singleOperators.test(ch)) { + return "operator"; + } + + // If nothing match, we skip the entire alphanumeric block + stream.eatWhile(/\w/); + + return "variable"; + } + + function tokenClass(stream, state) { + if (stream.eatSpace()) { + return null; + } + stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/); + state.tokenize = tokenBase; + return "variable-3" + } + + function tokenMeth(stream, state) { + if (stream.eatSpace()) { + return null; + } + stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/); + state.tokenize = tokenBase; + return "def" + } + + function tokenFunProc(stream, state) { + if (stream.eatSpace()) { + return null; + } + + if(!state.hasPassedFirstStage && stream.eat("{")) { + state.hasPassedFirstStage = true; + return "bracket"; + } + else if(state.hasPassedFirstStage) { + stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/); + state.hasPassedFirstStage = false; + state.tokenize = tokenBase; + return "def" + } + else { + state.tokenize = tokenBase; + return null; + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function (stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) + state.tokenize = tokenBase; + return "string"; + }; + } + + function buildElectricInputRegEx() { + // Reindentation should occur on [] or on a match of any of + // the block closing keywords, at the end of a line. + var allClosings = middle.concat(end); + return new RegExp("[\\[\\]]|(" + allClosings.join("|") + ")$"); + } + + return { + + startState: function () { + return { + tokenize: tokenBase, + currentIndent: 0, + doInCurrentLine: false, + hasPassedFirstStage: false + }; + }, + + token: function (stream, state) { + if (stream.sol()) + state.doInCurrentLine = 0; + + return state.tokenize(stream, state); + }, + + indent: function (state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, ''); + + if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\[])/)) + return conf.indentUnit * (state.currentIndent - 1); + + if (state.currentIndent < 0) + return 0; + + return state.currentIndent * conf.indentUnit; + }, + fold: "indent", + electricInput: buildElectricInputRegEx(), + lineComment: "%", + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +CodeMirror.defineMIME("text/x-oz", "oz"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js new file mode 100644 index 0000000000..c48698bd70 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js @@ -0,0 +1,136 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pascal", function() { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words( + "absolute and array asm begin case const constructor destructor div do " + + "downto else end file for function goto if implementation in inherited " + + "inline interface label mod nil not object of operator or packed procedure " + + "program record reintroduce repeat self set shl shr string then to type " + + "unit until uses var while with xor as class dispinterface except exports " + + "finalization finally initialization inline is library on out packed " + + "property raise resourcestring threadvar try absolute abstract alias " + + "assembler bitpacked break cdecl continue cppdecl cvar default deprecated " + + "dynamic enumerator experimental export external far far16 forward generic " + + "helper implements index interrupt iocheck local message name near " + + "nodefault noreturn nostackframe oldfpccall otherwise overload override " + + "pascal platform private protected public published read register " + + "reintroduce result safecall saveregisters softfloat specialize static " + + "stdcall stored strict unaligned unimplemented varargs virtual write"); + var atoms = {"null": true}; + + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == "#" && state.startOfLine) { + stream.skipToEnd(); + return "meta"; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (ch == "(" && stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (ch == "{") { + state.tokenize = tokenCommentBraces; + return tokenCommentBraces(stream, state); + } + if (/[\[\]\(\),;\:\.]/.test(ch)) { + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !escaped) state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenCommentBraces(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "}") { + state.tokenize = null; + break; + } + } + return "comment"; + } + + // Interface + + return { + startState: function() { + return {tokenize: null}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + return style; + }, + + electricChars: "{}" + }; +}); + +CodeMirror.defineMIME("text/x-pascal", "pascal"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js new file mode 100644 index 0000000000..ac011d3c8f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js @@ -0,0 +1,114 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../javascript/javascript")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../javascript/javascript"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pegjs", function (config) { + var jsMode = CodeMirror.getMode(config, "javascript"); + + function identifier(stream) { + return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); + } + + return { + startState: function () { + return { + inString: false, + stringType: null, + inComment: false, + inCharacterClass: false, + braced: 0, + lhs: true, + localState: null + }; + }, + token: function (stream, state) { + if (stream) + + //check for state changes + if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (!state.inString && !state.inComment && stream.match('/*')) { + state.inComment = true; + } + + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inComment) { + while (state.inComment && !stream.eol()) { + if (stream.match('*/')) { + state.inComment = false; // Clear flag + } else { + stream.match(/^.[^\*]*/); + } + } + return "comment"; + } else if (state.inCharacterClass) { + while (state.inCharacterClass && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { + state.inCharacterClass = false; + } + } + } else if (stream.peek() === '[') { + stream.next(); + state.inCharacterClass = true; + return 'bracket'; + } else if (stream.match('//')) { + stream.skipToEnd(); + return "comment"; + } else if (state.braced || stream.peek() === '{') { + if (state.localState === null) { + state.localState = CodeMirror.startState(jsMode); + } + var token = jsMode.token(stream, state.localState); + var text = stream.current(); + if (!token) { + for (var i = 0; i < text.length; i++) { + if (text[i] === '{') { + state.braced++; + } else if (text[i] === '}') { + state.braced--; + } + }; + } + return token; + } else if (identifier(stream)) { + if (stream.peek() === ':') { + return 'variable'; + } + return 'variable-2'; + } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { + stream.next(); + return 'bracket'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}, "javascript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js new file mode 100644 index 0000000000..41e7bc731c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js @@ -0,0 +1,836 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) +// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("perl",function(){ + // http://perldoc.perl.org + var PERL={ // null - magic touch + // 1 - keyword + // 2 - def + // 3 - atom + // 4 - operator + // 5 - variable-2 (predefined) + // [x,y] - x=1,2,3; y=must be defined if x{...} + // PERL operators + '->' : 4, + '++' : 4, + '--' : 4, + '**' : 4, + // ! ~ \ and unary + and - + '=~' : 4, + '!~' : 4, + '*' : 4, + '/' : 4, + '%' : 4, + 'x' : 4, + '+' : 4, + '-' : 4, + '.' : 4, + '<<' : 4, + '>>' : 4, + // named unary operators + '<' : 4, + '>' : 4, + '<=' : 4, + '>=' : 4, + 'lt' : 4, + 'gt' : 4, + 'le' : 4, + 'ge' : 4, + '==' : 4, + '!=' : 4, + '<=>' : 4, + 'eq' : 4, + 'ne' : 4, + 'cmp' : 4, + '~~' : 4, + '&' : 4, + '|' : 4, + '^' : 4, + '&&' : 4, + '||' : 4, + '//' : 4, + '..' : 4, + '...' : 4, + '?' : 4, + ':' : 4, + '=' : 4, + '+=' : 4, + '-=' : 4, + '*=' : 4, // etc. ??? + ',' : 4, + '=>' : 4, + '::' : 4, + // list operators (rightward) + 'not' : 4, + 'and' : 4, + 'or' : 4, + 'xor' : 4, + // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) + 'BEGIN' : [5,1], + 'END' : [5,1], + 'PRINT' : [5,1], + 'PRINTF' : [5,1], + 'GETC' : [5,1], + 'READ' : [5,1], + 'READLINE' : [5,1], + 'DESTROY' : [5,1], + 'TIE' : [5,1], + 'TIEHANDLE' : [5,1], + 'UNTIE' : [5,1], + 'STDIN' : 5, + 'STDIN_TOP' : 5, + 'STDOUT' : 5, + 'STDOUT_TOP' : 5, + 'STDERR' : 5, + 'STDERR_TOP' : 5, + '$ARG' : 5, + '$_' : 5, + '@ARG' : 5, + '@_' : 5, + '$LIST_SEPARATOR' : 5, + '$"' : 5, + '$PROCESS_ID' : 5, + '$PID' : 5, + '$$' : 5, + '$REAL_GROUP_ID' : 5, + '$GID' : 5, + '$(' : 5, + '$EFFECTIVE_GROUP_ID' : 5, + '$EGID' : 5, + '$)' : 5, + '$PROGRAM_NAME' : 5, + '$0' : 5, + '$SUBSCRIPT_SEPARATOR' : 5, + '$SUBSEP' : 5, + '$;' : 5, + '$REAL_USER_ID' : 5, + '$UID' : 5, + '$<' : 5, + '$EFFECTIVE_USER_ID' : 5, + '$EUID' : 5, + '$>' : 5, + '$a' : 5, + '$b' : 5, + '$COMPILING' : 5, + '$^C' : 5, + '$DEBUGGING' : 5, + '$^D' : 5, + '${^ENCODING}' : 5, + '$ENV' : 5, + '%ENV' : 5, + '$SYSTEM_FD_MAX' : 5, + '$^F' : 5, + '@F' : 5, + '${^GLOBAL_PHASE}' : 5, + '$^H' : 5, + '%^H' : 5, + '@INC' : 5, + '%INC' : 5, + '$INPLACE_EDIT' : 5, + '$^I' : 5, + '$^M' : 5, + '$OSNAME' : 5, + '$^O' : 5, + '${^OPEN}' : 5, + '$PERLDB' : 5, + '$^P' : 5, + '$SIG' : 5, + '%SIG' : 5, + '$BASETIME' : 5, + '$^T' : 5, + '${^TAINT}' : 5, + '${^UNICODE}' : 5, + '${^UTF8CACHE}' : 5, + '${^UTF8LOCALE}' : 5, + '$PERL_VERSION' : 5, + '$^V' : 5, + '${^WIN32_SLOPPY_STAT}' : 5, + '$EXECUTABLE_NAME' : 5, + '$^X' : 5, + '$1' : 5, // - regexp $1, $2... + '$MATCH' : 5, + '$&' : 5, + '${^MATCH}' : 5, + '$PREMATCH' : 5, + '$`' : 5, + '${^PREMATCH}' : 5, + '$POSTMATCH' : 5, + "$'" : 5, + '${^POSTMATCH}' : 5, + '$LAST_PAREN_MATCH' : 5, + '$+' : 5, + '$LAST_SUBMATCH_RESULT' : 5, + '$^N' : 5, + '@LAST_MATCH_END' : 5, + '@+' : 5, + '%LAST_PAREN_MATCH' : 5, + '%+' : 5, + '@LAST_MATCH_START' : 5, + '@-' : 5, + '%LAST_MATCH_START' : 5, + '%-' : 5, + '$LAST_REGEXP_CODE_RESULT' : 5, + '$^R' : 5, + '${^RE_DEBUG_FLAGS}' : 5, + '${^RE_TRIE_MAXBUF}' : 5, + '$ARGV' : 5, + '@ARGV' : 5, + 'ARGV' : 5, + 'ARGVOUT' : 5, + '$OUTPUT_FIELD_SEPARATOR' : 5, + '$OFS' : 5, + '$,' : 5, + '$INPUT_LINE_NUMBER' : 5, + '$NR' : 5, + '$.' : 5, + '$INPUT_RECORD_SEPARATOR' : 5, + '$RS' : 5, + '$/' : 5, + '$OUTPUT_RECORD_SEPARATOR' : 5, + '$ORS' : 5, + '$\\' : 5, + '$OUTPUT_AUTOFLUSH' : 5, + '$|' : 5, + '$ACCUMULATOR' : 5, + '$^A' : 5, + '$FORMAT_FORMFEED' : 5, + '$^L' : 5, + '$FORMAT_PAGE_NUMBER' : 5, + '$%' : 5, + '$FORMAT_LINES_LEFT' : 5, + '$-' : 5, + '$FORMAT_LINE_BREAK_CHARACTERS' : 5, + '$:' : 5, + '$FORMAT_LINES_PER_PAGE' : 5, + '$=' : 5, + '$FORMAT_TOP_NAME' : 5, + '$^' : 5, + '$FORMAT_NAME' : 5, + '$~' : 5, + '${^CHILD_ERROR_NATIVE}' : 5, + '$EXTENDED_OS_ERROR' : 5, + '$^E' : 5, + '$EXCEPTIONS_BEING_CAUGHT' : 5, + '$^S' : 5, + '$WARNING' : 5, + '$^W' : 5, + '${^WARNING_BITS}' : 5, + '$OS_ERROR' : 5, + '$ERRNO' : 5, + '$!' : 5, + '%OS_ERROR' : 5, + '%ERRNO' : 5, + '%!' : 5, + '$CHILD_ERROR' : 5, + '$?' : 5, + '$EVAL_ERROR' : 5, + '$@' : 5, + '$OFMT' : 5, + '$#' : 5, + '$*' : 5, + '$ARRAY_BASE' : 5, + '$[' : 5, + '$OLD_PERL_VERSION' : 5, + '$]' : 5, + // PERL blocks + 'if' :[1,1], + elsif :[1,1], + 'else' :[1,1], + 'while' :[1,1], + unless :[1,1], + 'for' :[1,1], + foreach :[1,1], + // PERL functions + 'abs' :1, // - absolute value function + accept :1, // - accept an incoming socket connect + alarm :1, // - schedule a SIGALRM + 'atan2' :1, // - arctangent of Y/X in the range -PI to PI + bind :1, // - binds an address to a socket + binmode :1, // - prepare binary files for I/O + bless :1, // - create an object + bootstrap :1, // + 'break' :1, // - break out of a "given" block + caller :1, // - get context of the current subroutine call + chdir :1, // - change your current working directory + chmod :1, // - changes the permissions on a list of files + chomp :1, // - remove a trailing record separator from a string + chop :1, // - remove the last character from a string + chown :1, // - change the ownership on a list of files + chr :1, // - get character this number represents + chroot :1, // - make directory new root for path lookups + close :1, // - close file (or pipe or socket) handle + closedir :1, // - close directory handle + connect :1, // - connect to a remote socket + 'continue' :[1,1], // - optional trailing block in a while or foreach + 'cos' :1, // - cosine function + crypt :1, // - one-way passwd-style encryption + dbmclose :1, // - breaks binding on a tied dbm file + dbmopen :1, // - create binding on a tied dbm file + 'default' :1, // + defined :1, // - test whether a value, variable, or function is defined + 'delete' :1, // - deletes a value from a hash + die :1, // - raise an exception or bail out + 'do' :1, // - turn a BLOCK into a TERM + dump :1, // - create an immediate core dump + each :1, // - retrieve the next key/value pair from a hash + endgrent :1, // - be done using group file + endhostent :1, // - be done using hosts file + endnetent :1, // - be done using networks file + endprotoent :1, // - be done using protocols file + endpwent :1, // - be done using passwd file + endservent :1, // - be done using services file + eof :1, // - test a filehandle for its end + 'eval' :1, // - catch exceptions or compile and run code + 'exec' :1, // - abandon this program to run another + exists :1, // - test whether a hash key is present + exit :1, // - terminate this program + 'exp' :1, // - raise I to a power + fcntl :1, // - file control system call + fileno :1, // - return file descriptor from filehandle + flock :1, // - lock an entire file with an advisory lock + fork :1, // - create a new process just like this one + format :1, // - declare a picture format with use by the write() function + formline :1, // - internal function used for formats + getc :1, // - get the next character from the filehandle + getgrent :1, // - get next group record + getgrgid :1, // - get group record given group user ID + getgrnam :1, // - get group record given group name + gethostbyaddr :1, // - get host record given its address + gethostbyname :1, // - get host record given name + gethostent :1, // - get next hosts record + getlogin :1, // - return who logged in at this tty + getnetbyaddr :1, // - get network record given its address + getnetbyname :1, // - get networks record given name + getnetent :1, // - get next networks record + getpeername :1, // - find the other end of a socket connection + getpgrp :1, // - get process group + getppid :1, // - get parent process ID + getpriority :1, // - get current nice value + getprotobyname :1, // - get protocol record given name + getprotobynumber :1, // - get protocol record numeric protocol + getprotoent :1, // - get next protocols record + getpwent :1, // - get next passwd record + getpwnam :1, // - get passwd record given user login name + getpwuid :1, // - get passwd record given user ID + getservbyname :1, // - get services record given its name + getservbyport :1, // - get services record given numeric port + getservent :1, // - get next services record + getsockname :1, // - retrieve the sockaddr for a given socket + getsockopt :1, // - get socket options on a given socket + given :1, // + glob :1, // - expand filenames using wildcards + gmtime :1, // - convert UNIX time into record or string using Greenwich time + 'goto' :1, // - create spaghetti code + grep :1, // - locate elements in a list test true against a given criterion + hex :1, // - convert a string to a hexadecimal number + 'import' :1, // - patch a module's namespace into your own + index :1, // - find a substring within a string + 'int' :1, // - get the integer portion of a number + ioctl :1, // - system-dependent device control system call + 'join' :1, // - join a list into a string using a separator + keys :1, // - retrieve list of indices from a hash + kill :1, // - send a signal to a process or process group + last :1, // - exit a block prematurely + lc :1, // - return lower-case version of a string + lcfirst :1, // - return a string with just the next letter in lower case + length :1, // - return the number of bytes in a string + 'link' :1, // - create a hard link in the filesystem + listen :1, // - register your socket as a server + local : 2, // - create a temporary value for a global variable (dynamic scoping) + localtime :1, // - convert UNIX time into record or string using local time + lock :1, // - get a thread lock on a variable, subroutine, or method + 'log' :1, // - retrieve the natural logarithm for a number + lstat :1, // - stat a symbolic link + m :null, // - match a string with a regular expression pattern + map :1, // - apply a change to a list to get back a new list with the changes + mkdir :1, // - create a directory + msgctl :1, // - SysV IPC message control operations + msgget :1, // - get SysV IPC message queue + msgrcv :1, // - receive a SysV IPC message from a message queue + msgsnd :1, // - send a SysV IPC message to a message queue + my : 2, // - declare and assign a local variable (lexical scoping) + 'new' :1, // + next :1, // - iterate a block prematurely + no :1, // - unimport some module symbols or semantics at compile time + oct :1, // - convert a string to an octal number + open :1, // - open a file, pipe, or descriptor + opendir :1, // - open a directory + ord :1, // - find a character's numeric representation + our : 2, // - declare and assign a package variable (lexical scoping) + pack :1, // - convert a list into a binary representation + 'package' :1, // - declare a separate global namespace + pipe :1, // - open a pair of connected filehandles + pop :1, // - remove the last element from an array and return it + pos :1, // - find or set the offset for the last/next m//g search + print :1, // - output a list to a filehandle + printf :1, // - output a formatted list to a filehandle + prototype :1, // - get the prototype (if any) of a subroutine + push :1, // - append one or more elements to an array + q :null, // - singly quote a string + qq :null, // - doubly quote a string + qr :null, // - Compile pattern + quotemeta :null, // - quote regular expression magic characters + qw :null, // - quote a list of words + qx :null, // - backquote quote a string + rand :1, // - retrieve the next pseudorandom number + read :1, // - fixed-length buffered input from a filehandle + readdir :1, // - get a directory from a directory handle + readline :1, // - fetch a record from a file + readlink :1, // - determine where a symbolic link is pointing + readpipe :1, // - execute a system command and collect standard output + recv :1, // - receive a message over a Socket + redo :1, // - start this loop iteration over again + ref :1, // - find out the type of thing being referenced + rename :1, // - change a filename + require :1, // - load in external functions from a library at runtime + reset :1, // - clear all variables of a given name + 'return' :1, // - get out of a function early + reverse :1, // - flip a string or a list + rewinddir :1, // - reset directory handle + rindex :1, // - right-to-left substring search + rmdir :1, // - remove a directory + s :null, // - replace a pattern with a string + say :1, // - print with newline + scalar :1, // - force a scalar context + seek :1, // - reposition file pointer for random-access I/O + seekdir :1, // - reposition directory pointer + select :1, // - reset default output or do I/O multiplexing + semctl :1, // - SysV semaphore control operations + semget :1, // - get set of SysV semaphores + semop :1, // - SysV semaphore operations + send :1, // - send a message over a socket + setgrent :1, // - prepare group file for use + sethostent :1, // - prepare hosts file for use + setnetent :1, // - prepare networks file for use + setpgrp :1, // - set the process group of a process + setpriority :1, // - set a process's nice value + setprotoent :1, // - prepare protocols file for use + setpwent :1, // - prepare passwd file for use + setservent :1, // - prepare services file for use + setsockopt :1, // - set some socket options + shift :1, // - remove the first element of an array, and return it + shmctl :1, // - SysV shared memory operations + shmget :1, // - get SysV shared memory segment identifier + shmread :1, // - read SysV shared memory + shmwrite :1, // - write SysV shared memory + shutdown :1, // - close down just half of a socket connection + 'sin' :1, // - return the sine of a number + sleep :1, // - block for some number of seconds + socket :1, // - create a socket + socketpair :1, // - create a pair of sockets + 'sort' :1, // - sort a list of values + splice :1, // - add or remove elements anywhere in an array + 'split' :1, // - split up a string using a regexp delimiter + sprintf :1, // - formatted print into a string + 'sqrt' :1, // - square root function + srand :1, // - seed the random number generator + stat :1, // - get a file's status information + state :1, // - declare and assign a state variable (persistent lexical scoping) + study :1, // - optimize input data for repeated searches + 'sub' :1, // - declare a subroutine, possibly anonymously + 'substr' :1, // - get or alter a portion of a string + symlink :1, // - create a symbolic link to a file + syscall :1, // - execute an arbitrary system call + sysopen :1, // - open a file, pipe, or descriptor + sysread :1, // - fixed-length unbuffered input from a filehandle + sysseek :1, // - position I/O pointer on handle used with sysread and syswrite + system :1, // - run a separate program + syswrite :1, // - fixed-length unbuffered output to a filehandle + tell :1, // - get current seekpointer on a filehandle + telldir :1, // - get current seekpointer on a directory handle + tie :1, // - bind a variable to an object class + tied :1, // - get a reference to the object underlying a tied variable + time :1, // - return number of seconds since 1970 + times :1, // - return elapsed time for self and child processes + tr :null, // - transliterate a string + truncate :1, // - shorten a file + uc :1, // - return upper-case version of a string + ucfirst :1, // - return a string with just the next letter in upper case + umask :1, // - set file creation mode mask + undef :1, // - remove a variable or function definition + unlink :1, // - remove one link to a file + unpack :1, // - convert binary structure into normal perl variables + unshift :1, // - prepend more elements to the beginning of a list + untie :1, // - break a tie binding to a variable + use :1, // - load in a module at compile time + utime :1, // - set a file's last access and modify times + values :1, // - return a list of the values in a hash + vec :1, // - test or set particular bits in a string + wait :1, // - wait for any child process to die + waitpid :1, // - wait for a particular child process to die + wantarray :1, // - get void vs scalar vs list context of current subroutine call + warn :1, // - print debugging info + when :1, // + write :1, // - print a picture record + y :null}; // - transliterate a string + + var RXstyle="string-2"; + var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type + + function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) + state.chain=null; // 12 3tail + state.style=null; + state.tail=null; + state.tokenize=function(stream,state){ + var e=false,c,i=0; + while(c=stream.next()){ + if(c===chain[i]&&!e){ + if(chain[++i]!==undefined){ + state.chain=chain[i]; + state.style=style; + state.tail=tail;} + else if(tail) + stream.eatWhile(tail); + state.tokenize=tokenPerl; + return style;} + e=!e&&c=="\\";} + return style;}; + return state.tokenize(stream,state);} + + function tokenSOMETHING(stream,state,string){ + state.tokenize=function(stream,state){ + if(stream.string==string) + state.tokenize=tokenPerl; + stream.skipToEnd(); + return "string";}; + return state.tokenize(stream,state);} + + function tokenPerl(stream,state){ + if(stream.eatSpace()) + return null; + if(state.chain) + return tokenChain(stream,state,state.chain,state.style,state.tail); + if(stream.match(/^(\-?((\d[\d_]*)?\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F_]+|0b[01_]+|\d[\d_]*(e[+-]?\d+)?)/)) + return 'number'; + if(stream.match(/^<<(?=[_a-zA-Z])/)){ // NOTE: <"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(c=="q"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"string");}} + else if(c=="w"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"bracket");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"bracket");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"bracket");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"bracket");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"bracket");}} + else if(c=="r"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(/[\^'"!~\/(\[{<]/.test(c)){ + if(c=="("){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[stream.eat(c)],"string");}}}} + if(ch=="m"){ + var c=look(stream, -2); + if(!(c&&/\w/.test(c))){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} + if(c=="("){ + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} + if(ch=="s"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="y"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="t"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat("r");if(c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} + if(ch=="`"){ + return tokenChain(stream,state,[ch],"variable-2");} + if(ch=="/"){ + if(!/~\s*$/.test(prefix(stream))) + return "operator"; + else + return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} + if(ch=="$"){ + var p=stream.pos; + if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) + return "variable-2"; + else + stream.pos=p;} + if(/[$@%]/.test(ch)){ + var p=stream.pos; + if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ + var c=stream.current(); + if(PERL[c]) + return "variable-2";} + stream.pos=p;} + if(/[$@%&]/.test(ch)){ + if(stream.eatWhile(/[\w$]/)||stream.eat("{")&&stream.eatWhile(/[\w$]/)&&stream.eat("}")){ + var c=stream.current(); + if(PERL[c]) + return "variable-2"; + else + return "variable";}} + if(ch=="#"){ + if(look(stream, -2)!="$"){ + stream.skipToEnd(); + return "comment";}} + if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ + var p=stream.pos; + stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); + if(PERL[stream.current()]) + return "operator"; + else + stream.pos=p;} + if(ch=="_"){ + if(stream.pos==1){ + if(suffix(stream, 6)=="_END__"){ + return tokenChain(stream,state,['\0'],"comment");} + else if(suffix(stream, 7)=="_DATA__"){ + return tokenChain(stream,state,['\0'],"variable-2");} + else if(suffix(stream, 7)=="_C__"){ + return tokenChain(stream,state,['\0'],"string");}}} + if(/\w/.test(ch)){ + var p=stream.pos; + if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) + return "string"; + else + stream.pos=p;} + if(/[A-Z]/.test(ch)){ + var l=look(stream, -2); + var p=stream.pos; + stream.eatWhile(/[A-Z_]/); + if(/[\da-z]/.test(look(stream, 0))){ + stream.pos=p;} + else{ + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";}} + if(/[a-zA-Z_]/.test(ch)){ + var l=look(stream, -2); + stream.eatWhile(/\w/); + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";} + return null;} + + return { + startState: function() { + return { + tokenize: tokenPerl, + chain: null, + style: null, + tail: null + }; + }, + token: function(stream, state) { + return (state.tokenize || tokenPerl)(stream, state); + }, + lineComment: '#' + }; +}); + +CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); + +CodeMirror.defineMIME("text/x-perl", "perl"); + +// it's like "peek", but need for look-ahead or look-behind if index < 0 +function look(stream, c){ + return stream.string.charAt(stream.pos+(c||0)); +} + +// return a part of prefix of current stream from current position +function prefix(stream, c){ + if(c){ + var x=stream.pos-c; + return stream.string.substr((x>=0?x:0),c);} + else{ + return stream.string.substr(0,stream.pos-1); + } +} + +// return a part of suffix of current stream from current position +function suffix(stream, c){ + var y=stream.string.length; + var x=y-stream.pos+1; + return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) + stream.pos=y; + else + stream.pos=x; +} + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js new file mode 100644 index 0000000000..127b4a2382 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js @@ -0,0 +1,234 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // Helper for phpString + function matchSequence(list, end, escapes) { + if (list.length == 0) return phpString(end); + return function (stream, state) { + var patterns = list[0]; + for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { + state.tokenize = matchSequence(list.slice(1), end); + return patterns[i][1]; + } + state.tokenize = phpString(end, escapes); + return "string"; + }; + } + function phpString(closing, escapes) { + return function(stream, state) { return phpString_(stream, state, closing, escapes); }; + } + function phpString_(stream, state, closing, escapes) { + // "Complex" syntax + if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) { + state.tokenize = null; + return "string"; + } + + // Simple syntax + if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { + // After the variable name there may appear array or object operator. + if (stream.match("[", false)) { + // Match array operator + state.tokenize = matchSequence([ + [["[", null]], + [[/\d[\w\.]*/, "number"], + [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], + [/[\w\$]+/, "variable"]], + [["]", null]] + ], closing, escapes); + } + if (stream.match(/^->\w/, false)) { + // Match object operator + state.tokenize = matchSequence([ + [["->", null]], + [[/[\w]+/, "variable"]] + ], closing, escapes); + } + return "variable-2"; + } + + var escaped = false; + // Normal string + while (!stream.eol() && + (escaped || escapes === false || + (!stream.match("{$", false) && + !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { + if (!escaped && stream.match(closing)) { + state.tokenize = null; + state.tokStack.pop(); state.tokStack.pop(); + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + + "do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final " + + "for foreach function global goto if implements interface instanceof namespace " + + "new or private protected public static switch throw trait try use var while xor " + + "die echo empty exit eval include include_once isset list require require_once return " + + "print unset __halt_compiler self static parent yield insteadof finally readonly match"; + var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; + var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; + CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); + CodeMirror.registerHelper("wordChars", "php", /[\w$]/); + + var phpConfig = { + name: "clike", + helperType: "php", + keywords: keywords(phpKeywords), + blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), + defKeywords: keywords("class enum function interface namespace trait"), + atoms: keywords(phpAtoms), + builtin: keywords(phpBuiltin), + multiLineStrings: true, + hooks: { + "$": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "variable-2"; + }, + "<": function(stream, state) { + var before; + if (before = stream.match(/^<<\s*/)) { + var quoted = stream.eat(/['"]/); + stream.eatWhile(/[\w\.]/); + var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1)); + if (quoted) stream.eat(quoted); + if (delim) { + (state.tokStack || (state.tokStack = [])).push(delim, 0); + state.tokenize = phpString(delim, quoted != "'"); + return "string"; + } + } + return false; + }, + "#": function(stream) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + }, + "/": function(stream) { + if (stream.eat("/")) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + } + return false; + }, + '"': function(_stream, state) { + (state.tokStack || (state.tokStack = [])).push('"', 0); + state.tokenize = phpString('"'); + return "string"; + }, + "{": function(_stream, state) { + if (state.tokStack && state.tokStack.length) + state.tokStack[state.tokStack.length - 1]++; + return false; + }, + "}": function(_stream, state) { + if (state.tokStack && state.tokStack.length > 0 && + !--state.tokStack[state.tokStack.length - 1]) { + state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]); + } + return false; + } + } + }; + + CodeMirror.defineMode("php", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || "text/html"); + var phpMode = CodeMirror.getMode(config, phpConfig); + + function dispatch(stream, state) { + var isPHP = state.curMode == phpMode; + if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; + if (!isPHP) { + if (stream.match(/^<\?\w*/)) { + state.curMode = phpMode; + if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, "", "")) + state.curState = state.php; + return "meta"; + } + if (state.pending == '"' || state.pending == "'") { + while (!stream.eol() && stream.next() != state.pending) {} + var style = "string"; + } else if (state.pending && stream.pos < state.pending.end) { + stream.pos = state.pending.end; + var style = state.pending.style; + } else { + var style = htmlMode.token(stream, state.curState); + } + if (state.pending) state.pending = null; + var cur = stream.current(), openPHP = cur.search(/<\?/), m; + if (openPHP != -1) { + if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; + else state.pending = {end: stream.pos, style: style}; + stream.backUp(cur.length - openPHP); + } + return style; + } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { + state.curMode = htmlMode; + state.curState = state.html; + if (!state.php.context.prev) state.php = null; + return "meta"; + } else { + return phpMode.token(stream, state.curState); + } + } + + return { + startState: function() { + var html = CodeMirror.startState(htmlMode) + var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null + return {html: html, + php: php, + curMode: parserConfig.startOpen ? phpMode : htmlMode, + curState: parserConfig.startOpen ? php : html, + pending: null}; + }, + + copyState: function(state) { + var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), + php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur; + if (state.curMode == htmlMode) cur = htmlNew; + else cur = phpNew; + return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, + pending: state.pending}; + }, + + token: dispatch, + + indent: function(state, textAfter, line) { + if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || + (state.curMode == phpMode && /^\?>/.test(textAfter))) + return htmlMode.indent(state.html, textAfter, line); + return state.curMode.indent(state.curState, textAfter, line); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + + innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } + }; + }, "htmlmixed", "clike"); + + CodeMirror.defineMIME("application/x-httpd-php", "php"); + CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); + CodeMirror.defineMIME("text/x-php", phpConfig); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js new file mode 100644 index 0000000000..3b9c7746bb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * Pig Latin Mode for CodeMirror 2 + * @author Prasanth Jayachandran + * @link https://github.com/prasanthj/pig-codemirror-2 + * This implementation is adapted from PL/SQL mode in CodeMirror 2. + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pig", function(_config, parserConfig) { + var keywords = parserConfig.keywords, + builtins = parserConfig.builtins, + types = parserConfig.types, + multiLineStrings = parserConfig.multiLineStrings; + + var isOperatorChar = /[*+\-%<>=&?:\/!|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenComment(stream, state) { + var isEnd = false; + var ch; + while(ch = stream.next()) { + if(ch == "/" && isEnd) { + state.tokenize = tokenBase; + break; + } + isEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return "error"; + }; + } + + + function tokenBase(stream, state) { + var ch = stream.next(); + + // is a start of string? + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch)); + // is it one of the special chars + else if(/[\[\]{}\(\),;\.]/.test(ch)) + return null; + // is it a number? + else if(/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment or operator + else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else { + stream.eatWhile(isOperatorChar); + return "operator"; + } + } + // single line comment or operator + else if (ch=="-") { + if(stream.eat("-")){ + stream.skipToEnd(); + return "comment"; + } + else { + stream.eatWhile(isOperatorChar); + return "operator"; + } + } + // is it an operator + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the while word + stream.eatWhile(/[\w\$_]/); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { + //keywords can be used as variables like flatten(group), group.$0 etc.. + if (!stream.eat(")") && !stream.eat(".")) + return "keyword"; + } + // is it one of the builtin functions? + if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) + return "variable-2"; + // is it one of the listed types? + if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) + return "variable-3"; + // default is a 'variable' + return "variable"; + } + } + + // Interface + return { + startState: function() { + return { + tokenize: tokenBase, + startOfLine: true + }; + }, + + token: function(stream, state) { + if(stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + } + }; +}); + +(function() { + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // builtin funcs taken from trunk revision 1303237 + var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; + + // taken from QueryLexer.g + var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + + "NEQ MATCHES TRUE FALSE DUMP"; + + // data types + var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; + + CodeMirror.defineMIME("text/x-pig", { + name: "pig", + builtins: keywords(pBuiltins), + keywords: keywords(pKeywords), + types: keywords(pTypes) + }); + + CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); +}()); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js new file mode 100644 index 0000000000..4869ae7370 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js @@ -0,0 +1,398 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + 'use strict'; + if (typeof exports == 'object' && typeof module == 'object') // CommonJS + mod(require('../../lib/codemirror')); + else if (typeof define == 'function' && define.amd) // AMD + define(['../../lib/codemirror'], mod); + else // Plain browser env + mod(window.CodeMirror); +})(function(CodeMirror) { +'use strict'; + +CodeMirror.defineMode('powershell', function() { + function buildRegexp(patterns, options) { + options = options || {}; + var prefix = options.prefix !== undefined ? options.prefix : '^'; + var suffix = options.suffix !== undefined ? options.suffix : '\\b'; + + for (var i = 0; i < patterns.length; i++) { + if (patterns[i] instanceof RegExp) { + patterns[i] = patterns[i].source; + } + else { + patterns[i] = patterns[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + } + + return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i'); + } + + var notCharacterOrDash = '(?=[^A-Za-z\\d\\-_]|$)'; + var varNames = /[\w\-:]/ + var keywords = buildRegexp([ + /begin|break|catch|continue|data|default|do|dynamicparam/, + /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/, + /param|process|return|switch|throw|trap|try|until|where|while/ + ], { suffix: notCharacterOrDash }); + + var punctuation = /[\[\]{},;`\\\.]|@[({]/; + var wordOperators = buildRegexp([ + 'f', + /b?not/, + /[ic]?split/, 'join', + /is(not)?/, 'as', + /[ic]?(eq|ne|[gl][te])/, + /[ic]?(not)?(like|match|contains)/, + /[ic]?replace/, + /b?(and|or|xor)/ + ], { prefix: '-' }); + var symbolOperators = /[+\-*\/%]=|\+\+|--|\.\.|[+\-*&^%:=!|\/]|<(?!#)|(?!#)>/; + var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' }); + + var numbers = /^((0x[\da-f]+)|((\d+\.\d+|\d\.|\.\d+|\d+)(e[\+\-]?\d+)?))[ld]?([kmgtp]b)?/i; + + var identifiers = /^[A-Za-z\_][A-Za-z\-\_\d]*\b/; + + var symbolBuiltins = /[A-Z]:|%|\?/i; + var namedBuiltins = buildRegexp([ + /Add-(Computer|Content|History|Member|PSSnapin|Type)/, + /Checkpoint-Computer/, + /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/, + /Compare-Object/, + /Complete-Transaction/, + /Connect-PSSession/, + /ConvertFrom-(Csv|Json|SecureString|StringData)/, + /Convert-Path/, + /ConvertTo-(Csv|Html|Json|SecureString|Xml)/, + /Copy-Item(Property)?/, + /Debug-Process/, + /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, + /Disconnect-PSSession/, + /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, + /(Enter|Exit)-PSSession/, + /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/, + /ForEach-Object/, + /Format-(Custom|List|Table|Wide)/, + new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential' + + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job' + + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration' + + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'), + /Group-Object/, + /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/, + /ImportSystemModules/, + /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/, + /Join-Path/, + /Limit-EventLog/, + /Measure-(Command|Object)/, + /Move-Item(Property)?/, + new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile' + + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'), + /Out-(Default|File|GridView|Host|Null|Printer|String)/, + /Pause/, + /(Pop|Push)-Location/, + /Read-Host/, + /Receive-(Job|PSSession)/, + /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/, + /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/, + /Rename-(Computer|Item(Property)?)/, + /Reset-ComputerMachinePassword/, + /Resolve-Path/, + /Restart-(Computer|Service)/, + /Restore-Computer/, + /Resume-(Job|Service)/, + /Save-Help/, + /Select-(Object|String|Xml)/, + /Send-MailMessage/, + new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' + + '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'), + /Show-(Command|ControlPanelItem|EventLog)/, + /Sort-Object/, + /Split-Path/, + /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/, + /Stop-(Computer|Job|Process|Service|Transcript)/, + /Suspend-(Job|Service)/, + /TabExpansion2/, + /Tee-Object/, + /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/, + /Trace-Command/, + /Unblock-File/, + /Undo-Transaction/, + /Unregister-(Event|PSSessionConfiguration)/, + /Update-(FormatData|Help|List|TypeData)/, + /Use-Transaction/, + /Wait-(Event|Job|Process)/, + /Where-Object/, + /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/, + /cd|help|mkdir|more|oss|prompt/, + /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/, + /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/, + /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/, + /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/, + /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/, + /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/ + ], { prefix: '', suffix: '' }); + var variableBuiltins = buildRegexp([ + /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/, + /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/, + /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/, + /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/, + /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/, + /WarningPreference|WhatIfPreference/, + + /Event|EventArgs|EventSubscriber|Sender/, + /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/, + /true|false|null/ + ], { prefix: '\\$', suffix: '' }); + + var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash }); + + var grammar = { + keyword: keywords, + number: numbers, + operator: operators, + builtin: builtins, + punctuation: punctuation, + identifier: identifiers + }; + + // tokenizers + function tokenBase(stream, state) { + // Handle Comments + //var ch = stream.peek(); + + var parent = state.returnStack[state.returnStack.length - 1]; + if (parent && parent.shouldReturnFrom(state)) { + state.tokenize = parent.tokenize; + state.returnStack.pop(); + return state.tokenize(stream, state); + } + + if (stream.eatSpace()) { + return null; + } + + if (stream.eat('(')) { + state.bracketNesting += 1; + return 'punctuation'; + } + + if (stream.eat(')')) { + state.bracketNesting -= 1; + return 'punctuation'; + } + + for (var key in grammar) { + if (stream.match(grammar[key])) { + return key; + } + } + + var ch = stream.next(); + + // single-quote string + if (ch === "'") { + return tokenSingleQuoteString(stream, state); + } + + if (ch === '$') { + return tokenVariable(stream, state); + } + + // double-quote string + if (ch === '"') { + return tokenDoubleQuoteString(stream, state); + } + + if (ch === '<' && stream.eat('#')) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + + if (ch === '#') { + stream.skipToEnd(); + return 'comment'; + } + + if (ch === '@') { + var quoteMatch = stream.eat(/["']/); + if (quoteMatch && stream.eol()) { + state.tokenize = tokenMultiString; + state.startQuote = quoteMatch[0]; + return tokenMultiString(stream, state); + } else if (stream.eol()) { + return 'error'; + } else if (stream.peek().match(/[({]/)) { + return 'punctuation'; + } else if (stream.peek().match(varNames)) { + // splatted variable + return tokenVariable(stream, state); + } + } + return 'error'; + } + + function tokenSingleQuoteString(stream, state) { + var ch; + while ((ch = stream.peek()) != null) { + stream.next(); + + if (ch === "'" && !stream.eat("'")) { + state.tokenize = tokenBase; + return 'string'; + } + } + + return 'error'; + } + + function tokenDoubleQuoteString(stream, state) { + var ch; + while ((ch = stream.peek()) != null) { + if (ch === '$') { + state.tokenize = tokenStringInterpolation; + return 'string'; + } + + stream.next(); + if (ch === '`') { + stream.next(); + continue; + } + + if (ch === '"' && !stream.eat('"')) { + state.tokenize = tokenBase; + return 'string'; + } + } + + return 'error'; + } + + function tokenStringInterpolation(stream, state) { + return tokenInterpolation(stream, state, tokenDoubleQuoteString); + } + + function tokenMultiStringReturn(stream, state) { + state.tokenize = tokenMultiString; + state.startQuote = '"' + return tokenMultiString(stream, state); + } + + function tokenHereStringInterpolation(stream, state) { + return tokenInterpolation(stream, state, tokenMultiStringReturn); + } + + function tokenInterpolation(stream, state, parentTokenize) { + if (stream.match('$(')) { + var savedBracketNesting = state.bracketNesting; + state.returnStack.push({ + /*jshint loopfunc:true */ + shouldReturnFrom: function(state) { + return state.bracketNesting === savedBracketNesting; + }, + tokenize: parentTokenize + }); + state.tokenize = tokenBase; + state.bracketNesting += 1; + return 'punctuation'; + } else { + stream.next(); + state.returnStack.push({ + shouldReturnFrom: function() { return true; }, + tokenize: parentTokenize + }); + state.tokenize = tokenVariable; + return state.tokenize(stream, state); + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == '>') { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch === '#'); + } + return 'comment'; + } + + function tokenVariable(stream, state) { + var ch = stream.peek(); + if (stream.eat('{')) { + state.tokenize = tokenVariableWithBraces; + return tokenVariableWithBraces(stream, state); + } else if (ch != undefined && ch.match(varNames)) { + stream.eatWhile(varNames); + state.tokenize = tokenBase; + return 'variable-2'; + } else { + state.tokenize = tokenBase; + return 'error'; + } + } + + function tokenVariableWithBraces(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch === '}') { + state.tokenize = tokenBase; + break; + } + } + return 'variable-2'; + } + + function tokenMultiString(stream, state) { + var quote = state.startQuote; + if (stream.sol() && stream.match(new RegExp(quote + '@'))) { + state.tokenize = tokenBase; + } + else if (quote === '"') { + while (!stream.eol()) { + var ch = stream.peek(); + if (ch === '$') { + state.tokenize = tokenHereStringInterpolation; + return 'string'; + } + + stream.next(); + if (ch === '`') { + stream.next(); + } + } + } + else { + stream.skipToEnd(); + } + + return 'string'; + } + + var external = { + startState: function() { + return { + returnStack: [], + bracketNesting: 0, + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + return state.tokenize(stream, state); + }, + + blockCommentStart: '<#', + blockCommentEnd: '#>', + lineComment: '#', + fold: 'brace' + }; + return external; +}); + +CodeMirror.defineMIME('application/x-powershell', 'powershell'); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js new file mode 100644 index 0000000000..02fd7fe5eb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js @@ -0,0 +1,78 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("properties", function() { + return { + token: function(stream, state) { + var sol = stream.sol() || state.afterSection; + var eol = stream.eol(); + + state.afterSection = false; + + if (sol) { + if (state.nextMultiline) { + state.inMultiline = true; + state.nextMultiline = false; + } else { + state.position = "def"; + } + } + + if (eol && ! state.nextMultiline) { + state.inMultiline = false; + state.position = "def"; + } + + if (sol) { + while(stream.eatSpace()) {} + } + + var ch = stream.next(); + + if (sol && (ch === "#" || ch === "!" || ch === ";")) { + state.position = "comment"; + stream.skipToEnd(); + return "comment"; + } else if (sol && ch === "[") { + state.afterSection = true; + stream.skipTo("]"); stream.eat("]"); + return "header"; + } else if (ch === "=" || ch === ":") { + state.position = "quote"; + return null; + } else if (ch === "\\" && state.position === "quote") { + if (stream.eol()) { // end of line? + // Multiline value + state.nextMultiline = true; + } + } + + return state.position; + }, + + startState: function() { + return { + position : "def", // Current position, "def", "quote" or "comment" + nextMultiline : false, // Is the next line multiline value + inMultiline : false, // Is the current line a multiline value + afterSection : false // Did we just open a section + }; + } + + }; +}); + +CodeMirror.defineMIME("text/x-properties", "properties"); +CodeMirror.defineMIME("text/x-ini", "properties"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js new file mode 100644 index 0000000000..40b0842d47 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + }; + + var keywordArray = [ + "package", "message", "import", "syntax", + "required", "optional", "repeated", "reserved", "default", "extensions", "packed", + "bool", "bytes", "double", "enum", "float", "string", + "int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64", + "option", "service", "rpc", "returns" + ]; + var keywords = wordRegexp(keywordArray); + + CodeMirror.registerHelper("hintWords", "protobuf", keywordArray); + + var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); + + function tokenBase(stream) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match("//")) { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) + return "number"; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) + return "number"; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) + return "number"; + } + + // Handle Strings + if (stream.match(/^"([^"]|(""))*"/)) { return "string"; } + if (stream.match(/^'([^']|(''))*'/)) { return "string"; } + + // Handle words + if (stream.match(keywords)) { return "keyword"; } + if (stream.match(identifiers)) { return "variable"; } ; + + // Handle non-detected items + stream.next(); + return null; + }; + + CodeMirror.defineMode("protobuf", function() { + return { + token: tokenBase, + fold: "brace" + }; + }); + + CodeMirror.defineMIME("text/x-protobuf", "protobuf"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js new file mode 100644 index 0000000000..73e9ae2fc8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js @@ -0,0 +1,591 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pug", function (config) { + // token types + var KEYWORD = 'keyword'; + var DOCTYPE = 'meta'; + var ID = 'builtin'; + var CLASS = 'qualifier'; + + var ATTRS_NEST = { + '{': '}', + '(': ')', + '[': ']' + }; + + var jsMode = CodeMirror.getMode(config, 'javascript'); + + function State() { + this.javaScriptLine = false; + this.javaScriptLineExcludesColon = false; + + this.javaScriptArguments = false; + this.javaScriptArgumentsDepth = 0; + + this.isInterpolating = false; + this.interpolationNesting = 0; + + this.jsState = CodeMirror.startState(jsMode); + + this.restOfLine = ''; + + this.isIncludeFiltered = false; + this.isEach = false; + + this.lastTag = ''; + this.scriptType = ''; + + // Attributes Mode + this.isAttrs = false; + this.attrsNest = []; + this.inAttributeName = true; + this.attributeIsType = false; + this.attrValue = ''; + + // Indented Mode + this.indentOf = Infinity; + this.indentToken = ''; + + this.innerMode = null; + this.innerState = null; + + this.innerModeForLine = false; + } + /** + * Safely copy a state + * + * @return {State} + */ + State.prototype.copy = function () { + var res = new State(); + res.javaScriptLine = this.javaScriptLine; + res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon; + res.javaScriptArguments = this.javaScriptArguments; + res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth; + res.isInterpolating = this.isInterpolating; + res.interpolationNesting = this.interpolationNesting; + + res.jsState = CodeMirror.copyState(jsMode, this.jsState); + + res.innerMode = this.innerMode; + if (this.innerMode && this.innerState) { + res.innerState = CodeMirror.copyState(this.innerMode, this.innerState); + } + + res.restOfLine = this.restOfLine; + + res.isIncludeFiltered = this.isIncludeFiltered; + res.isEach = this.isEach; + res.lastTag = this.lastTag; + res.scriptType = this.scriptType; + res.isAttrs = this.isAttrs; + res.attrsNest = this.attrsNest.slice(); + res.inAttributeName = this.inAttributeName; + res.attributeIsType = this.attributeIsType; + res.attrValue = this.attrValue; + res.indentOf = this.indentOf; + res.indentToken = this.indentToken; + + res.innerModeForLine = this.innerModeForLine; + + return res; + }; + + function javaScript(stream, state) { + if (stream.sol()) { + // if javaScriptLine was set at end of line, ignore it + state.javaScriptLine = false; + state.javaScriptLineExcludesColon = false; + } + if (state.javaScriptLine) { + if (state.javaScriptLineExcludesColon && stream.peek() === ':') { + state.javaScriptLine = false; + state.javaScriptLineExcludesColon = false; + return; + } + var tok = jsMode.token(stream, state.jsState); + if (stream.eol()) state.javaScriptLine = false; + return tok || true; + } + } + function javaScriptArguments(stream, state) { + if (state.javaScriptArguments) { + if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') { + state.javaScriptArguments = false; + return; + } + if (stream.peek() === '(') { + state.javaScriptArgumentsDepth++; + } else if (stream.peek() === ')') { + state.javaScriptArgumentsDepth--; + } + if (state.javaScriptArgumentsDepth === 0) { + state.javaScriptArguments = false; + return; + } + + var tok = jsMode.token(stream, state.jsState); + return tok || true; + } + } + + function yieldStatement(stream) { + if (stream.match(/^yield\b/)) { + return 'keyword'; + } + } + + function doctype(stream) { + if (stream.match(/^(?:doctype) *([^\n]+)?/)) { + return DOCTYPE; + } + } + + function interpolation(stream, state) { + if (stream.match('#{')) { + state.isInterpolating = true; + state.interpolationNesting = 0; + return 'punctuation'; + } + } + + function interpolationContinued(stream, state) { + if (state.isInterpolating) { + if (stream.peek() === '}') { + state.interpolationNesting--; + if (state.interpolationNesting < 0) { + stream.next(); + state.isInterpolating = false; + return 'punctuation'; + } + } else if (stream.peek() === '{') { + state.interpolationNesting++; + } + return jsMode.token(stream, state.jsState) || true; + } + } + + function caseStatement(stream, state) { + if (stream.match(/^case\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function when(stream, state) { + if (stream.match(/^when\b/)) { + state.javaScriptLine = true; + state.javaScriptLineExcludesColon = true; + return KEYWORD; + } + } + + function defaultStatement(stream) { + if (stream.match(/^default\b/)) { + return KEYWORD; + } + } + + function extendsStatement(stream, state) { + if (stream.match(/^extends?\b/)) { + state.restOfLine = 'string'; + return KEYWORD; + } + } + + function append(stream, state) { + if (stream.match(/^append\b/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + function prepend(stream, state) { + if (stream.match(/^prepend\b/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + function block(stream, state) { + if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + + function include(stream, state) { + if (stream.match(/^include\b/)) { + state.restOfLine = 'string'; + return KEYWORD; + } + } + + function includeFiltered(stream, state) { + if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) { + state.isIncludeFiltered = true; + return KEYWORD; + } + } + + function includeFilteredContinued(stream, state) { + if (state.isIncludeFiltered) { + var tok = filter(stream, state); + state.isIncludeFiltered = false; + state.restOfLine = 'string'; + return tok; + } + } + + function mixin(stream, state) { + if (stream.match(/^mixin\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function call(stream, state) { + if (stream.match(/^\+([-\w]+)/)) { + if (!stream.match(/^\( *[-\w]+ *=/, false)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + } + return 'variable'; + } + if (stream.match('+#{', false)) { + stream.next(); + state.mixinCallAfter = true; + return interpolation(stream, state); + } + } + function callArguments(stream, state) { + if (state.mixinCallAfter) { + state.mixinCallAfter = false; + if (!stream.match(/^\( *[-\w]+ *=/, false)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + } + return true; + } + } + + function conditional(stream, state) { + if (stream.match(/^(if|unless|else if|else)\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function each(stream, state) { + if (stream.match(/^(- *)?(each|for)\b/)) { + state.isEach = true; + return KEYWORD; + } + } + function eachContinued(stream, state) { + if (state.isEach) { + if (stream.match(/^ in\b/)) { + state.javaScriptLine = true; + state.isEach = false; + return KEYWORD; + } else if (stream.sol() || stream.eol()) { + state.isEach = false; + } else if (stream.next()) { + while (!stream.match(/^ in\b/, false) && stream.next()); + return 'variable'; + } + } + } + + function whileStatement(stream, state) { + if (stream.match(/^while\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function tag(stream, state) { + var captures; + if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) { + state.lastTag = captures[1].toLowerCase(); + if (state.lastTag === 'script') { + state.scriptType = 'application/javascript'; + } + return 'tag'; + } + } + + function filter(stream, state) { + if (stream.match(/^:([\w\-]+)/)) { + var innerMode; + if (config && config.innerModes) { + innerMode = config.innerModes(stream.current().substring(1)); + } + if (!innerMode) { + innerMode = stream.current().substring(1); + } + if (typeof innerMode === 'string') { + innerMode = CodeMirror.getMode(config, innerMode); + } + setInnerMode(stream, state, innerMode); + return 'atom'; + } + } + + function code(stream, state) { + if (stream.match(/^(!?=|-)/)) { + state.javaScriptLine = true; + return 'punctuation'; + } + } + + function id(stream) { + if (stream.match(/^#([\w-]+)/)) { + return ID; + } + } + + function className(stream) { + if (stream.match(/^\.([\w-]+)/)) { + return CLASS; + } + } + + function attrs(stream, state) { + if (stream.peek() == '(') { + stream.next(); + state.isAttrs = true; + state.attrsNest = []; + state.inAttributeName = true; + state.attrValue = ''; + state.attributeIsType = false; + return 'punctuation'; + } + } + + function attrsContinued(stream, state) { + if (state.isAttrs) { + if (ATTRS_NEST[stream.peek()]) { + state.attrsNest.push(ATTRS_NEST[stream.peek()]); + } + if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) { + state.attrsNest.pop(); + } else if (stream.eat(')')) { + state.isAttrs = false; + return 'punctuation'; + } + if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) { + if (stream.peek() === '=' || stream.peek() === '!') { + state.inAttributeName = false; + state.jsState = CodeMirror.startState(jsMode); + if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') { + state.attributeIsType = true; + } else { + state.attributeIsType = false; + } + } + return 'attribute'; + } + + var tok = jsMode.token(stream, state.jsState); + if (state.attributeIsType && tok === 'string') { + state.scriptType = stream.current().toString(); + } + if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) { + try { + Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, '')); + state.inAttributeName = true; + state.attrValue = ''; + stream.backUp(stream.current().length); + return attrsContinued(stream, state); + } catch (ex) { + //not the end of an attribute + } + } + state.attrValue += stream.current(); + return tok || true; + } + } + + function attributesBlock(stream, state) { + if (stream.match(/^&attributes\b/)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + return 'keyword'; + } + } + + function indent(stream) { + if (stream.sol() && stream.eatSpace()) { + return 'indent'; + } + } + + function comment(stream, state) { + if (stream.match(/^ *\/\/(-)?([^\n]*)/)) { + state.indentOf = stream.indentation(); + state.indentToken = 'comment'; + return 'comment'; + } + } + + function colon(stream) { + if (stream.match(/^: */)) { + return 'colon'; + } + } + + function text(stream, state) { + if (stream.match(/^(?:\| ?| )([^\n]+)/)) { + return 'string'; + } + if (stream.match(/^(<[^\n]*)/, false)) { + // html string + setInnerMode(stream, state, 'htmlmixed'); + state.innerModeForLine = true; + return innerMode(stream, state, true); + } + } + + function dot(stream, state) { + if (stream.eat('.')) { + var innerMode = null; + if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) { + innerMode = state.scriptType.toLowerCase().replace(/"|'/g, ''); + } else if (state.lastTag === 'style') { + innerMode = 'css'; + } + setInnerMode(stream, state, innerMode); + return 'dot'; + } + } + + function fail(stream) { + stream.next(); + return null; + } + + + function setInnerMode(stream, state, mode) { + mode = CodeMirror.mimeModes[mode] || mode; + mode = config.innerModes ? config.innerModes(mode) || mode : mode; + mode = CodeMirror.mimeModes[mode] || mode; + mode = CodeMirror.getMode(config, mode); + state.indentOf = stream.indentation(); + + if (mode && mode.name !== 'null') { + state.innerMode = mode; + } else { + state.indentToken = 'string'; + } + } + function innerMode(stream, state, force) { + if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) { + if (state.innerMode) { + if (!state.innerState) { + state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {}; + } + return stream.hideFirstChars(state.indentOf + 2, function () { + return state.innerMode.token(stream, state.innerState) || true; + }); + } else { + stream.skipToEnd(); + return state.indentToken; + } + } else if (stream.sol()) { + state.indentOf = Infinity; + state.indentToken = null; + state.innerMode = null; + state.innerState = null; + } + } + function restOfLine(stream, state) { + if (stream.sol()) { + // if restOfLine was set at end of line, ignore it + state.restOfLine = ''; + } + if (state.restOfLine) { + stream.skipToEnd(); + var tok = state.restOfLine; + state.restOfLine = ''; + return tok; + } + } + + + function startState() { + return new State(); + } + function copyState(state) { + return state.copy(); + } + /** + * Get the next token in the stream + * + * @param {Stream} stream + * @param {State} state + */ + function nextToken(stream, state) { + var tok = innerMode(stream, state) + || restOfLine(stream, state) + || interpolationContinued(stream, state) + || includeFilteredContinued(stream, state) + || eachContinued(stream, state) + || attrsContinued(stream, state) + || javaScript(stream, state) + || javaScriptArguments(stream, state) + || callArguments(stream, state) + + || yieldStatement(stream) + || doctype(stream) + || interpolation(stream, state) + || caseStatement(stream, state) + || when(stream, state) + || defaultStatement(stream) + || extendsStatement(stream, state) + || append(stream, state) + || prepend(stream, state) + || block(stream, state) + || include(stream, state) + || includeFiltered(stream, state) + || mixin(stream, state) + || call(stream, state) + || conditional(stream, state) + || each(stream, state) + || whileStatement(stream, state) + || tag(stream, state) + || filter(stream, state) + || code(stream, state) + || id(stream) + || className(stream) + || attrs(stream, state) + || attributesBlock(stream, state) + || indent(stream) + || text(stream, state) + || comment(stream, state) + || colon(stream) + || dot(stream, state) + || fail(stream); + + return tok === true ? null : tok; + } + return { + startState: startState, + copyState: copyState, + token: nextToken + }; +}, 'javascript', 'css', 'htmlmixed'); + +CodeMirror.defineMIME('text/x-pug', 'pug'); +CodeMirror.defineMIME('text/x-jade', 'pug'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js new file mode 100644 index 0000000000..a92ca1107b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js @@ -0,0 +1,220 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("puppet", function () { + // Stores the words from the define method + var words = {}; + // Taken, mostly, from the Puppet official variable standards regex + var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; + + // Takes a string of words separated by spaces and adds them as + // keys with the value of the first argument 'style' + function define(style, string) { + var split = string.split(' '); + for (var i = 0; i < split.length; i++) { + words[split[i]] = style; + } + } + + // Takes commonly known puppet types/words and classifies them to a style + define('keyword', 'class define site node include import inherits'); + define('keyword', 'case if else in and elsif default or'); + define('atom', 'false true running present absent file directory undef'); + define('builtin', 'action augeas burst chain computer cron destination dport exec ' + + 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + + 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + + 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + + 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + + 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + + 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + + 'resources router schedule scheduled_task selboolean selmodule service source ' + + 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + + 'user vlan yumrepo zfs zone zpool'); + + // After finding a start of a string ('|") this function attempts to find the end; + // If a variable is encountered along the way, we display it differently when it + // is encapsulated in a double-quoted string. + function tokenString(stream, state) { + var current, prev, found_var = false; + while (!stream.eol() && (current = stream.next()) != state.pending) { + if (current === '$' && prev != '\\' && state.pending == '"') { + found_var = true; + break; + } + prev = current; + } + if (found_var) { + stream.backUp(1); + } + if (current == state.pending) { + state.continueString = false; + } else { + state.continueString = true; + } + return "string"; + } + + // Main function + function tokenize(stream, state) { + // Matches one whole word + var word = stream.match(/[\w]+/, false); + // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) + var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); + // Matches non-builtin resource declarations + // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) + var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); + // Matches virtual and exported resources (i.e. @@user { ; and the like) + var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); + + // Finally advance the stream + var ch = stream.next(); + + // Have we found a variable? + if (ch === '$') { + if (stream.match(variable_regex)) { + // If so, and its in a string, assign it a different color + return state.continueString ? 'variable-2' : 'variable'; + } + // Otherwise return an invalid variable + return "error"; + } + // Should we still be looking for the end of a string? + if (state.continueString) { + // If so, go through the loop again + stream.backUp(1); + return tokenString(stream, state); + } + // Are we in a definition (class, node, define)? + if (state.inDefinition) { + // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) + if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { + return 'def'; + } + // Match the rest it the next time around + stream.match(/\s+{/); + state.inDefinition = false; + } + // Are we in an 'include' statement? + if (state.inInclude) { + // Match and return the included class + stream.match(/(\s+)?\S+(\s+)?/); + state.inInclude = false; + return 'def'; + } + // Do we just have a function on our hands? + // In 'ensure_resource("myclass")', 'ensure_resource' is matched + if (stream.match(/(\s+)?\w+\(/)) { + stream.backUp(1); + return 'def'; + } + // Have we matched the prior attribute regex? + if (attribute) { + stream.match(/(\s+)?\w+/); + return 'tag'; + } + // Do we have Puppet specific words? + if (word && words.hasOwnProperty(word)) { + // Negates the initial next() + stream.backUp(1); + // rs move the stream + stream.match(/[\w]+/); + // We want to process these words differently + // do to the importance they have in Puppet + if (stream.match(/\s+\S+\s+{/, false)) { + state.inDefinition = true; + } + if (word == 'include') { + state.inInclude = true; + } + // Returns their value as state in the prior define methods + return words[word]; + } + // Is there a match on a reference? + if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { + // Negate the next() + stream.backUp(1); + // Match the full reference + stream.match(/(^|\s+)[A-Z][\w:_]+/); + return 'def'; + } + // Have we matched the prior resource regex? + if (resource) { + stream.match(/(\s+)?[\w:_]+/); + return 'def'; + } + // Have we matched the prior special_resource regex? + if (special_resource) { + stream.match(/(\s+)?[@]{1,2}/); + return 'special'; + } + // Match all the comments. All of them. + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + // Have we found a string? + if (ch == "'" || ch == '"') { + // Store the type (single or double) + state.pending = ch; + // Perform the looping function to find the end + return tokenString(stream, state); + } + // Match all the brackets + if (ch == '{' || ch == '}') { + return 'bracket'; + } + // Match characters that we are going to assume + // are trying to be regex + if (ch == '/') { + stream.match(/^[^\/]*\//); + return 'variable-3'; + } + // Match all the numbers + if (ch.match(/[0-9]/)) { + stream.eatWhile(/[0-9]+/); + return 'number'; + } + // Match the '=' and '=>' operators + if (ch == '=') { + if (stream.peek() == '>') { + stream.next(); + } + return "operator"; + } + // Keep advancing through all the rest + stream.eatWhile(/[\w-]/); + // Return a blank line for everything else + return null; + } + // Start it all + return { + startState: function () { + var state = {}; + state.inDefinition = false; + state.inInclude = false; + state.continueString = false; + state.pending = false; + return state; + }, + token: function (stream, state) { + // Strip the spaces, but regex will account for them eitherway + if (stream.eatSpace()) return null; + // Go through the main process + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-puppet", "puppet"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js new file mode 100644 index 0000000000..9e532ea1b3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js @@ -0,0 +1,402 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.\\]/; + // (Backwards-compatibility with old, cumbersome config system) + var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters, + parserConf.operators || /^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/] + for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1) + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != undefined) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + + if (parserConf.extra_builtins != undefined) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + + var py3 = !(parserConf.version && Number(parserConf.version) < 3) + if (py3) { + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp("^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\"{3}|['\"]))", "i"); + } else { + var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"]); + var stringPrefixes = new RegExp("^(([rubf]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + var sol = stream.sol() && state.lastToken != "\\" + if (sol) state.indent = stream.indentation() + // Handle scope changes + if (sol && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != "#") + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state, inFormat) { + if (stream.eatSpace()) return null; + + // Handle Comments + if (!inFormat && stream.match(/^#.*/)) return "comment"; + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^[\d_]+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01_]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7_]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1; + if (!isFmtString) { + state.tokenize = tokenStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } else { + state.tokenize = formatStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } + } + + for (var i = 0; i < operators.length; i++) + if (stream.match(operators[i])) return "operator" + + if (stream.match(delimiters)) return "punctuation"; + + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return inFormat ? null :ERRORCLASS; + } + + function formatStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenNestedExpr(depth) { + return function(stream, state) { + var inner = tokenBaseInner(stream, state, true) + if (inner == "punctuation") { + if (stream.current() == "{") { + state.tokenize = tokenNestedExpr(depth + 1) + } else if (stream.current() == "}") { + if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1) + else state.tokenize = tokenString + } + } + return inner + } + } + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\{\}\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else if (stream.match('{{')) { + // ignore {{ in f-str + return OUTCLASS; + } else if (stream.match('{', false)) { + // switch to nested mode + state.tokenize = tokenNestedExpr(0) + if (stream.current()) return OUTCLASS; + else return state.tokenize(stream, state) + } else if (stream.match('}}')) { + return OUTCLASS; + } else if (stream.match('}')) { + // single } in f-string is an error + return ERRORCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function tokenStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop() + state.scopes.push({offset: top(state).offset + conf.indentUnit, + type: "py", + align: null}) + } + + function pushBracketScope(stream, state, type) { + var align = stream.match(/^[\s\[\{\(]*(?:#|$)/, false) ? null : stream.column() + 1 + state.scopes.push({offset: state.indent + hangingIndent, + type: type, + align: align}) + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (state.scopes.length > 1 && top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + if (stream.sol()) { + state.beginningOfLine = true; + state.dedent = false; + } + + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle decorators + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + + if (/\S/.test(current)) state.beginningOfLine = false; + + if ((style == "variable" || style == "builtin") + && state.lastToken == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent = true; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py" && stream.match(/^\s*(?:#|$)/, false)) + pushPyScope(state); + + if (current.length == 1 && !/string|comment/.test(style)) { + var delimiter_index = "[({".indexOf(current); + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent + else return ERRORCLASS; + } + } + if (state.dedent && stream.eol() && top(state).type == "py" && state.scopes.length > 1) + state.scopes.pop(); + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + if (style && style != "comment") + state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; + if (style == "punctuation") style = null; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state) + var closing = scope.type == textAfter.charAt(0) || + scope.type == "py" && !state.dedent && /^(else:|elif |except |finally:)/.test(textAfter) + if (scope.align != null) + return scope.align - (closing ? 1 : 0) + else + return scope.offset - (closing ? hangingIndent : 0) + }, + + electricInput: /^\s*([\}\]\)]|else:|elif |except |finally:)$/, + closeBrackets: {triples: "'\""}, + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except "+ + "extern gil include nogil property public "+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js new file mode 100644 index 0000000000..c016a6aa65 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("q",function(config){ + var indentUnit=config.indentUnit, + curPunc, + keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), + E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; + function buildRE(w){return new RegExp("^("+w.join("|")+")$");} + function tokenBase(stream,state){ + var sol=stream.sol(),c=stream.next(); + curPunc=null; + if(sol) + if(c=="/") + return(state.tokenize=tokenLineComment)(stream,state); + else if(c=="\\"){ + if(stream.eol()||/\s/.test(stream.peek())) + return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream):state.tokenize=tokenBase,"comment"; + else + return state.tokenize=tokenBase,"builtin"; + } + if(/\s/.test(c)) + return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; + if(c=='"') + return(state.tokenize=tokenString)(stream,state); + if(c=='`') + return stream.eatWhile(/[A-Za-z\d_:\/.]/),"symbol"; + if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ + var t=null; + stream.backUp(1); + if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([DT](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) + || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) + || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) + || stream.match(/^\d+[ptuv]{1}/)) + t="temporal"; + else if(stream.match(/^0[NwW]{1}/) + || stream.match(/^0x[\da-fA-F]*/) + || stream.match(/^[01]+[b]{1}/) + || stream.match(/^\d+[chijn]{1}/) + || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) + t="number"; + return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); + } + if(/[A-Za-z]|\./.test(c)) + return stream.eatWhile(/[A-Za-z._\d]/),keywords.test(stream.current())?"keyword":"variable"; + if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) + return null; + if(/[{}\(\[\]\)]/.test(c)) + return null; + return"error"; + } + function tokenLineComment(stream,state){ + return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; + } + function tokenBlockComment(stream,state){ + var f=stream.sol()&&stream.peek()=="\\"; + stream.skipToEnd(); + if(f&&/^\\\s*$/.test(stream.current())) + state.tokenize=tokenBase; + return"comment"; + } + function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} + function tokenString(stream,state){ + var escaped=false,next,end=false; + while((next=stream.next())){ + if(next=="\""&&!escaped){end=true;break;} + escaped=!escaped&&next=="\\"; + } + if(end)state.tokenize=tokenBase; + return"string"; + } + function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} + function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} + return{ + startState:function(){ + return{tokenize:tokenBase, + context:null, + indent:0, + col:0}; + }, + token:function(stream,state){ + if(stream.sol()){ + if(state.context&&state.context.align==null) + state.context.align=false; + state.indent=stream.indentation(); + } + //if (stream.eatSpace()) return null; + var style=state.tokenize(stream,state); + if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ + state.context.align=true; + } + if(curPunc=="(")pushContext(state,")",stream.column()); + else if(curPunc=="[")pushContext(state,"]",stream.column()); + else if(curPunc=="{")pushContext(state,"}",stream.column()); + else if(/[\]\}\)]/.test(curPunc)){ + while(state.context&&state.context.type=="pattern")popContext(state); + if(state.context&&curPunc==state.context.type)popContext(state); + } + else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); + else if(/atom|string|variable/.test(style)&&state.context){ + if(/[\}\]]/.test(state.context.type)) + pushContext(state,"pattern",stream.column()); + else if(state.context.type=="pattern"&&!state.context.align){ + state.context.align=true; + state.context.col=stream.column(); + } + } + return style; + }, + indent:function(state,textAfter){ + var firstChar=textAfter&&textAfter.charAt(0); + var context=state.context; + if(/[\]\}]/.test(firstChar)) + while (context&&context.type=="pattern")context=context.prev; + var closing=context&&firstChar==context.type; + if(!context) + return 0; + else if(context.type=="pattern") + return context.col; + else if(context.align) + return context.col+(closing?0:1); + else + return context.indent+(closing?0:indentUnit); + } + }; +}); +CodeMirror.defineMIME("text/x-q","q"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js new file mode 100644 index 0000000000..de34c201bd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js @@ -0,0 +1,190 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("wordChars", "r", /[\w.]/); + +CodeMirror.defineMode("r", function(config) { + function wordObj(words) { + var res = {}; + for (var i = 0; i < words.length; ++i) res[words[i]] = true; + return res; + } + var commonAtoms = ["NULL", "NA", "Inf", "NaN", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_", "TRUE", "FALSE"]; + var commonBuiltins = ["list", "quote", "bquote", "eval", "return", "call", "parse", "deparse"]; + var commonKeywords = ["if", "else", "repeat", "while", "function", "for", "in", "next", "break"]; + var commonBlockKeywords = ["if", "else", "repeat", "while", "function", "for"]; + + CodeMirror.registerHelper("hintWords", "r", commonAtoms.concat(commonBuiltins, commonKeywords)); + + var atoms = wordObj(commonAtoms); + var builtins = wordObj(commonBuiltins); + var keywords = wordObj(commonKeywords); + var blockkeywords = wordObj(commonBlockKeywords); + var opChars = /[+\-*\/^<>=!&|~$:]/; + var curPunc; + + function tokenBase(stream, state) { + curPunc = null; + var ch = stream.next(); + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "0" && stream.eat("x")) { + stream.eatWhile(/[\da-f]/i); + return "number"; + } else if (ch == "." && stream.eat(/\d/)) { + stream.match(/\d*(?:e[+\-]?\d+)?/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); + return "number"; + } else if (ch == "'" || ch == '"') { + state.tokenize = tokenString(ch); + return "string"; + } else if (ch == "`") { + stream.match(/[^`]+`/); + return "variable-3"; + } else if (ch == "." && stream.match(/.(?:[.]|\d+)/)) { + return "keyword"; + } else if (/[a-zA-Z\.]/.test(ch)) { + stream.eatWhile(/[\w\.]/); + var word = stream.current(); + if (atoms.propertyIsEnumerable(word)) return "atom"; + if (keywords.propertyIsEnumerable(word)) { + // Block keywords start new blocks, except 'else if', which only starts + // one new block for the 'if', no block for the 'else'. + if (blockkeywords.propertyIsEnumerable(word) && + !stream.match(/\s*if(\s+|$)/, false)) + curPunc = "block"; + return "keyword"; + } + if (builtins.propertyIsEnumerable(word)) return "builtin"; + return "variable"; + } else if (ch == "%") { + if (stream.skipTo("%")) stream.next(); + return "operator variable-2"; + } else if ( + (ch == "<" && stream.eat("-")) || + (ch == "<" && stream.match("<-")) || + (ch == "-" && stream.match(/>>?/)) + ) { + return "operator arrow"; + } else if (ch == "=" && state.ctx.argList) { + return "arg-is"; + } else if (opChars.test(ch)) { + if (ch == "$") return "operator dollar"; + stream.eatWhile(opChars); + return "operator"; + } else if (/[\(\){}\[\];]/.test(ch)) { + curPunc = ch; + if (ch == ";") return "semi"; + return null; + } else { + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + if (stream.eat("\\")) { + var ch = stream.next(); + if (ch == "x") stream.match(/^[a-f0-9]{2}/i); + else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); + else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); + else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); + else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); + return "string-2"; + } else { + var next; + while ((next = stream.next()) != null) { + if (next == quote) { state.tokenize = tokenBase; break; } + if (next == "\\") { stream.backUp(1); break; } + } + return "string"; + } + }; + } + + var ALIGN_YES = 1, ALIGN_NO = 2, BRACELESS = 4 + + function push(state, type, stream) { + state.ctx = {type: type, + indent: state.indent, + flags: 0, + column: stream.column(), + prev: state.ctx}; + } + function setFlag(state, flag) { + var ctx = state.ctx + state.ctx = {type: ctx.type, + indent: ctx.indent, + flags: ctx.flags | flag, + column: ctx.column, + prev: ctx.prev} + } + function pop(state) { + state.indent = state.ctx.indent; + state.ctx = state.ctx.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + ctx: {type: "top", + indent: -config.indentUnit, + flags: ALIGN_NO}, + indent: 0, + afterIdent: false}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if ((state.ctx.flags & 3) == 0) state.ctx.flags |= ALIGN_NO + if (state.ctx.flags & BRACELESS) pop(state) + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (style != "comment" && (state.ctx.flags & ALIGN_NO) == 0) setFlag(state, ALIGN_YES) + + if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && state.ctx.type == "block") pop(state); + if (curPunc == "{") push(state, "}", stream); + else if (curPunc == "(") { + push(state, ")", stream); + if (state.afterIdent) state.ctx.argList = true; + } + else if (curPunc == "[") push(state, "]", stream); + else if (curPunc == "block") push(state, "block", stream); + else if (curPunc == state.ctx.type) pop(state); + else if (state.ctx.type == "block" && style != "comment") setFlag(state, BRACELESS) + state.afterIdent = style == "variable" || style == "keyword"; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, + closing = firstChar == ctx.type; + if (ctx.flags & BRACELESS) ctx = ctx.prev + if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.flags & ALIGN_YES) return ctx.column + (closing ? 0 : 1); + else return ctx.indent + (closing ? 0 : config.indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-rsrc", "r"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html new file mode 100644 index 0000000000..9d244ecc85 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html @@ -0,0 +1,66 @@ + + +CodeMirror: RPM changes mode + + + + + + + + + + + +
+

RPM changes mode

+ +
+ + +

MIME types defined: text/x-rpm-changes.

+
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js new file mode 100644 index 0000000000..bb9ec9ffad --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js @@ -0,0 +1,109 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("rpm-changes", function() { + var headerSeparator = /^-+$/; + var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; + var simpleEmail = /^[\w+.-]+@[\w.-]+/; + + return { + token: function(stream) { + if (stream.sol()) { + if (stream.match(headerSeparator)) { return 'tag'; } + if (stream.match(headerLine)) { return 'tag'; } + } + if (stream.match(simpleEmail)) { return 'string'; } + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); + +// Quick and dirty spec file highlighting + +CodeMirror.defineMode("rpm-spec", function() { + var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; + + var preamble = /^[a-zA-Z0-9()]+:/; + var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/; + var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros + var control_flow_simple = /^%(else|endif)/; // rpm control flow macros + var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros + + return { + startState: function () { + return { + controlFlow: false, + macroParameters: false, + section: false + }; + }, + token: function (stream, state) { + var ch = stream.peek(); + if (ch == "#") { stream.skipToEnd(); return "comment"; } + + if (stream.sol()) { + if (stream.match(preamble)) { return "header"; } + if (stream.match(section)) { return "atom"; } + } + + if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' + if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' + + if (stream.match(control_flow_simple)) { return "keyword"; } + if (stream.match(control_flow_complex)) { + state.controlFlow = true; + return "keyword"; + } + if (state.controlFlow) { + if (stream.match(operators)) { return "operator"; } + if (stream.match(/^(\d+)/)) { return "number"; } + if (stream.eol()) { state.controlFlow = false; } + } + + if (stream.match(arch)) { + if (stream.eol()) { state.controlFlow = false; } + return "number"; + } + + // Macros like '%make_install' or '%attr(0775,root,root)' + if (stream.match(/^%[\w]+/)) { + if (stream.match('(')) { state.macroParameters = true; } + return "keyword"; + } + if (state.macroParameters) { + if (stream.match(/^\d+/)) { return "number";} + if (stream.match(')')) { + state.macroParameters = false; + return "keyword"; + } + } + + // Macros like '%{defined fedora}' + if (stream.match(/^%\{\??[\w \-\:\!]+\}/)) { + if (stream.eol()) { state.controlFlow = false; } + return "def"; + } + + //TODO: Include bash script sub-parser (CodeMirror supports that) + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js new file mode 100644 index 0000000000..f14eb270f9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js @@ -0,0 +1,557 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('rst', function (config, options) { + + var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; + var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; + var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; + + var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; + var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; + var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; + + var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; + var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; + var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; + var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); + + var overlay = { + token: function (stream) { + + if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) + return 'strong'; + if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) + return 'em'; + if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) + return 'string-2'; + if (stream.match(rx_number)) + return 'number'; + if (stream.match(rx_positive)) + return 'positive'; + if (stream.match(rx_negative)) + return 'negative'; + if (stream.match(rx_uri)) + return 'link'; + + while (stream.next() != null) { + if (stream.match(rx_strong, false)) break; + if (stream.match(rx_emphasis, false)) break; + if (stream.match(rx_literal, false)) break; + if (stream.match(rx_number, false)) break; + if (stream.match(rx_positive, false)) break; + if (stream.match(rx_negative, false)) break; + if (stream.match(rx_uri, false)) break; + } + + return null; + } + }; + + var mode = CodeMirror.getMode( + config, options.backdrop || 'rst-base' + ); + + return CodeMirror.overlayMode(mode, overlay, true); // combine +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMode('rst-base', function (config) { + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function format(string) { + var args = Array.prototype.slice.call(arguments, 1); + return string.replace(/{(\d+)}/g, function (match, n) { + return typeof args[n] != 'undefined' ? args[n] : match; + }); + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var mode_python = CodeMirror.getMode(config, 'python'); + var mode_stex = CodeMirror.getMode(config, 'stex'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var SEPA = "\\s+"; + var TAIL = "(?:\\s*|\\W|$)", + rx_TAIL = new RegExp(format('^{0}', TAIL)); + + var NAME = + "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", + rx_NAME = new RegExp(format('^{0}', NAME)); + var NAME_WWS = + "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; + var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); + + var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; + var TEXT2 = "(?:[^\\`]+)", + rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); + + var rx_section = new RegExp( + "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); + var rx_explicit = new RegExp( + format('^\\.\\.{0}', SEPA)); + var rx_link = new RegExp( + format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); + var rx_directive = new RegExp( + format('^{0}::{1}', REF_NAME, TAIL)); + var rx_substitution = new RegExp( + format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); + var rx_footnote = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); + var rx_citation = new RegExp( + format('^\\[{0}\\]{1}', REF_NAME, TAIL)); + + var rx_substitution_ref = new RegExp( + format('^\\|{0}\\|', TEXT1)); + var rx_footnote_ref = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); + var rx_citation_ref = new RegExp( + format('^\\[{0}\\]_', REF_NAME)); + var rx_link_ref1 = new RegExp( + format('^{0}__?', REF_NAME)); + var rx_link_ref2 = new RegExp( + format('^`{0}`_', TEXT2)); + + var rx_role_pre = new RegExp( + format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); + var rx_role_suf = new RegExp( + format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); + var rx_role = new RegExp( + format('^:{0}:{1}', NAME, TAIL)); + + var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); + var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); + var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); + var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); + var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); + var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); + var rx_link_head = new RegExp("^_"); + var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); + var rx_link_tail = new RegExp(format('^:{0}', TAIL)); + + var rx_verbatim = new RegExp('^::\\s*$'); + var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_normal(stream, state) { + var token = null; + + if (stream.sol() && stream.match(rx_examples, false)) { + change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } else if (stream.sol() && stream.match(rx_explicit)) { + change(state, to_explicit); + token = 'meta'; + } else if (stream.sol() && stream.match(rx_section)) { + change(state, to_normal); + token = 'header'; + } else if (phase(state) == rx_role_pre || + stream.match(rx_role_pre, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_pre, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_pre, 2)); + stream.match(rx_NAME); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) { + state.tmp_stex = true; + } + break; + case 2: + change(state, to_normal, context(rx_role_pre, 3)); + stream.match(/^:`/); + token = 'meta'; + break; + case 3: + if (state.tmp_stex) { + state.tmp_stex = undefined; state.tmp = { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }; + } + + if (state.tmp) { + if (stream.peek() == '`') { + change(state, to_normal, context(rx_role_pre, 4)); + state.tmp = undefined; + break; + } + + token = state.tmp.mode.token(stream, state.tmp.local); + break; + } + + change(state, to_normal, context(rx_role_pre, 4)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 4: + change(state, to_normal, context(rx_role_pre, 5)); + stream.match(/^`/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_pre, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role_suf || + stream.match(rx_role_suf, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_suf, 1)); + stream.match(/^`/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_suf, 2)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 2: + change(state, to_normal, context(rx_role_suf, 3)); + stream.match(/^`:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role_suf, 4)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 4: + change(state, to_normal, context(rx_role_suf, 5)); + stream.match(/^:/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_suf, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role || stream.match(rx_role, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role, 2)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 2: + change(state, to_normal, context(rx_role, 3)); + stream.match(/^:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role, 4)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_substitution_ref || + stream.match(rx_substitution_ref, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_substitution_ref, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_normal, context(rx_substitution_ref, 2)); + if (stream.match(/^_?_?/)) token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_link_ref1)) { + change(state, to_normal); + if (!stream.peek() || stream.peek().match(/^\W$/)) { + token = 'link'; + } + } else if (phase(state) == rx_link_ref2 || + stream.match(rx_link_ref2, false)) { + + switch (stage(state)) { + case 0: + if (!stream.peek() || stream.peek().match(/^\W$/)) { + change(state, to_normal, context(rx_link_ref2, 1)); + } else { + stream.match(rx_link_ref2); + } + break; + case 1: + change(state, to_normal, context(rx_link_ref2, 2)); + stream.match(/^`/); + token = 'link'; + break; + case 2: + change(state, to_normal, context(rx_link_ref2, 3)); + stream.match(rx_TEXT2); + break; + case 3: + change(state, to_normal, context(rx_link_ref2, 4)); + stream.match(/^`_/); + token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_verbatim)) { + change(state, to_verbatim); + } + + else { + if (stream.next()) change(state, to_normal); + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_explicit(stream, state) { + var token = null; + + if (phase(state) == rx_substitution || + stream.match(rx_substitution, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_substitution, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_explicit, context(rx_substitution, 2)); + stream.match(rx_substitution_sepa); + break; + case 2: + change(state, to_explicit, context(rx_substitution, 3)); + stream.match(rx_substitution_name); + token = 'keyword'; + break; + case 3: + change(state, to_explicit, context(rx_substitution, 4)); + stream.match(rx_substitution_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_directive || + stream.match(rx_directive, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_directive, 1)); + stream.match(rx_directive_name); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) + state.tmp_stex = true; + else if (stream.current().match(/^python/)) + state.tmp_py = true; + break; + case 1: + change(state, to_explicit, context(rx_directive, 2)); + stream.match(rx_directive_tail); + token = 'meta'; + + if (stream.match(/^latex\s*$/) || state.tmp_stex) { + state.tmp_stex = undefined; change(state, to_mode, { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }); + } + break; + case 2: + change(state, to_explicit, context(rx_directive, 3)); + if (stream.match(/^python\s*$/) || state.tmp_py) { + state.tmp_py = undefined; change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_link || stream.match(rx_link, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_link, 1)); + stream.match(rx_link_head); + stream.match(rx_link_name); + token = 'link'; + break; + case 1: + change(state, to_explicit, context(rx_link, 2)); + stream.match(rx_link_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation)) { + change(state, to_normal); + token = 'quote'; + } + + else { + stream.eatSpace(); + if (stream.eol()) { + change(state, to_normal); + } else { + stream.skipToEnd(); + change(state, to_comment); + token = 'comment'; + } + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_comment(stream, state) { + return as_block(stream, state, 'comment'); + } + + function to_verbatim(stream, state) { + return as_block(stream, state, 'meta'); + } + + function as_block(stream, state, token) { + if (stream.eol() || stream.eatSpace()) { + stream.skipToEnd(); + return token; + } else { + change(state, to_normal); + return null; + } + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_mode(stream, state) { + + if (state.ctx.mode && state.ctx.local) { + + if (stream.sol()) { + if (!stream.eatSpace()) change(state, to_normal); + return null; + } + + return state.ctx.mode.token(stream, state.ctx.local); + } + + change(state, to_normal); + return null; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function context(phase, stage, mode, local) { + return {phase: phase, stage: stage, mode: mode, local: local}; + } + + function change(state, tok, ctx) { + state.tok = tok; + state.ctx = ctx || {}; + } + + function stage(state) { + return state.ctx.stage || 0; + } + + function phase(state) { + return state.ctx.phase; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + return { + startState: function () { + return {tok: to_normal, ctx: context(undefined, 0)}; + }, + + copyState: function (state) { + var ctx = state.ctx, tmp = state.tmp; + if (ctx.local) + ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; + if (tmp) + tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; + return {tok: state.tok, ctx: ctx, tmp: tmp}; + }, + + innerMode: function (state) { + return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} + : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} + : null; + }, + + token: function (stream, state) { + return state.tok(stream, state); + } + }; +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMIME('text/x-rst', 'rst'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js new file mode 100644 index 0000000000..85bbfc657f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js @@ -0,0 +1,303 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; +} + +var keywordList = [ + "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", + "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", + "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", + "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", + "caller", "lambda", "proc", "public", "protected", "private", "require", "load", + "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" +], keywords = wordObj(keywordList); + +var indentWords = wordObj(["def", "class", "case", "for", "while", "until", "module", "then", + "catch", "loop", "proc", "begin"]); +var dedentWords = wordObj(["end", "until"]); +var opening = {"[": "]", "{": "}", "(": ")"}; +var closing = {"]": "[", "}": "{", ")": "("}; + +CodeMirror.defineMode("ruby", function(config) { + var curPunc; + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + if (stream.sol() && stream.match("=begin") && stream.eol()) { + state.tokenize.push(readBlockComment); + return "comment"; + } + if (stream.eatSpace()) return null; + var ch = stream.next(), m; + if (ch == "`" || ch == "'" || ch == '"') { + return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); + } else if (ch == "/") { + if (regexpAhead(stream)) + return chain(readQuoted(ch, "string-2", true), stream, state); + else + return "operator"; + } else if (ch == "%") { + var style = "string", embed = true; + if (stream.eat("s")) style = "atom"; + else if (stream.eat(/[WQ]/)) style = "string"; + else if (stream.eat(/[r]/)) style = "string-2"; + else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } + var delim = stream.eat(/[^\w\s=]/); + if (!delim) return "operator"; + if (opening.propertyIsEnumerable(delim)) delim = opening[delim]; + return chain(readQuoted(delim, style, embed, true), stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "<" && (m = stream.match(/^<([-~])[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { + return chain(readHereDoc(m[2], m[1]), stream, state); + } else if (ch == "0") { + if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); + else if (stream.eat("b")) stream.eatWhile(/[01]/); + else stream.eatWhile(/[0-7]/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); + return "number"; + } else if (ch == "?") { + while (stream.match(/^\\[CM]-/)) {} + if (stream.eat("\\")) stream.eatWhile(/\w/); + else stream.next(); + return "string"; + } else if (ch == ":") { + if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); + if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); + + // :> :>> :< :<< are valid symbols + if (stream.eat(/[\<\>]/)) { + stream.eat(/[\<\>]/); + return "atom"; + } + + // :+ :- :/ :* :| :& :! are valid symbols + if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { + return "atom"; + } + + // Symbols can't start by a digit + if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { + stream.eatWhile(/[\w$\xa1-\uffff]/); + // Only one ? ! = is allowed and only as the last character + stream.eat(/[\?\!\=]/); + return "atom"; + } + return "operator"; + } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { + stream.eat("@"); + stream.eatWhile(/[\w\xa1-\uffff]/); + return "variable-2"; + } else if (ch == "$") { + if (stream.eat(/[a-zA-Z_]/)) { + stream.eatWhile(/[\w]/); + } else if (stream.eat(/\d/)) { + stream.eat(/\d/); + } else { + stream.next(); // Must be a special global like $: or $! + } + return "variable-3"; + } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + stream.eat(/[\?\!]/); + if (stream.eat(":")) return "atom"; + return "ident"; + } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { + curPunc = "|"; + return null; + } else if (/[\(\)\[\]{}\\;]/.test(ch)) { + curPunc = ch; + return null; + } else if (ch == "-" && stream.eat(">")) { + return "arrow"; + } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { + var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); + if (ch == "." && !more) curPunc = "."; + return "operator"; + } else { + return null; + } + } + + function regexpAhead(stream) { + var start = stream.pos, depth = 0, next, found = false, escaped = false + while ((next = stream.next()) != null) { + if (!escaped) { + if ("[{(".indexOf(next) > -1) { + depth++ + } else if ("]})".indexOf(next) > -1) { + depth-- + if (depth < 0) break + } else if (next == "/" && depth == 0) { + found = true + break + } + escaped = next == "\\" + } else { + escaped = false + } + } + stream.backUp(stream.pos - start) + return found + } + + function tokenBaseUntilBrace(depth) { + if (!depth) depth = 1; + return function(stream, state) { + if (stream.peek() == "}") { + if (depth == 1) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } else { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); + } + } else if (stream.peek() == "{") { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); + } + return tokenBase(stream, state); + }; + } + function tokenBaseOnce() { + var alreadyCalled = false; + return function(stream, state) { + if (alreadyCalled) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + alreadyCalled = true; + return tokenBase(stream, state); + }; + } + function readQuoted(quote, style, embed, unescaped) { + return function(stream, state) { + var escaped = false, ch; + + if (state.context.type === 'read-quoted-paused') { + state.context = state.context.prev; + stream.eat("}"); + } + + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + if (embed && ch == "#" && !escaped) { + if (stream.eat("{")) { + if (quote == "}") { + state.context = {prev: state.context, type: 'read-quoted-paused'}; + } + state.tokenize.push(tokenBaseUntilBrace()); + break; + } else if (/[@\$]/.test(stream.peek())) { + state.tokenize.push(tokenBaseOnce()); + break; + } + } + escaped = !escaped && ch == "\\"; + } + return style; + }; + } + function readHereDoc(phrase, mayIndent) { + return function(stream, state) { + if (mayIndent) stream.eatSpace() + if (stream.match(phrase)) state.tokenize.pop(); + else stream.skipToEnd(); + return "string"; + }; + } + function readBlockComment(stream, state) { + if (stream.sol() && stream.match("=end") && stream.eol()) + state.tokenize.pop(); + stream.skipToEnd(); + return "comment"; + } + + return { + startState: function() { + return {tokenize: [tokenBase], + indented: 0, + context: {type: "top", indented: -config.indentUnit}, + continuedLine: false, + lastTok: null, + varList: false}; + }, + + token: function(stream, state) { + curPunc = null; + if (stream.sol()) state.indented = stream.indentation(); + var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; + var thisTok = curPunc; + if (style == "ident") { + var word = stream.current(); + style = state.lastTok == "." ? "property" + : keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : /^[A-Z]/.test(word) ? "tag" + : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" + : "variable"; + if (style == "keyword") { + thisTok = word; + if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; + else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; + else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) + kwtype = "indent"; + else if (word == "do" && state.context.indented < state.indented) + kwtype = "indent"; + } + } + if (curPunc || (style && style != "comment")) state.lastTok = thisTok; + if (curPunc == "|") state.varList = !state.varList; + + if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) + state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; + else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) + state.context = state.context.prev; + + if (stream.eol()) + state.continuedLine = (curPunc == "\\" || style == "operator"); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize[state.tokenize.length-1] != tokenBase) return CodeMirror.Pass; + var firstChar = textAfter && textAfter.charAt(0); + var ct = state.context; + var closed = ct.type == closing[firstChar] || + ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); + return ct.indented + (closed ? 0 : config.indentUnit) + + (state.continuedLine ? config.indentUnit : 0); + }, + + electricInput: /^\s*(?:end|rescue|elsif|else|\})$/, + lineComment: "#", + fold: "indent" + }; +}); + +CodeMirror.defineMIME("text/x-ruby", "ruby"); + +CodeMirror.registerHelper("hintWords", "ruby", keywordList); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js new file mode 100644 index 0000000000..f95f320d08 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineSimpleMode("rust",{ + start: [ + // string and byte string + {regex: /b?"/, token: "string", next: "string"}, + // raw string and raw byte string + {regex: /b?r"/, token: "string", next: "string_raw"}, + {regex: /b?r#+"/, token: "string", next: "string_raw_hash"}, + // character + {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"}, + // byte + {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"}, + + {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/, + token: "number"}, + {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type|union)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]}, + {regex: /(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"}, + {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"}, + {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"}, + {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, + token: ["keyword", null ,"def"]}, + {regex: /#!?\[.*\]/, token: "meta"}, + {regex: /\/\/.*/, token: "comment"}, + {regex: /\/\*/, token: "comment", next: "comment"}, + {regex: /[-+\/*=<>!]+/, token: "operator"}, + {regex: /[a-zA-Z_]\w*!/,token: "variable-3"}, + {regex: /[a-zA-Z_]\w*/, token: "variable"}, + {regex: /[\{\[\(]/, indent: true}, + {regex: /[\}\]\)]/, dedent: true} + ], + string: [ + {regex: /"/, token: "string", next: "start"}, + {regex: /(?:[^\\"]|\\(?:.|$))*/, token: "string"} + ], + string_raw: [ + {regex: /"/, token: "string", next: "start"}, + {regex: /[^"]*/, token: "string"} + ], + string_raw_hash: [ + {regex: /"#+/, token: "string", next: "start"}, + {regex: /(?:[^"]|"(?!#))*/, token: "string"} + ], + comment: [ + {regex: /.*?\*\//, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"} + ], + meta: { + dontIndentStates: ["comment"], + electricInput: /^\s*\}$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + } +}); + + +CodeMirror.defineMIME("text/x-rustsrc", "rust"); +CodeMirror.defineMIME("text/rust", "rust"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js new file mode 100644 index 0000000000..49b96b66de --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js @@ -0,0 +1,303 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + + +// SAS mode copyright (c) 2016 Jared Dean, SAS Institute +// Created by Jared Dean + +// TODO +// indent and de-indent +// identify macro variables + + +//Definitions +// comment -- text within * ; or /* */ +// keyword -- SAS language variable +// variable -- macro variables starts with '&' or variable formats +// variable-2 -- DATA Step, proc, or macro names +// string -- text within ' ' or " " +// operator -- numeric operator + / - * ** le eq ge ... and so on +// builtin -- proc %macro data run mend +// atom +// def + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("sas", function () { + var words = {}; + var isDoubleOperatorSym = { + eq: 'operator', + lt: 'operator', + le: 'operator', + gt: 'operator', + ge: 'operator', + "in": 'operator', + ne: 'operator', + or: 'operator' + }; + var isDoubleOperatorChar = /(<=|>=|!=|<>)/; + var isSingleOperatorChar = /[=\(:\),{}.*<>+\-\/^\[\]]/; + + // Takes a string of words separated by spaces and adds them as + // keys with the value of the first argument 'style' + function define(style, string, context) { + if (context) { + var split = string.split(' '); + for (var i = 0; i < split.length; i++) { + words[split[i]] = {style: style, state: context}; + } + } + } + //datastep + define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']); + define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']); + define('def', 'label format _n_ _error_', ['inDataStep']); + define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']); + define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']); + define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']); + define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']); + define('def', 'put putc putn', ['inDataStep']); + define('builtin', 'data run', ['inDataStep']); + + + //proc + define('def', 'data', ['inProc']); + + // flow control for macros + define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']); + + //everywhere + define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']); + + define('def', 'footnote title libname ods', ['ALL']); + define('def', '%let %put %global %sysfunc %eval ', ['ALL']); + // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm + define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']); + + //footnote[1-9]? title[1-9]? + + //options statement + define('def', 'source2 nosource2 page pageno pagesize', ['ALL']); + + //proc and datastep + define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddfm ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau random ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni rcorr read recfm register regr remote remove rename repeat repeated replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover sub subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']); + define('operator', 'and not ', ['inDataStep', 'inProc']); + + // Main function + function tokenize(stream, state) { + // Finally advance the stream + var ch = stream.next(); + + // BLOCKCOMMENT + if (ch === '/' && stream.eat('*')) { + state.continueComment = true; + return "comment"; + } else if (state.continueComment === true) { // in comment block + //comment ends at the beginning of the line + if (ch === '*' && stream.peek() === '/') { + stream.next(); + state.continueComment = false; + } else if (stream.skipTo('*')) { //comment is potentially later in line + stream.skipTo('*'); + stream.next(); + if (stream.eat('/')) + state.continueComment = false; + } else { + stream.skipToEnd(); + } + return "comment"; + } + + if (ch == "*" && stream.column() == stream.indentation()) { + stream.skipToEnd() + return "comment" + } + + // DoubleOperator match + var doubleOperator = ch + stream.peek(); + + if ((ch === '"' || ch === "'") && !state.continueString) { + state.continueString = ch + return "string" + } else if (state.continueString) { + if (state.continueString == ch) { + state.continueString = null; + } else if (stream.skipTo(state.continueString)) { + // quote found on this line + stream.next(); + state.continueString = null; + } else { + stream.skipToEnd(); + } + return "string"; + } else if (state.continueString !== null && stream.eol()) { + stream.skipTo(state.continueString) || stream.skipToEnd(); + return "string"; + } else if (/[\d\.]/.test(ch)) { //find numbers + if (ch === ".") + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + else if (ch === "0") + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + else + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + return "number"; + } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS + stream.next(); + return "operator"; + } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) { + stream.next(); + if (stream.peek() === ' ') + return isDoubleOperatorSym[doubleOperator.toLowerCase()]; + } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS + return "operator"; + } + + // Matches one whole word -- even if the word is a character + var word; + if (stream.match(/[%&;\w]+/, false) != null) { + word = ch + stream.match(/[%&;\w]+/, true); + if (/&/.test(word)) return 'variable' + } else { + word = ch; + } + // the word after DATA PROC or MACRO + if (state.nextword) { + stream.match(/[\w]+/); + // match memname.libname + if (stream.peek() === '.') stream.skipTo(' '); + state.nextword = false; + return 'variable-2'; + } + + word = word.toLowerCase() + // Are we in a DATA Step? + if (state.inDataStep) { + if (word === 'run;' || stream.match(/run\s;/)) { + state.inDataStep = false; + return 'builtin'; + } + // variable formats + if ((word) && stream.next() === '.') { + //either a format or libname.memname + if (/\w/.test(stream.peek())) return 'variable-2'; + else return 'variable'; + } + // do we have a DATA Step keyword + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inDataStep") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + //backup to the start of the word + if (stream.start < stream.pos) + stream.backUp(stream.pos - stream.start); + //advance the length of the word and return + for (var i = 0; i < word.length; ++i) stream.next(); + return words[word].style; + } + } + // Are we in an Proc statement? + if (state.inProc) { + if (word === 'run;' || word === 'quit;') { + state.inProc = false; + return 'builtin'; + } + // do we have a proc keyword + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inProc") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + stream.match(/[\w]+/); + return words[word].style; + } + } + // Are we in a Macro statement? + if (state.inMacro) { + if (word === '%mend') { + if (stream.peek() === ';') stream.next(); + state.inMacro = false; + return 'builtin'; + } + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inMacro") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + stream.match(/[\w]+/); + return words[word].style; + } + + return 'atom'; + } + // Do we have Keywords specific words? + if (word && words.hasOwnProperty(word)) { + // Negates the initial next() + stream.backUp(1); + // Actually move the stream + stream.match(/[\w]+/); + if (word === 'data' && /=/.test(stream.peek()) === false) { + state.inDataStep = true; + state.nextword = true; + return 'builtin'; + } + if (word === 'proc') { + state.inProc = true; + state.nextword = true; + return 'builtin'; + } + if (word === '%macro') { + state.inMacro = true; + state.nextword = true; + return 'builtin'; + } + if (/title[1-9]/.test(word)) return 'def'; + + if (word === 'footnote') { + stream.eat(/[1-9]/); + return 'def'; + } + + // Returns their value as state in the prior define methods + if (state.inDataStep === true && words[word].state.indexOf("inDataStep") !== -1) + return words[word].style; + if (state.inProc === true && words[word].state.indexOf("inProc") !== -1) + return words[word].style; + if (state.inMacro === true && words[word].state.indexOf("inMacro") !== -1) + return words[word].style; + if (words[word].state.indexOf("ALL") !== -1) + return words[word].style; + return null; + } + // Unrecognized syntax + return null; + } + + return { + startState: function () { + return { + inDataStep: false, + inProc: false, + inMacro: false, + nextword: false, + continueString: null, + continueComment: false + }; + }, + token: function (stream, state) { + // Strip the spaces, but regex will account for them either way + if (stream.eatSpace()) return null; + // Go through the main process + return tokenize(stream, state); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; + + }); + + CodeMirror.defineMIME("text/x-sas", "sas"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js new file mode 100644 index 0000000000..d8427bff57 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js @@ -0,0 +1,459 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sass", function(config) { + var cssMode = CodeMirror.mimeModes["text/css"]; + var propertyKeywords = cssMode.propertyKeywords || {}, + colorKeywords = cssMode.colorKeywords || {}, + valueKeywords = cssMode.valueKeywords || {}, + fontProperties = cssMode.fontProperties || {}; + + function tokenRegexp(words) { + return new RegExp("^" + words.join("|")); + } + + var keywords = ["true", "false", "null", "auto"]; + var keywordsRegexp = new RegExp("^" + keywords.join("|")); + + var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", + "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; + var opRegexp = tokenRegexp(operators); + + var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; + + var word; + + function isEndLine(stream) { + return !stream.peek() || stream.match(/\s+$/, false); + } + + function urlTokens(stream, state) { + var ch = stream.peek(); + + if (ch === ")") { + stream.next(); + state.tokenizer = tokenBase; + return "operator"; + } else if (ch === "(") { + stream.next(); + stream.eatSpace(); + + return "operator"; + } else if (ch === "'" || ch === '"') { + state.tokenizer = buildStringTokenizer(stream.next()); + return "string"; + } else { + state.tokenizer = buildStringTokenizer(")", false); + return "string"; + } + } + function comment(indentation, multiLine) { + return function(stream, state) { + if (stream.sol() && stream.indentation() <= indentation) { + state.tokenizer = tokenBase; + return tokenBase(stream, state); + } + + if (multiLine && stream.skipTo("*/")) { + stream.next(); + stream.next(); + state.tokenizer = tokenBase; + } else { + stream.skipToEnd(); + } + + return "comment"; + }; + } + + function buildStringTokenizer(quote, greedy) { + if (greedy == null) { greedy = true; } + + function stringTokenizer(stream, state) { + var nextChar = stream.next(); + var peekChar = stream.peek(); + var previousChar = stream.string.charAt(stream.pos-2); + + var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); + + if (endingString) { + if (nextChar !== quote && greedy) { stream.next(); } + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + state.tokenizer = tokenBase; + return "string"; + } else if (nextChar === "#" && peekChar === "{") { + state.tokenizer = buildInterpolationTokenizer(stringTokenizer); + stream.next(); + return "operator"; + } else { + return "string"; + } + } + + return stringTokenizer; + } + + function buildInterpolationTokenizer(currentTokenizer) { + return function(stream, state) { + if (stream.peek() === "}") { + stream.next(); + state.tokenizer = currentTokenizer; + return "operator"; + } else { + return tokenBase(stream, state); + } + }; + } + + function indent(state) { + if (state.indentCount == 0) { + state.indentCount++; + var lastScopeOffset = state.scopes[0].offset; + var currentOffset = lastScopeOffset + config.indentUnit; + state.scopes.unshift({ offset:currentOffset }); + } + } + + function dedent(state) { + if (state.scopes.length == 1) return; + + state.scopes.shift(); + } + + function tokenBase(stream, state) { + var ch = stream.peek(); + + // Comment + if (stream.match("/*")) { + state.tokenizer = comment(stream.indentation(), true); + return state.tokenizer(stream, state); + } + if (stream.match("//")) { + state.tokenizer = comment(stream.indentation(), false); + return state.tokenizer(stream, state); + } + + // Interpolation + if (stream.match("#{")) { + state.tokenizer = buildInterpolationTokenizer(tokenBase); + return "operator"; + } + + // Strings + if (ch === '"' || ch === "'") { + stream.next(); + state.tokenizer = buildStringTokenizer(ch); + return "string"; + } + + if(!state.cursorHalf){// state.cursorHalf === 0 + // first half i.e. before : for key-value pairs + // including selectors + + if (ch === "-") { + if (stream.match(/^-\w+-/)) { + return "meta"; + } + } + + if (ch === ".") { + stream.next(); + if (stream.match(/^[\w-]+/)) { + indent(state); + return "qualifier"; + } else if (stream.peek() === "#") { + indent(state); + return "tag"; + } + } + + if (ch === "#") { + stream.next(); + // ID selectors + if (stream.match(/^[\w-]+/)) { + indent(state); + return "builtin"; + } + if (stream.peek() === "#") { + indent(state); + return "tag"; + } + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "variable-2"; + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)) + return "number"; + + // Units + if (stream.match(/^(px|em|in)\b/)) + return "unit"; + + if (stream.match(keywordsRegexp)) + return "keyword"; + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + return "atom"; + } + + if (ch === "=") { + // Match shortcut mixin definition + if (stream.match(/^=[\w-]+/)) { + indent(state); + return "meta"; + } + } + + if (ch === "+") { + // Match shortcut mixin definition + if (stream.match(/^\+[\w-]+/)){ + return "variable-3"; + } + } + + if(ch === "@"){ + if(stream.match('@extend')){ + if(!stream.match(/\s*[\w]/)) + dedent(state); + } + } + + + // Indent Directives + if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { + indent(state); + return "def"; + } + + // Other Directives + if (ch === "@") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "def"; + } + + if (stream.eatWhile(/[\w-]/)){ + if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ + word = stream.current().toLowerCase(); + var prop = state.prevProp + "-" + word; + if (propertyKeywords.hasOwnProperty(prop)) { + return "property"; + } else if (propertyKeywords.hasOwnProperty(word)) { + state.prevProp = word; + return "property"; + } else if (fontProperties.hasOwnProperty(word)) { + return "property"; + } + return "tag"; + } + else if(stream.match(/ *:/,false)){ + indent(state); + state.cursorHalf = 1; + state.prevProp = stream.current().toLowerCase(); + return "property"; + } + else if(stream.match(/ *,/,false)){ + return "tag"; + } + else{ + indent(state); + return "tag"; + } + } + + if(ch === ":"){ + if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element + return "variable-3"; + } + stream.next(); + state.cursorHalf=1; + return "operator"; + } + + } // cursorHalf===0 ends here + else{ + + if (ch === "#") { + stream.next(); + // Hex numbers + if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "number"; + } + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "number"; + } + + // Units + if (stream.match(/^(px|em|in)\b/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "unit"; + } + + if (stream.match(keywordsRegexp)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "keyword"; + } + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "atom"; + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "variable-2"; + } + + // bang character for !important, !default, etc. + if (ch === "!") { + stream.next(); + state.cursorHalf = 0; + return stream.match(/^[\w]+/) ? "keyword": "operator"; + } + + if (stream.match(opRegexp)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "operator"; + } + + // attributes + if (stream.eatWhile(/[\w-]/)) { + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + word = stream.current().toLowerCase(); + if (valueKeywords.hasOwnProperty(word)) { + return "atom"; + } else if (colorKeywords.hasOwnProperty(word)) { + return "keyword"; + } else if (propertyKeywords.hasOwnProperty(word)) { + state.prevProp = stream.current().toLowerCase(); + return "property"; + } else { + return "tag"; + } + } + + //stream.eatSpace(); + if (isEndLine(stream)) { + state.cursorHalf = 0; + return null; + } + + } // else ends here + + if (stream.match(opRegexp)) + return "operator"; + + // If we haven't returned by now, we move 1 character + // and return an error + stream.next(); + return null; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.indentCount = 0; + var style = state.tokenizer(stream, state); + var current = stream.current(); + + if (current === "@return" || current === "}"){ + dedent(state); + } + + if (style !== null) { + var startOfToken = stream.pos - current.length; + + var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); + + var newScopes = []; + + for (var i = 0; i < state.scopes.length; i++) { + var scope = state.scopes[i]; + + if (scope.offset <= withCurrentIndent) + newScopes.push(scope); + } + + state.scopes = newScopes; + } + + + return style; + } + + return { + startState: function() { + return { + tokenizer: tokenBase, + scopes: [{offset: 0, type: "sass"}], + indentCount: 0, + cursorHalf: 0, // cursor half tells us if cursor lies after (1) + // or before (0) colon (well... more or less) + definedVars: [], + definedMixins: [] + }; + }, + token: function(stream, state) { + var style = tokenLexer(stream, state); + + state.lastToken = { style: style, content: stream.current() }; + + return style; + }, + + indent: function(state) { + return state.scopes[0].offset; + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "indent" + }; +}, "css"); + +CodeMirror.defineMIME("text/x-sass", "sass"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js new file mode 100644 index 0000000000..d11a132df3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js @@ -0,0 +1,284 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Author: Koh Zi Han, based on implementation by Koh Zi Chun + * Improved by: Jakub T. Jankiewicz + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("scheme", function () { + var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", + SYMBOL = "symbol", ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; + var INDENT_WORD_SKIP = 2; + + function makeKeywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = makeKeywords("λ case-lambda call/cc class cond-expand define-class define-values exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); + var indentKeys = makeKeywords("define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax let-values let*-values define-syntax syntax-rules define-values when unless"); + + function stateStack(indent, type, prev) { // represents a state stack object + this.indent = indent; + this.type = type; + this.prev = prev; + } + + function pushStack(state, indent, type) { + state.indentStack = new stateStack(indent, type, state.indentStack); + } + + function popStack(state) { + state.indentStack = state.indentStack.prev; + } + + var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); + var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); + var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); + var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); + + function isBinaryNumber (stream) { + return stream.match(binaryMatcher); + } + + function isOctalNumber (stream) { + return stream.match(octalMatcher); + } + + function isDecimalNumber (stream, backup) { + if (backup === true) { + stream.backUp(1); + } + return stream.match(decimalMatcher); + } + + function isHexNumber (stream) { + return stream.match(hexMatcher); + } + + function processEscapedSequence(stream, options) { + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next == options.token && !escaped) { + + options.state.mode = false; + break; + } + escaped = !escaped && next == "\\"; + } + } + + return { + startState: function () { + return { + indentStack: null, + indentation: 0, + mode: false, + sExprComment: false, + sExprQuote: false + }; + }, + + token: function (stream, state) { + if (state.indentStack == null && stream.sol()) { + // update indentation, but only if indentStack is empty + state.indentation = stream.indentation(); + } + + // skip spaces + if (stream.eatSpace()) { + return null; + } + var returnType = null; + + switch(state.mode){ + case "string": // multi-line string parsing mode + processEscapedSequence(stream, { + token: "\"", + state: state + }); + returnType = STRING; // continue on in scheme-string mode + break; + case "symbol": // escape symbol + processEscapedSequence(stream, { + token: "|", + state: state + }); + returnType = SYMBOL; // continue on in scheme-symbol mode + break; + case "comment": // comment parsing mode + var next, maybeEnd = false; + while ((next = stream.next()) != null) { + if (next == "#" && maybeEnd) { + + state.mode = false; + break; + } + maybeEnd = (next == "|"); + } + returnType = COMMENT; + break; + case "s-expr-comment": // s-expr commenting mode + state.mode = false; + if(stream.peek() == "(" || stream.peek() == "["){ + // actually start scheme s-expr commenting mode + state.sExprComment = 0; + }else{ + // if not we just comment the entire of the next token + stream.eatWhile(/[^\s\(\)\[\]]/); // eat symbol atom + returnType = COMMENT; + break; + } + default: // default parsing mode + var ch = stream.next(); + + if (ch == "\"") { + state.mode = "string"; + returnType = STRING; + + } else if (ch == "'") { + if (stream.peek() == "(" || stream.peek() == "["){ + if (typeof state.sExprQuote != "number") { + state.sExprQuote = 0; + } // else already in a quoted expression + returnType = ATOM; + } else { + stream.eatWhile(/[\w_\-!$%&*+\.\/:<=>?@\^~]/); + returnType = ATOM; + } + } else if (ch == '|') { + state.mode = "symbol"; + returnType = SYMBOL; + } else if (ch == '#') { + if (stream.eat("|")) { // Multi-line comment + state.mode = "comment"; // toggle to comment mode + returnType = COMMENT; + } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) + returnType = ATOM; + } else if (stream.eat(';')) { // S-Expr comment + state.mode = "s-expr-comment"; + returnType = COMMENT; + } else { + var numTest = null, hasExactness = false, hasRadix = true; + if (stream.eat(/[ei]/i)) { + hasExactness = true; + } else { + stream.backUp(1); // must be radix specifier + } + if (stream.match(/^#b/i)) { + numTest = isBinaryNumber; + } else if (stream.match(/^#o/i)) { + numTest = isOctalNumber; + } else if (stream.match(/^#x/i)) { + numTest = isHexNumber; + } else if (stream.match(/^#d/i)) { + numTest = isDecimalNumber; + } else if (stream.match(/^[-+0-9.]/, false)) { + hasRadix = false; + numTest = isDecimalNumber; + // re-consume the initial # if all matches failed + } else if (!hasExactness) { + stream.eat('#'); + } + if (numTest != null) { + if (hasRadix && !hasExactness) { + // consume optional exactness after radix + stream.match(/^#[ei]/i); + } + if (numTest(stream)) + returnType = NUMBER; + } + } + } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal + returnType = NUMBER; + } else if (ch == ";") { // comment + stream.skipToEnd(); // rest of the line is a comment + returnType = COMMENT; + } else if (ch == "(" || ch == "[") { + var keyWord = ''; var indentTemp = stream.column(), letter; + /** + Either + (indent-word .. + (non-indent-word .. + (;something else, bracket, etc. + */ + + while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { + keyWord += letter; + } + + if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word + + pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); + } else { // non-indent word + // we continue eating the spaces + stream.eatSpace(); + if (stream.eol() || stream.peek() == ";") { + // nothing significant after + // we restart indentation 1 space after + pushStack(state, indentTemp + 1, ch); + } else { + pushStack(state, indentTemp + stream.current().length, ch); // else we match + } + } + stream.backUp(stream.current().length - 1); // undo all the eating + + if(typeof state.sExprComment == "number") state.sExprComment++; + if(typeof state.sExprQuote == "number") state.sExprQuote++; + + returnType = BRACKET; + } else if (ch == ")" || ch == "]") { + returnType = BRACKET; + if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { + popStack(state); + + if(typeof state.sExprComment == "number"){ + if(--state.sExprComment == 0){ + returnType = COMMENT; // final closing bracket + state.sExprComment = false; // turn off s-expr commenting mode + } + } + if(typeof state.sExprQuote == "number"){ + if(--state.sExprQuote == 0){ + returnType = ATOM; // final closing bracket + state.sExprQuote = false; // turn off s-expr quote mode + } + } + } + } else { + stream.eatWhile(/[\w_\-!$%&*+\.\/:<=>?@\^~]/); + + if (keywords && keywords.propertyIsEnumerable(stream.current())) { + returnType = BUILTIN; + } else returnType = "variable"; + } + } + return (typeof state.sExprComment == "number") ? COMMENT : ((typeof state.sExprQuote == "number") ? ATOM : returnType); + }, + + indent: function (state) { + if (state.indentStack == null) return state.indentation; + return state.indentStack.indent; + }, + + fold: "brace-paren", + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;" + }; +}); + +CodeMirror.defineMIME("text/x-scheme", "scheme"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js new file mode 100644 index 0000000000..8271485f5f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js @@ -0,0 +1,168 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('shell', function() { + + var words = {}; + function define(style, dict) { + for(var i = 0; i < dict.length; i++) { + words[dict[i]] = style; + } + }; + + var commonAtoms = ["true", "false"]; + var commonKeywords = ["if", "then", "do", "else", "elif", "while", "until", "for", "in", "esac", "fi", + "fin", "fil", "done", "exit", "set", "unset", "export", "function"]; + var commonCommands = ["ab", "awk", "bash", "beep", "cat", "cc", "cd", "chown", "chmod", "chroot", "clear", + "cp", "curl", "cut", "diff", "echo", "find", "gawk", "gcc", "get", "git", "grep", "hg", "kill", "killall", + "ln", "ls", "make", "mkdir", "openssl", "mv", "nc", "nl", "node", "npm", "ping", "ps", "restart", "rm", + "rmdir", "sed", "service", "sh", "shopt", "shred", "source", "sort", "sleep", "ssh", "start", "stop", + "su", "sudo", "svn", "tee", "telnet", "top", "touch", "vi", "vim", "wall", "wc", "wget", "who", "write", + "yes", "zsh"]; + + CodeMirror.registerHelper("hintWords", "shell", commonAtoms.concat(commonKeywords, commonCommands)); + + define('atom', commonAtoms); + define('keyword', commonKeywords); + define('builtin', commonCommands); + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + return null; + } + if (ch === '\'' || ch === '"' || ch === '`') { + state.tokens.unshift(tokenString(ch, ch === "`" ? "quote" : "string")); + return tokenize(stream, state); + } + if (ch === '#') { + if (sol && stream.eat('!')) { + stream.skipToEnd(); + return 'meta'; // 'comment'? + } + stream.skipToEnd(); + return 'comment'; + } + if (ch === '$') { + state.tokens.unshift(tokenDollar); + return tokenize(stream, state); + } + if (ch === '+' || ch === '=') { + return 'operator'; + } + if (ch === '-') { + stream.eat('-'); + stream.eatWhile(/\w/); + return 'attribute'; + } + if (ch == "<") { + if (stream.match("<<")) return "operator" + var heredoc = stream.match(/^<-?\s*['"]?([^'"]*)['"]?/) + if (heredoc) { + state.tokens.unshift(tokenHeredoc(heredoc[1])) + return 'string-2' + } + } + if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + if(stream.eol() || !/\w/.test(stream.peek())) { + return 'number'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenString(quote, style) { + var close = quote == "(" ? ")" : quote == "{" ? "}" : quote + return function(stream, state) { + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next === close && !escaped) { + state.tokens.shift(); + break; + } else if (next === '$' && !escaped && quote !== "'" && stream.peek() != close) { + escaped = true; + stream.backUp(1); + state.tokens.unshift(tokenDollar); + break; + } else if (!escaped && quote !== close && next === quote) { + state.tokens.unshift(tokenString(quote, style)) + return tokenize(stream, state) + } else if (!escaped && /['"]/.test(next) && !/['"]/.test(quote)) { + state.tokens.unshift(tokenStringStart(next, "string")); + stream.backUp(1); + break; + } + escaped = !escaped && next === '\\'; + } + return style; + }; + }; + + function tokenStringStart(quote, style) { + return function(stream, state) { + state.tokens[0] = tokenString(quote, style) + stream.next() + return tokenize(stream, state) + } + } + + var tokenDollar = function(stream, state) { + if (state.tokens.length > 1) stream.eat('$'); + var ch = stream.next() + if (/['"({]/.test(ch)) { + state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string"); + return tokenize(stream, state); + } + if (!/\d/.test(ch)) stream.eatWhile(/\w/); + state.tokens.shift(); + return 'def'; + }; + + function tokenHeredoc(delim) { + return function(stream, state) { + if (stream.sol() && stream.string == delim) state.tokens.shift() + stream.skipToEnd() + return "string-2" + } + } + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + }, + closeBrackets: "()[]{}''\"\"``", + lineComment: '#', + fold: "brace" + }; +}); + +CodeMirror.defineMIME('text/x-sh', 'shell'); +// Apache uses a slightly different Media Type for Shell scripts +// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +CodeMirror.defineMIME('application/x-sh', 'shell'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js new file mode 100644 index 0000000000..b7236401a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sieve", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words("if elsif else stop require"); + var atoms = words("true false not"); + var indentUnit = config.indentUnit; + + function tokenBase(stream, state) { + + var ch = stream.next(); + if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + + if (ch === '#') { + stream.skipToEnd(); + return "comment"; + } + + if (ch == "\"") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + + if (ch == "(") { + state._indent.push("("); + // add virtual angel wings so that editor behaves... + // ...more sane in case of broken brackets + state._indent.push("{"); + return null; + } + + if (ch === "{") { + state._indent.push("{"); + return null; + } + + if (ch == ")") { + state._indent.pop(); + state._indent.pop(); + } + + if (ch === "}") { + state._indent.pop(); + return null; + } + + if (ch == ",") + return null; + + if (ch == ";") + return null; + + + if (/[{}\(\),;]/.test(ch)) + return null; + + // 1*DIGIT "K" / "M" / "G" + if (/\d/.test(ch)) { + stream.eatWhile(/[\d]/); + stream.eat(/[KkMmGg]/); + return "number"; + } + + // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") + if (ch == ":") { + stream.eatWhile(/[a-zA-Z_]/); + stream.eatWhile(/[a-zA-Z0-9_]/); + + return "operator"; + } + + stream.eatWhile(/\w/); + var cur = stream.current(); + + // "text:" *(SP / HTAB) (hash-comment / CRLF) + // *(multiline-literal / multiline-dotstart) + // "." CRLF + if ((cur == "text") && stream.eat(":")) + { + state.tokenize = tokenMultiLineString; + return "string"; + } + + if (keywords.propertyIsEnumerable(cur)) + return "keyword"; + + if (atoms.propertyIsEnumerable(cur)) + return "atom"; + + return null; + } + + function tokenMultiLineString(stream, state) + { + state._multiLineString = true; + // the first line is special it may contain a comment + if (!stream.sol()) { + stream.eatSpace(); + + if (stream.peek() == "#") { + stream.skipToEnd(); + return "comment"; + } + + stream.skipToEnd(); + return "string"; + } + + if ((stream.next() == ".") && (stream.eol())) + { + state._multiLineString = false; + state.tokenize = tokenBase; + } + + return "string"; + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return "string"; + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + _indent: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) + return null; + + return (state.tokenize || tokenBase)(stream, state); + }, + + indent: function(state, _textAfter) { + var length = state._indent.length; + if (_textAfter && (_textAfter[0] == "}")) + length--; + + if (length <0) + length = 0; + + return length * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("application/sieve", "sieve"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js new file mode 100644 index 0000000000..b8ccb1381f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js @@ -0,0 +1,575 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + + CodeMirror.defineMode("slim", function(config) { + var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); + var rubyMode = CodeMirror.getMode(config, "ruby"); + var modes = { html: htmlMode, ruby: rubyMode }; + var embedded = { + ruby: "ruby", + javascript: "javascript", + css: "text/css", + sass: "text/x-sass", + scss: "text/x-scss", + less: "text/x-less", + styl: "text/x-styl", // no highlighting so far + coffee: "coffeescript", + asciidoc: "text/x-asciidoc", + markdown: "text/x-markdown", + textile: "text/x-textile", // no highlighting so far + creole: "text/x-creole", // no highlighting so far + wiki: "text/x-wiki", // no highlighting so far + mediawiki: "text/x-mediawiki", // no highlighting so far + rdoc: "text/x-rdoc", // no highlighting so far + builder: "text/x-builder", // no highlighting so far + nokogiri: "text/x-nokogiri", // no highlighting so far + erb: "application/x-erb" + }; + var embeddedRegexp = function(map){ + var arr = []; + for(var key in map) arr.push(key); + return new RegExp("^("+arr.join('|')+"):"); + }(embedded); + + var styleMap = { + "commentLine": "comment", + "slimSwitch": "operator special", + "slimTag": "tag", + "slimId": "attribute def", + "slimClass": "attribute qualifier", + "slimAttribute": "attribute", + "slimSubmode": "keyword special", + "closeAttributeTag": null, + "slimDoctype": null, + "lineContinuation": null + }; + var closing = { + "{": "}", + "[": "]", + "(": ")" + }; + + var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; + var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; + var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); + var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); + var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); + var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; + var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; + + function backup(pos, tokenize, style) { + var restore = function(stream, state) { + state.tokenize = tokenize; + if (stream.pos < pos) { + stream.pos = pos; + return style; + } + return state.tokenize(stream, state); + }; + return function(stream, state) { + state.tokenize = restore; + return tokenize(stream, state); + }; + } + + function maybeBackup(stream, state, pat, offset, style) { + var cur = stream.current(); + var idx = cur.search(pat); + if (idx > -1) { + state.tokenize = backup(stream.pos, state.tokenize, style); + stream.backUp(cur.length - idx - offset); + } + return style; + } + + function continueLine(state, column) { + state.stack = { + parent: state.stack, + style: "continuation", + indented: column, + tokenize: state.line + }; + state.line = state.tokenize; + } + function finishContinue(state) { + if (state.line == state.tokenize) { + state.line = state.stack.tokenize; + state.stack = state.stack.parent; + } + } + + function lineContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + if (stream.match(/^\\$/)) { + continueLine(state, column); + return "lineContinuation"; + } + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { + stream.backUp(1); + } + return style; + }; + } + function commaContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/,$/)) { + continueLine(state, column); + } + return style; + }; + } + + function rubyInQuote(endQuote, tokenize) { + // TODO: add multi line support + return function(stream, state) { + var ch = stream.peek(); + if (ch == endQuote && state.rubyState.tokenize.length == 1) { + // step out of ruby context as it seems to complete processing all the braces + stream.next(); + state.tokenize = tokenize; + return "closeAttributeTag"; + } else { + return ruby(stream, state); + } + }; + } + function startRubySplat(tokenize) { + var rubyState; + var runSplat = function(stream, state) { + if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { + stream.backUp(1); + if (stream.eatSpace()) { + state.rubyState = rubyState; + state.tokenize = tokenize; + return tokenize(stream, state); + } + stream.next(); + } + return ruby(stream, state); + }; + return function(stream, state) { + rubyState = state.rubyState; + state.rubyState = CodeMirror.startState(rubyMode); + state.tokenize = runSplat; + return ruby(stream, state); + }; + } + + function ruby(stream, state) { + return rubyMode.token(stream, state.rubyState); + } + + function htmlLine(stream, state) { + if (stream.match(/^\\$/)) { + return "lineContinuation"; + } + return html(stream, state); + } + function html(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); + } + + function startHtmlLine(lastTokenize) { + return function(stream, state) { + var style = htmlLine(stream, state); + if (stream.eol()) state.tokenize = lastTokenize; + return style; + }; + } + + function startHtmlMode(stream, state, offset) { + state.stack = { + parent: state.stack, + style: "html", + indented: stream.column() + offset, // pipe + space + tokenize: state.line + }; + state.line = state.tokenize = html; + return null; + } + + function comment(stream, state) { + stream.skipToEnd(); + return state.stack.style; + } + + function commentMode(stream, state) { + state.stack = { + parent: state.stack, + style: "comment", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = comment; + return comment(stream, state); + } + + function attributeWrapper(stream, state) { + if (stream.eat(state.stack.endQuote)) { + state.line = state.stack.line; + state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + return null; + } + if (stream.match(wrappedAttributeNameRegexp)) { + state.tokenize = attributeWrapperAssign; + return "slimAttribute"; + } + stream.next(); + return null; + } + function attributeWrapperAssign(stream, state) { + if (stream.match(/^==?/)) { + state.tokenize = attributeWrapperValue; + return null; + } + return attributeWrapper(stream, state); + } + function attributeWrapperValue(stream, state) { + var ch = stream.peek(); + if (ch == '"' || ch == "\'") { + state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); + stream.next(); + return state.tokenize(stream, state); + } + if (ch == '[') { + return startRubySplat(attributeWrapper)(stream, state); + } + if (stream.match(/^(true|false|nil)\b/)) { + state.tokenize = attributeWrapper; + return "keyword"; + } + return startRubySplat(attributeWrapper)(stream, state); + } + + function startAttributeWrapperMode(state, endQuote, tokenize) { + state.stack = { + parent: state.stack, + style: "wrapper", + indented: state.indented + 1, + tokenize: tokenize, + line: state.line, + endQuote: endQuote + }; + state.line = state.tokenize = attributeWrapper; + return null; + } + + function sub(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); + subStream.pos = stream.pos - state.stack.indented; + subStream.start = stream.start - state.stack.indented; + subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; + subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; + var style = state.subMode.token(subStream, state.subState); + stream.pos = subStream.pos + state.stack.indented; + return style; + } + function firstSub(stream, state) { + state.stack.indented = stream.column(); + state.line = state.tokenize = sub; + return state.tokenize(stream, state); + } + + function createMode(mode) { + var query = embedded[mode]; + var spec = CodeMirror.mimeModes[query]; + if (spec) { + return CodeMirror.getMode(config, spec); + } + var factory = CodeMirror.modes[query]; + if (factory) { + return factory(config, {name: query}); + } + return CodeMirror.getMode(config, "null"); + } + + function getMode(mode) { + if (!modes.hasOwnProperty(mode)) { + return modes[mode] = createMode(mode); + } + return modes[mode]; + } + + function startSubMode(mode, state) { + var subMode = getMode(mode); + var subState = CodeMirror.startState(subMode); + + state.subMode = subMode; + state.subState = subState; + + state.stack = { + parent: state.stack, + style: "sub", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = state.tokenize = firstSub; + return "slimSubmode"; + } + + function doctypeLine(stream, _state) { + stream.skipToEnd(); + return "slimDoctype"; + } + + function startLine(stream, state) { + var ch = stream.peek(); + if (ch == '<') { + return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); + } + if (stream.match(/^[|']/)) { + return startHtmlMode(stream, state, 1); + } + if (stream.match(/^\/(!|\[\w+])?/)) { + return commentMode(stream, state); + } + if (stream.match(/^(-|==?[<>]?)/)) { + state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); + return "slimSwitch"; + } + if (stream.match(/^doctype\b/)) { + state.tokenize = doctypeLine; + return "keyword"; + } + + var m = stream.match(embeddedRegexp); + if (m) { + return startSubMode(m[1], state); + } + + return slimTag(stream, state); + } + + function slim(stream, state) { + if (state.startOfLine) { + return startLine(stream, state); + } + return slimTag(stream, state); + } + + function slimTag(stream, state) { + if (stream.eat('*')) { + state.tokenize = startRubySplat(slimTagExtras); + return null; + } + if (stream.match(nameRegexp)) { + state.tokenize = slimTagExtras; + return "slimTag"; + } + return slimClass(stream, state); + } + function slimTagExtras(stream, state) { + if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { + state.line = state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + state.subMode = null; + state.subState = null; + } + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + state.startOfLine = false; + if (style) state.last = style; + return styleMap.hasOwnProperty(style) ? styleMap[style] : style; + }, + + blankLine: function(state) { + if (state.subMode && state.subMode.blankLine) { + return state.subMode.blankLine(state.subState); + } + }, + + innerMode: function(state) { + if (state.subMode) return {state: state.subState, mode: state.subMode}; + return {state: state, mode: mode}; + } + + //indent: function(state) { + // return state.indented; + //} + }; + return mode; + }, "htmlmixed", "ruby"); + + CodeMirror.defineMIME("text/x-slim", "slim"); + CodeMirror.defineMIME("application/x-slim", "slim"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js new file mode 100644 index 0000000000..5039fe2d15 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js @@ -0,0 +1,168 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('smalltalk', function(config) { + + var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; + var keywords = /true|false|nil|self|super|thisContext/; + + var Context = function(tokenizer, parent) { + this.next = tokenizer; + this.parent = parent; + }; + + var Token = function(name, context, eos) { + this.name = name; + this.context = context; + this.eos = eos; + }; + + var State = function() { + this.context = new Context(next, null); + this.expectVariable = true; + this.indentation = 0; + this.userIndentationDelta = 0; + }; + + State.prototype.userIndent = function(indentation) { + this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; + }; + + var next = function(stream, context, state) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '"') { + token = nextComment(stream, new Context(nextComment, context)); + + } else if (aChar === '\'') { + token = nextString(stream, new Context(nextString, context)); + + } else if (aChar === '#') { + if (stream.peek() === '\'') { + stream.next(); + token = nextSymbol(stream, new Context(nextSymbol, context)); + } else { + if (stream.eatWhile(/[^\s.{}\[\]()]/)) + token.name = 'string-2'; + else + token.name = 'meta'; + } + + } else if (aChar === '$') { + if (stream.next() === '<') { + stream.eatWhile(/[^\s>]/); + stream.next(); + } + token.name = 'string-2'; + + } else if (aChar === '|' && state.expectVariable) { + token.context = new Context(nextTemporaries, context); + + } else if (/[\[\]{}()]/.test(aChar)) { + token.name = 'bracket'; + token.eos = /[\[{(]/.test(aChar); + + if (aChar === '[') { + state.indentation++; + } else if (aChar === ']') { + state.indentation = Math.max(0, state.indentation - 1); + } + + } else if (specialChars.test(aChar)) { + stream.eatWhile(specialChars); + token.name = 'operator'; + token.eos = aChar !== ';'; // ; cascaded message expression + + } else if (/\d/.test(aChar)) { + stream.eatWhile(/[\w\d]/); + token.name = 'number'; + + } else if (/[\w_]/.test(aChar)) { + stream.eatWhile(/[\w\d_]/); + token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; + + } else { + token.eos = state.expectVariable; + } + + return token; + }; + + var nextComment = function(stream, context) { + stream.eatWhile(/[^"]/); + return new Token('comment', stream.eat('"') ? context.parent : context, true); + }; + + var nextString = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string', stream.eat('\'') ? context.parent : context, false); + }; + + var nextSymbol = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string-2', stream.eat('\'') ? context.parent : context, false); + }; + + var nextTemporaries = function(stream, context) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '|') { + token.context = context.parent; + token.eos = true; + + } else { + stream.eatWhile(/[^|]/); + token.name = 'variable'; + } + + return token; + }; + + return { + startState: function() { + return new State; + }, + + token: function(stream, state) { + state.userIndent(stream.indentation()); + + if (stream.eatSpace()) { + return null; + } + + var token = state.context.next(stream, state.context, state); + state.context = token.context; + state.expectVariable = token.eos; + + return token.name; + }, + + blankLine: function(state) { + state.userIndent(0); + }, + + indent: function(state, textAfter) { + var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; + return (state.indentation + i) * config.indentUnit; + }, + + electricChars: ']' + }; + +}); + +CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js new file mode 100644 index 0000000000..57852feb0e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js @@ -0,0 +1,225 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Smarty 2 and 3 mode. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("smarty", function(config, parserConf) { + var rightDelimiter = parserConf.rightDelimiter || "}"; + var leftDelimiter = parserConf.leftDelimiter || "{"; + var version = parserConf.version || 2; + var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null"); + + var keyFunctions = ["debug", "extends", "function", "include", "literal"]; + var regs = { + operatorChars: /[+\-*&%=<>!?]/, + validIdentifier: /[a-zA-Z0-9_]/, + stringChar: /['"]/ + }; + + var last; + function cont(style, lastType) { + last = lastType; + return style; + } + + function chain(stream, state, parser) { + state.tokenize = parser; + return parser(stream, state); + } + + // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode + function doesNotCount(stream, pos) { + if (pos == null) pos = stream.pos; + return version === 3 && leftDelimiter == "{" && + (pos == stream.string.length || /\s/.test(stream.string.charAt(pos))); + } + + function tokenTop(stream, state) { + var string = stream.string; + for (var scan = stream.pos;;) { + var nextMatch = string.indexOf(leftDelimiter, scan); + scan = nextMatch + leftDelimiter.length; + if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break; + } + if (nextMatch == stream.pos) { + stream.match(leftDelimiter); + if (stream.eat("*")) { + return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter)); + } else { + state.depth++; + state.tokenize = tokenSmarty; + last = "startTag"; + return "tag"; + } + } + + if (nextMatch > -1) stream.string = string.slice(0, nextMatch); + var token = baseMode.token(stream, state.base); + if (nextMatch > -1) stream.string = string; + return token; + } + + // parsing Smarty content + function tokenSmarty(stream, state) { + if (stream.match(rightDelimiter, true)) { + if (version === 3) { + state.depth--; + if (state.depth <= 0) { + state.tokenize = tokenTop; + } + } else { + state.tokenize = tokenTop; + } + return cont("tag", null); + } + + if (stream.match(leftDelimiter, true)) { + state.depth++; + return cont("tag", "startTag"); + } + + var ch = stream.next(); + if (ch == "$") { + stream.eatWhile(regs.validIdentifier); + return cont("variable-2", "variable"); + } else if (ch == "|") { + return cont("operator", "pipe"); + } else if (ch == ".") { + return cont("operator", "property"); + } else if (regs.stringChar.test(ch)) { + state.tokenize = tokenAttribute(ch); + return cont("string", "string"); + } else if (regs.operatorChars.test(ch)) { + stream.eatWhile(regs.operatorChars); + return cont("operator", "operator"); + } else if (ch == "[" || ch == "]") { + return cont("bracket", "bracket"); + } else if (ch == "(" || ch == ")") { + return cont("bracket", "operator"); + } else if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + return cont("number", "number"); + } else { + + if (state.last == "variable") { + if (ch == "@") { + stream.eatWhile(regs.validIdentifier); + return cont("property", "property"); + } else if (ch == "|") { + stream.eatWhile(regs.validIdentifier); + return cont("qualifier", "modifier"); + } + } else if (state.last == "pipe") { + stream.eatWhile(regs.validIdentifier); + return cont("qualifier", "modifier"); + } else if (state.last == "whitespace") { + stream.eatWhile(regs.validIdentifier); + return cont("attribute", "modifier"); + } if (state.last == "property") { + stream.eatWhile(regs.validIdentifier); + return cont("property", null); + } else if (/\s/.test(ch)) { + last = "whitespace"; + return null; + } + + var str = ""; + if (ch != "/") { + str += ch; + } + var c = null; + while (c = stream.eat(regs.validIdentifier)) { + str += c; + } + for (var i=0, j=keyFunctions.length; i]=?)/)) { + // Tokenize filter, binary, null propagator, and equality operators. + return "operator"; + } else if (match = stream.match(/^\$([\w]+)/)) { + return ref(state.variables, match[1], !state.lookupVariables); + } else if (match = stream.match(/^\w+/)) { + return /^(?:as|and|or|not|in|if)$/.test(match[0]) ? "keyword" : null; + } + + stream.next(); + return null; + } + + return { + startState: function() { + return { + soyState: [], + variables: prepend(null, 'ij'), + scopes: null, + indent: 0, + quoteKind: null, + context: null, + lookupVariables: true, // Is unknown variables considered an error + localStates: [{ + mode: modes.html, + state: CodeMirror.startState(modes.html) + }] + }; + }, + + copyState: function(state) { + return { + tag: state.tag, // Last seen Soy tag. + soyState: state.soyState.concat([]), + variables: state.variables, + context: state.context, + indent: state.indent, // Indentation of the following line. + quoteKind: state.quoteKind, + lookupVariables: state.lookupVariables, + localStates: state.localStates.map(function(localState) { + return { + mode: localState.mode, + state: CodeMirror.copyState(localState.mode, localState.state) + }; + }) + }; + }, + + token: function(stream, state) { + var match; + + switch (last(state.soyState)) { + case "comment": + if (stream.match(/^.*?\*\//)) { + state.soyState.pop(); + } else { + stream.skipToEnd(); + } + if (!state.context || !state.context.scope) { + var paramRe = /@param\??\s+(\S+)/g; + var current = stream.current(); + for (var match; (match = paramRe.exec(current)); ) { + state.variables = prepend(state.variables, match[1]); + } + } + return "comment"; + + case "string": + var match = stream.match(/^.*?(["']|\\[\s\S])/); + if (!match) { + stream.skipToEnd(); + } else if (match[1] == state.quoteKind) { + state.quoteKind = null; + state.soyState.pop(); + } + return "string"; + } + + if (!state.soyState.length || last(state.soyState) != "literal") { + if (stream.match(/^\/\*/)) { + state.soyState.push("comment"); + return "comment"; + } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { + return "comment"; + } + } + + switch (last(state.soyState)) { + case "templ-def": + if (match = stream.match(/^\.?([\w]+(?!\.[\w]+)*)/)) { + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + + case "templ-ref": + if (match = stream.match(/(\.?[a-zA-Z_][a-zA-Z_0-9]+)+/)) { + state.soyState.pop(); + // If the first character is '.', it can only be a local template. + if (match[0][0] == '.') { + return "variable-2" + } + // Otherwise + return "variable"; + } + if (match = stream.match(/^\$([\w]+)/)) { + state.soyState.pop(); + return ref(state.variables, match[1], !state.lookupVariables); + } + + stream.next(); + return null; + + case "namespace-def": + if (match = stream.match(/^\.?([\w\.]+)/)) { + state.soyState.pop(); + return "variable"; + } + stream.next(); + return null; + + case "param-def": + if (match = stream.match(/^\*/)) { + state.soyState.pop(); + state.soyState.push("param-type"); + return "type"; + } + if (match = stream.match(/^\w+/)) { + state.variables = prepend(state.variables, match[0]); + state.soyState.pop(); + state.soyState.push("param-type"); + return "def"; + } + stream.next(); + return null; + + case "param-ref": + if (match = stream.match(/^\w+/)) { + state.soyState.pop(); + return "property"; + } + stream.next(); + return null; + + case "open-parentheses": + if (stream.match(/[)]/)) { + state.soyState.pop(); + return null; + } + return expression(stream, state); + + case "param-type": + var peekChar = stream.peek(); + if ("}]=>,".indexOf(peekChar) != -1) { + state.soyState.pop(); + return null; + } else if (peekChar == "[") { + state.soyState.push('param-type-record'); + return null; + } else if (peekChar == "(") { + state.soyState.push('param-type-template'); + return null; + } else if (peekChar == "<") { + state.soyState.push('param-type-parameter'); + return null; + } else if (match = stream.match(/^([\w]+|[?])/)) { + return "type"; + } + stream.next(); + return null; + + case "param-type-record": + var peekChar = stream.peek(); + if (peekChar == "]") { + state.soyState.pop(); + return null; + } + if (stream.match(/^\w+/)) { + state.soyState.push('param-type'); + return "property"; + } + stream.next(); + return null; + + case "param-type-parameter": + if (stream.match(/^[>]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/^[<,]/)) { + state.soyState.push('param-type'); + return null; + } + stream.next(); + return null; + + case "param-type-template": + if (stream.match(/[>]/)) { + state.soyState.pop(); + state.soyState.push('param-type'); + return null; + } + if (stream.match(/^\w+/)) { + state.soyState.push('param-type'); + return "def"; + } + stream.next(); + return null; + + case "var-def": + if (match = stream.match(/^\$([\w]+)/)) { + state.variables = prepend(state.variables, match[1]); + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + + case "for-loop": + if (stream.match(/\bin\b/)) { + state.soyState.pop(); + return "keyword"; + } + if (stream.peek() == "$") { + state.soyState.push('var-def'); + return null; + } + stream.next(); + return null; + + case "record-literal": + if (stream.match(/^[)]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/[(,]/)) { + state.soyState.push("map-value") + state.soyState.push("record-key") + return null; + } + stream.next() + return null; + + case "map-literal": + if (stream.match(/^[)]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/[(,]/)) { + state.soyState.push("map-value") + state.soyState.push("map-value") + return null; + } + stream.next() + return null; + + case "list-literal": + if (stream.match(']')) { + state.soyState.pop(); + state.lookupVariables = true; + popcontext(state); + return null; + } + if (stream.match(/\bfor\b/)) { + state.lookupVariables = true; + state.soyState.push('for-loop'); + return "keyword"; + } + return expression(stream, state); + + case "record-key": + if (stream.match(/[\w]+/)) { + return "property"; + } + if (stream.match(/^[:]/)) { + state.soyState.pop(); + return null; + } + stream.next(); + return null; + + case "map-value": + if (stream.peek() == ")" || stream.peek() == "," || stream.match(/^[:)]/)) { + state.soyState.pop(); + return null; + } + return expression(stream, state); + + case "import": + if (stream.eat(";")) { + state.soyState.pop(); + state.indent -= 2 * config.indentUnit; + return null; + } + if (stream.match(/\w+(?=\s+as\b)/)) { + return "variable"; + } + if (match = stream.match(/\w+/)) { + return /\b(from|as)\b/.test(match[0]) ? "keyword" : "def"; + } + if (match = stream.match(/^["']/)) { + state.soyState.push("string"); + state.quoteKind = match[0]; + return "string"; + } + stream.next(); + return null; + + case "tag": + var endTag; + var tagName; + if (state.tag === undefined) { + endTag = true; + tagName = ''; + } else { + endTag = state.tag[0] == "/"; + tagName = endTag ? state.tag.substring(1) : state.tag; + } + var tag = tags[tagName]; + if (stream.match(/^\/?}/)) { + var selfClosed = stream.current() == "/}"; + if (selfClosed && !endTag) { + popcontext(state); + } + if (state.tag == "/template" || state.tag == "/deltemplate") { + state.variables = prepend(null, 'ij'); + state.indent = 0; + } else { + state.indent -= config.indentUnit * + (selfClosed || indentingTags.indexOf(state.tag) == -1 ? 2 : 1); + } + state.soyState.pop(); + return "keyword"; + } else if (stream.match(/^([\w?]+)(?==)/)) { + if (state.context && state.context.tag == tagName && stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { + var kind = match[1]; + state.context.kind = kind; + var mode = modes[kind] || modes.html; + var localState = last(state.localStates); + if (localState.mode.indent) { + state.indent += localState.mode.indent(localState.state, "", ""); + } + state.localStates.push({ + mode: mode, + state: CodeMirror.startState(mode) + }); + } + return "attribute"; + } + return expression(stream, state); + + case "template-call-expression": + if (stream.match(/^([\w-?]+)(?==)/)) { + return "attribute"; + } else if (stream.eat('>')) { + state.soyState.pop(); + return "keyword"; + } else if (stream.eat('/>')) { + state.soyState.pop(); + return "keyword"; + } + return expression(stream, state); + case "literal": + if (stream.match('{/literal}', false)) { + state.soyState.pop(); + return this.token(stream, state); + } + return tokenUntil(stream, state, /\{\/literal}/); + case "export": + if (match = stream.match(/\w+/)) { + state.soyState.pop(); + if (match == "const") { + state.soyState.push("const-def") + return "keyword"; + } else if (match == "extern") { + state.soyState.push("param-def") + return "keyword"; + } + } else { + stream.next(); + } + return null; + case "const-def": + if (stream.match(/^\w+/)) { + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + } + + if (stream.match('{literal}')) { + state.indent += config.indentUnit; + state.soyState.push("literal"); + state.context = new Context(state.context, "literal", state.variables); + return "keyword"; + + // A tag-keyword must be followed by whitespace, comment or a closing tag. + } else if (match = stream.match(/^\{([/@\\]?\w+\??)(?=$|[\s}]|\/[/*])/)) { + var prevTag = state.tag; + state.tag = match[1]; + var endTag = state.tag[0] == "/"; + var indentingTag = !!tags[state.tag]; + var tagName = endTag ? state.tag.substring(1) : state.tag; + var tag = tags[tagName]; + if (state.tag != "/switch") + state.indent += ((endTag || tag && tag.reduceIndent) && prevTag != "switch" ? 1 : 2) * config.indentUnit; + + state.soyState.push("tag"); + var tagError = false; + if (tag) { + if (!endTag) { + if (tag.soyState) state.soyState.push(tag.soyState); + } + // If a new tag, open a new context. + if (!tag.noEndTag && (indentingTag || !endTag)) { + state.context = new Context(state.context, state.tag, tag.variableScope ? state.variables : null); + // Otherwise close the current context. + } else if (endTag) { + var isBalancedForExtern = tagName == 'extern' && (state.context && state.context.tag == 'export'); + if (!state.context || ((state.context.tag != tagName) && !isBalancedForExtern)) { + tagError = true; + } else if (state.context) { + if (state.context.kind) { + state.localStates.pop(); + var localState = last(state.localStates); + if (localState.mode.indent) { + state.indent -= localState.mode.indent(localState.state, "", ""); + } + } + popcontext(state); + } + } + } else if (endTag) { + // Assume all tags with a closing tag are defined in the config. + tagError = true; + } + return (tagError ? "error " : "") + "keyword"; + + // Not a tag-keyword; it's an implicit print tag. + } else if (stream.eat('{')) { + state.tag = "print"; + state.indent += 2 * config.indentUnit; + state.soyState.push("tag"); + return "keyword"; + } else if (!state.context && stream.sol() && stream.match(/import\b/)) { + state.soyState.push("import"); + state.indent += 2 * config.indentUnit; + return "keyword"; + } else if (match = stream.match('<{')) { + state.soyState.push("template-call-expression"); + state.indent += 2 * config.indentUnit; + state.soyState.push("tag"); + return "keyword"; + } else if (match = stream.match('')) { + state.indent -= 1 * config.indentUnit; + return "keyword"; + } + + return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); + }, + + indent: function(state, textAfter, line) { + var indent = state.indent, top = last(state.soyState); + if (top == "comment") return CodeMirror.Pass; + + if (top == "literal") { + if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; + } else { + if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; + if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; + if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; + if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; + } + var localState = last(state.localStates); + if (indent && localState.mode.indent) { + indent += localState.mode.indent(localState.state, textAfter, line); + } + return indent; + }, + + innerMode: function(state) { + if (state.soyState.length && last(state.soyState) != "literal") return null; + else return last(state.localStates); + }, + + electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, + lineComment: "//", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + useInnerComments: false, + fold: "indent" + }; + }, "htmlmixed"); + + CodeMirror.registerHelper("wordChars", "soy", /[\w$]/); + + CodeMirror.registerHelper("hintWords", "soy", Object.keys(tags).concat( + ["css", "debugger"])); + + CodeMirror.defineMIME("text/x-soy", "soy"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js new file mode 100644 index 0000000000..6d1d24464b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js @@ -0,0 +1,190 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sparql", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", + "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", + "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", + "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", + "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", + "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", + "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", + "isblank", "isliteral", "a", "bind"]); + var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", + "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", + "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", + "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", + "true", "false", "with", + "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); + var operatorChars = /[*+\-<>=&|\^\/!\?]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "$" || ch == "?") { + if(ch == "?" && stream.match(/\s/, false)){ + return "operator"; + } + stream.match(/^[A-Za-z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][A-Za-z0-9_\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]*/); + return "variable-2"; + } + else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return "bracket"; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (ch === "^") { + ch = stream.peek(); + if (ch === "^") stream.eat("^"); + else stream.eatWhile(operatorChars); + return "operator"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return "operator"; + } + else if (ch == ":") { + eatPnLocal(stream); + return "atom"; + } + else if (ch == "@") { + stream.eatWhile(/[a-z\d\-]/i); + return "meta"; + } + else { + stream.eatWhile(/[_\w\d]/); + if (stream.eat(":")) { + eatPnLocal(stream); + return "atom"; + } + var word = stream.current(); + if (ops.test(word)) + return "builtin"; + else if (keywords.test(word)) + return "keyword"; + else + return "variable"; + } + } + + function eatPnLocal(stream) { + stream.match(/(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/i); + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) { + popContext(state); + if (curPunc == "}" && state.context && state.context.type == "pattern") + popContext(state); + } + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("application/sparql-query", "sparql"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js new file mode 100644 index 0000000000..d87f988d35 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js @@ -0,0 +1,112 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("spreadsheet", function () { + return { + startState: function () { + return { + stringType: null, + stack: [] + }; + }, + token: function (stream, state) { + if (!stream) return; + + //check for state changes + if (state.stack.length === 0) { + //strings + if ((stream.peek() == '"') || (stream.peek() == "'")) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.stack.unshift("string"); + } + } + + //return state + //stack has + switch (state.stack[0]) { + case "string": + while (state.stack[0] === "string" && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.stack.shift(); // Clear flag + } else if (stream.peek() === "\\") { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return "string"; + + case "characterClass": + while (state.stack[0] === "characterClass" && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) + state.stack.shift(); + } + return "operator"; + } + + var peek = stream.peek(); + + //no stack + switch (peek) { + case "[": + stream.next(); + state.stack.unshift("characterClass"); + return "bracket"; + case ":": + stream.next(); + return "operator"; + case "\\": + if (stream.match(/\\[a-z]+/)) return "string-2"; + else { + stream.next(); + return "atom"; + } + case ".": + case ",": + case ";": + case "*": + case "-": + case "+": + case "^": + case "<": + case "/": + case "=": + stream.next(); + return "atom"; + case "$": + stream.next(); + return "builtin"; + } + + if (stream.match(/\d+/)) { + if (stream.match(/^\w+/)) return "error"; + return "number"; + } else if (stream.match(/^[a-zA-Z_]\w*/)) { + if (stream.match(/(?=[\(.])/, false)) return "keyword"; + return "variable-2"; + } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { + stream.next(); + return "bracket"; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; + }); + + CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js new file mode 100644 index 0000000000..cd8b757bb6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js @@ -0,0 +1,503 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sql", function(config, parserConfig) { + var client = parserConfig.client || {}, + atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, + builtin = parserConfig.builtin || set(defaultBuiltin), + keywords = parserConfig.keywords || set(sqlKeywords), + operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^\/]/, + support = parserConfig.support || {}, + hooks = parserConfig.hooks || {}, + dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}, + backslashStringEscapes = parserConfig.backslashStringEscapes !== false, + brackets = parserConfig.brackets || /^[\{}\(\)\[\]]/, + punctuation = parserConfig.punctuation || /^[;.,:]/ + + function tokenBase(stream, state) { + var ch = stream.next(); + + // call hooks from the mime type + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + + if (support.hexNumber && + ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) + || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { + // hex + // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html + return "number"; + } else if (support.binaryNumber && + (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) + || (ch == "0" && stream.match(/^b[01]+/)))) { + // bitstring + // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html + return "number"; + } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { + // numbers + // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html + stream.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/); + support.decimallessFloat && stream.match(/^\.(?!\.)/); + return "number"; + } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { + // placeholders + return "variable-3"; + } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { + // strings + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } else if ((((support.nCharCast && (ch == "n" || ch == "N")) + || (support.charsetCast && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) + && (stream.peek() == "'" || stream.peek() == '"'))) { + // charset casting: _utf8'str', N'str', n'str' + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + return "keyword"; + } else if (support.escapeConstant && (ch == "e" || ch == "E") + && (stream.peek() == "'" || (stream.peek() == '"' && support.doubleQuote))) { + // escape constant: E'str', e'str' + // ref: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE + state.tokenize = function(stream, state) { + return (state.tokenize = tokenLiteral(stream.next(), true))(stream, state); + } + return "keyword"; + } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { + // 1-line comment + stream.skipToEnd(); + return "comment"; + } else if ((support.commentHash && ch == "#") + || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { + // 1-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + stream.skipToEnd(); + return "comment"; + } else if (ch == "/" && stream.eat("*")) { + // multi-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + state.tokenize = tokenComment(1); + return state.tokenize(stream, state); + } else if (ch == ".") { + // .1 for 0.1 + if (support.zerolessFloat && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) + return "number"; + if (stream.match(/^\.+/)) + return null + // .table_name (ODBC) + // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + if (support.ODBCdotTable && stream.match(/^[\w\d_$#]+/)) + return "variable-2"; + } else if (operatorChars.test(ch)) { + // operators + stream.eatWhile(operatorChars); + return "operator"; + } else if (brackets.test(ch)) { + // brackets + return "bracket"; + } else if (punctuation.test(ch)) { + // punctuation + stream.eatWhile(punctuation); + return "punctuation"; + } else if (ch == '{' && + (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { + // dates (weird ODBC syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + return "number"; + } else { + stream.eatWhile(/^[_\w\d]/); + var word = stream.current().toLowerCase(); + // dates (standard SQL syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) + return "number"; + if (atoms.hasOwnProperty(word)) return "atom"; + if (builtin.hasOwnProperty(word)) return "type"; + if (keywords.hasOwnProperty(word)) return "keyword"; + if (client.hasOwnProperty(word)) return "builtin"; + return null; + } + } + + // 'string', with char specified in quote escaped by '\' + function tokenLiteral(quote, backslashEscapes) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = (backslashStringEscapes || backslashEscapes) && !escaped && ch == "\\"; + } + return "string"; + }; + } + function tokenComment(depth) { + return function(stream, state) { + var m = stream.match(/^.*?(\/\*|\*\/)/) + if (!m) stream.skipToEnd() + else if (m[1] == "/*") state.tokenize = tokenComment(depth + 1) + else if (depth > 1) state.tokenize = tokenComment(depth - 1) + else state.tokenize = tokenBase + return "comment" + } + } + + function pushContext(stream, state, type) { + state.context = { + prev: state.context, + indent: stream.indentation(), + col: stream.column(), + type: type + }; + } + + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, context: null}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) + state.context.align = false; + } + if (state.tokenize == tokenBase && stream.eatSpace()) return null; + + var style = state.tokenize(stream, state); + if (style == "comment") return style; + + if (state.context && state.context.align == null) + state.context.align = true; + + var tok = stream.current(); + if (tok == "(") + pushContext(stream, state, ")"); + else if (tok == "[") + pushContext(stream, state, "]"); + else if (state.context && state.context.type == tok) + popContext(state); + return style; + }, + + indent: function(state, textAfter) { + var cx = state.context; + if (!cx) return CodeMirror.Pass; + var closing = textAfter.charAt(0) == cx.type; + if (cx.align) return cx.col + (closing ? 0 : 1); + else return cx.indent + (closing ? 0 : config.indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : "--", + closeBrackets: "()[]{}''\"\"``" + }; +}); + + // `identifier` + function hookIdentifier(stream) { + // MySQL/MariaDB identifiers + // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "`" && !stream.eat("`")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // "identifier" + function hookIdentifierDoublequote(stream) { + // Standard SQL /SQLite identifiers + // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier + // ref: http://sqlite.org/lang_keywords.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "\"" && !stream.eat("\"")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // variable token + function hookVar(stream) { + // variables + // @@prefix.varName @varName + // varName can be quoted with ` or ' or " + // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html + if (stream.eat("@")) { + stream.match('session.'); + stream.match('local.'); + stream.match('global.'); + } + + if (stream.eat("'")) { + stream.match(/^.*'/); + return "variable-2"; + } else if (stream.eat('"')) { + stream.match(/^.*"/); + return "variable-2"; + } else if (stream.eat("`")) { + stream.match(/^.*`/); + return "variable-2"; + } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { + return "variable-2"; + } + return null; + }; + + // short client keyword token + function hookClient(stream) { + // \N means NULL + // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html + if (stream.eat("N")) { + return "atom"; + } + // \g, etc + // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html + return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; + } + + // these keywords are used by all SQL dialects (however, a mode can still overwrite it) + var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; + + // turn a space-separated list into an array + function set(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var defaultBuiltin = "bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric" + + // A generic SQL Mode. It's not a standard, it just try to support what is generally supported + CodeMirror.defineMIME("text/x-sql", { + name: "sql", + keywords: set(sqlKeywords + "begin"), + builtin: set(defaultBuiltin), + atoms: set("false true null unknown"), + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-mssql", { + name: "sql", + client: set("$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id"), + keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with"), + builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), + atoms: set("is not null like and or in left right between inner outer join all any some cross unpivot pivot exists"), + operatorChars: /^[*+\-%<>!=^\&|\/]/, + brackets: /^[\{}\(\)]/, + punctuation: /^[;.,:/]/, + backslashStringEscapes: false, + dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), + hooks: { + "@": hookVar + } + }); + + CodeMirror.defineMIME("text/x-mysql", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + CodeMirror.defineMIME("text/x-mariadb", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + // provided by the phpLiteAdmin project - phpliteadmin.org + CodeMirror.defineMIME("text/x-sqlite", { + name: "sql", + // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd + client: set("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"), + // ref: http://sqlite.org/lang_keywords.html + keywords: set(sqlKeywords + "abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"), + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"), + // ref: http://sqlite.org/syntax/literal-value.html + atoms: set("null current_date current_time current_timestamp"), + // ref: http://sqlite.org/lang_expr.html#binaryops + operatorChars: /^[*+\-%<>!=&|/~]/, + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + dateSQL: set("date time timestamp datetime"), + support: set("decimallessFloat zerolessFloat"), + identifierQuote: "\"", //ref: http://sqlite.org/lang_keywords.html + hooks: { + // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam + "@": hookVar, + ":": hookVar, + "?": hookVar, + "$": hookVar, + // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html + "\"": hookIdentifierDoublequote, + // there is also support for backticks, ref: http://sqlite.org/lang_keywords.html + "`": hookIdentifier + } + }); + + // the query language used by Apache Cassandra is called CQL, but this mime type + // is called Cassandra to avoid confusion with Contextual Query Language + CodeMirror.defineMIME("text/x-cassandra", { + name: "sql", + client: { }, + keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), + builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), + atoms: set("false true infinity NaN"), + operatorChars: /^[<>=]/, + dateSQL: { }, + support: set("commentSlashSlash decimallessFloat"), + hooks: { } + }); + + // this is based on Peter Raganitsch's 'plsql' mode + CodeMirror.defineMIME("text/x-plsql", { + name: "sql", + client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), + keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), + builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), + operatorChars: /^[*\/+\-%<>!=~]/, + dateSQL: set("date time timestamp"), + support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") + }); + + // Created to support specific hive keywords + CodeMirror.defineMIME("text/x-hive", { + name: "sql", + keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"), + builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-pgsql", { + name: "sql", + client: set("source"), + // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html + // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c + keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"), + // https://www.postgresql.org/docs/11/datatype.html + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*\/+\-%<>!=&|^\/#@?~]/, + backslashStringEscapes: false, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant") + }); + + // Google's SQL-like query language, GQL + CodeMirror.defineMIME("text/x-gql", { + name: "sql", + keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), + atoms: set("false true"), + builtin: set("blob datetime first key __key__ string integer double boolean null"), + operatorChars: /^[*+\-%<>!=]/ + }); + + // Greenplum + CodeMirror.defineMIME("text/x-gpsql", { + name: "sql", + client: set("source"), + //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h + keywords: set("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"), + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") + }); + + // Spark SQL + CodeMirror.defineMIME("text/x-sparksql", { + name: "sql", + keywords: set("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"), + builtin: set("abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with"), + atoms: set("false true null"), + operatorChars: /^[*\/+\-%<>!=~&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote zerolessFloat") + }); + + // Esper + CodeMirror.defineMIME("text/x-esper", { + name: "sql", + client: set("source"), + // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html + keywords: set("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"), + builtin: {}, + atoms: set("false true null"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("time"), + support: set("decimallessFloat zerolessFloat binaryNumber hexNumber") + }); +}); + +/* + How Properties of Mime Types are used by SQL Mode + ================================================= + + keywords: + A list of keywords you want to be highlighted. + builtin: + A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). + operatorChars: + All characters that must be handled as operators. + client: + Commands parsed and executed by the client (not the server). + support: + A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. + * ODBCdotTable: .tableName + * zerolessFloat: .1 + * doubleQuote + * nCharCast: N'string' + * charsetCast: _utf8'string' + * commentHash: use # char for comments + * commentSlashSlash: use // for comments + * commentSpaceRequired: require a space after -- for comments + atoms: + Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: + UNKNOWN, INFINITY, UNDERFLOW, NaN... + dateSQL: + Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. +*/ diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js new file mode 100644 index 0000000000..20c3bc7a18 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js @@ -0,0 +1,264 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) + * Licence: MIT + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stex", function(_config, parserConfig) { + "use strict"; + + function pushCommand(state, command) { + state.cmdState.push(command); + } + + function peekCommand(state) { + if (state.cmdState.length > 0) { + return state.cmdState[state.cmdState.length - 1]; + } else { + return null; + } + } + + function popCommand(state) { + var plug = state.cmdState.pop(); + if (plug) { + plug.closeBracket(); + } + } + + // returns the non-default plugin closest to the end of the list + function getMostPowerful(state) { + var context = state.cmdState; + for (var i = context.length - 1; i >= 0; i--) { + var plug = context[i]; + if (plug.name == "DEFAULT") { + continue; + } + return plug; + } + return { styleIdentifier: function() { return null; } }; + } + + function addPluginPattern(pluginName, cmdStyle, styles) { + return function () { + this.name = pluginName; + this.bracketNo = 0; + this.style = cmdStyle; + this.styles = styles; + this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin + + this.styleIdentifier = function() { + return this.styles[this.bracketNo - 1] || null; + }; + this.openBracket = function() { + this.bracketNo++; + return "bracket"; + }; + this.closeBracket = function() {}; + }; + } + + var plugins = {}; + + plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); + plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); + plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); + plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); + plugins["end"] = addPluginPattern("end", "tag", ["atom"]); + + plugins["label" ] = addPluginPattern("label" , "tag", ["atom"]); + plugins["ref" ] = addPluginPattern("ref" , "tag", ["atom"]); + plugins["eqref" ] = addPluginPattern("eqref" , "tag", ["atom"]); + plugins["cite" ] = addPluginPattern("cite" , "tag", ["atom"]); + plugins["bibitem" ] = addPluginPattern("bibitem" , "tag", ["atom"]); + plugins["Bibitem" ] = addPluginPattern("Bibitem" , "tag", ["atom"]); + plugins["RBibitem" ] = addPluginPattern("RBibitem" , "tag", ["atom"]); + + plugins["DEFAULT"] = function () { + this.name = "DEFAULT"; + this.style = "tag"; + + this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; + }; + + function setState(state, f) { + state.f = f; + } + + // called when in a normal (no environment) context + function normal(source, state) { + var plug; + // Do we look like '\command' ? If so, attempt to apply the plugin 'command' + if (source.match(/^\\[a-zA-Z@]+/)) { + var cmdName = source.current().slice(1); + plug = plugins.hasOwnProperty(cmdName) ? plugins[cmdName] : plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + setState(state, beginParams); + return plug.style; + } + + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + + // white space control characters + if (source.match(/^\\[,;!\/\\]/)) { + return "tag"; + } + + // find if we're starting various math modes + if (source.match("\\[")) { + setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); + return "keyword"; + } + if (source.match("\\(")) { + setState(state, function(source, state){ return inMathMode(source, state, "\\)"); }); + return "keyword"; + } + if (source.match("$$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); + return "keyword"; + } + if (source.match("$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$"); }); + return "keyword"; + } + + var ch = source.next(); + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } else if (ch == '}' || ch == ']') { + plug = peekCommand(state); + if (plug) { + plug.closeBracket(ch); + setState(state, beginParams); + } else { + return "error"; + } + return "bracket"; + } else if (ch == '{' || ch == '[') { + plug = plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + return "bracket"; + } else if (/\d/.test(ch)) { + source.eatWhile(/[\w.%]/); + return "atom"; + } else { + source.eatWhile(/[\w\-_]/); + plug = getMostPowerful(state); + if (plug.name == 'begin') { + plug.argument = source.current(); + } + return plug.styleIdentifier(); + } + } + + function inMathMode(source, state, endModeSeq) { + if (source.eatSpace()) { + return null; + } + if (endModeSeq && source.match(endModeSeq)) { + setState(state, normal); + return "keyword"; + } + if (source.match(/^\\[a-zA-Z@]+/)) { + return "tag"; + } + if (source.match(/^[a-zA-Z]+/)) { + return "variable-2"; + } + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + // white space control characters + if (source.match(/^\\[,;!\/]/)) { + return "tag"; + } + // special math-mode characters + if (source.match(/^[\^_&]/)) { + return "tag"; + } + // non-special characters + if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { + return null; + } + if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { + return "number"; + } + var ch = source.next(); + if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { + return "bracket"; + } + + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } + return "error"; + } + + function beginParams(source, state) { + var ch = source.peek(), lastPlug; + if (ch == '{' || ch == '[') { + lastPlug = peekCommand(state); + lastPlug.openBracket(ch); + source.eat(ch); + setState(state, normal); + return "bracket"; + } + if (/[ \t\r]/.test(ch)) { + source.eat(ch); + return null; + } + setState(state, normal); + popCommand(state); + + return normal(source, state); + } + + return { + startState: function() { + var f = parserConfig.inMathMode ? function(source, state){ return inMathMode(source, state); } : normal; + return { + cmdState: [], + f: f + }; + }, + copyState: function(s) { + return { + cmdState: s.cmdState.slice(), + f: s.f + }; + }, + token: function(stream, state) { + return state.f(stream, state); + }, + blankLine: function(state) { + state.f = normal; + state.cmdState.length = 0; + }, + lineComment: "%" + }; + }); + + CodeMirror.defineMIME("text/x-stex", "stex"); + CodeMirror.defineMIME("text/x-latex", "stex"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js new file mode 100644 index 0000000000..978696bddd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js @@ -0,0 +1,775 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stylus", function(config) { + var indentUnit = config.indentUnit, + indentUnitString = '', + tagKeywords = keySet(tagKeywords_), + tagVariablesRegexp = /^(a|b|i|s|col|em)$/i, + propertyKeywords = keySet(propertyKeywords_), + nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_), + valueKeywords = keySet(valueKeywords_), + colorKeywords = keySet(colorKeywords_), + documentTypes = keySet(documentTypes_), + documentTypesRegexp = wordRegexp(documentTypes_), + mediaFeatures = keySet(mediaFeatures_), + mediaTypes = keySet(mediaTypes_), + fontProperties = keySet(fontProperties_), + operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/, + wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_), + blockKeywords = keySet(blockKeywords_), + vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i), + commonAtoms = keySet(commonAtoms_), + firstWordMatch = "", + states = {}, + ch, + style, + type, + override; + + while (indentUnitString.length < indentUnit) indentUnitString += ' '; + + /** + * Tokenizers + */ + function tokenBase(stream, state) { + firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/); + state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : ""; + state.context.line.indent = stream.indentation(); + ch = stream.peek(); + + // Line comment + if (stream.match("//")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } + // Block comment + if (stream.match("/*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + // String + if (ch == "\"" || ch == "'") { + stream.next(); + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + // Def + if (ch == "@") { + stream.next(); + stream.eatWhile(/[\w\\-]/); + return ["def", stream.current()]; + } + // ID selector or Hex color + if (ch == "#") { + stream.next(); + // Hex color + if (stream.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\b(?!-)/i)) { + return ["atom", "atom"]; + } + // ID selector + if (stream.match(/^[a-z][\w-]*/i)) { + return ["builtin", "hash"]; + } + } + // Vendor prefixes + if (stream.match(vendorPrefixesRegexp)) { + return ["meta", "vendor-prefixes"]; + } + // Numbers + if (stream.match(/^-?[0-9]?\.?[0-9]/)) { + stream.eatWhile(/[a-z%]/i); + return ["number", "unit"]; + } + // !important|optional + if (ch == "!") { + stream.next(); + return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"]; + } + // Class + if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) { + return ["qualifier", "qualifier"]; + } + // url url-prefix domain regexp + if (stream.match(documentTypesRegexp)) { + if (stream.peek() == "(") state.tokenize = tokenParenthesized; + return ["property", "word"]; + } + // Mixins / Functions + if (stream.match(/^[a-z][\w-]*\(/i)) { + stream.backUp(1); + return ["keyword", "mixin"]; + } + // Block mixins + if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) { + stream.backUp(1); + return ["keyword", "block-mixin"]; + } + // Parent Reference BEM naming + if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) { + return ["qualifier", "qualifier"]; + } + // / Root Reference & Parent Reference + if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) { + stream.backUp(1); + return ["variable-3", "reference"]; + } + if (stream.match(/^&{1}\s*$/)) { + return ["variable-3", "reference"]; + } + // Word operator + if (stream.match(wordOperatorKeywordsRegexp)) { + return ["operator", "operator"]; + } + // Word + if (stream.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)) { + // Variable + if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) { + if (!wordIsTag(stream.current())) { + stream.match('.'); + return ["variable-2", "variable-name"]; + } + } + return ["variable-2", "word"]; + } + // Operators + if (stream.match(operatorsRegexp)) { + return ["operator", stream.current()]; + } + // Delimiters + if (/[:;,{}\[\]\(\)]/.test(ch)) { + stream.next(); + return [null, ch]; + } + // Non-detected items + stream.next(); + return [null, null]; + } + + /** + * Token comment + */ + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return ["comment", "comment"]; + } + + /** + * Token string + */ + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ["string", "string"]; + }; + } + + /** + * Token parenthesized + */ + function tokenParenthesized(stream, state) { + stream.next(); // Must be "(" + if (!stream.match(/\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return [null, "("]; + } + + /** + * Context management + */ + function Context(type, indent, prev, line) { + this.type = type; + this.indent = indent; + this.prev = prev; + this.line = line || {firstWord: "", indent: 0}; + } + + function pushContext(state, stream, type, indent) { + indent = indent >= 0 ? indent : indentUnit; + state.context = new Context(type, stream.indentation() + indent, state.context); + return type; + } + + function popContext(state, currentIndent) { + var contextIndent = state.context.indent - indentUnit; + currentIndent = currentIndent || false; + state.context = state.context.prev; + if (currentIndent) state.context.indent = contextIndent; + return state.context.type; + } + + function pass(type, stream, state) { + return states[state.context.type](type, stream, state); + } + + function popAndPass(type, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type, stream, state); + } + + + /** + * Parser + */ + function wordIsTag(word) { + return word.toLowerCase() in tagKeywords; + } + + function wordIsProperty(word) { + word = word.toLowerCase(); + return word in propertyKeywords || word in fontProperties; + } + + function wordIsBlock(word) { + return word.toLowerCase() in blockKeywords; + } + + function wordIsVendorPrefix(word) { + return word.toLowerCase().match(vendorPrefixesRegexp); + } + + function wordAsValue(word) { + var wordLC = word.toLowerCase(); + var override = "variable-2"; + if (wordIsTag(word)) override = "tag"; + else if (wordIsBlock(word)) override = "block-keyword"; + else if (wordIsProperty(word)) override = "property"; + else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom"; + else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword"; + + // Font family + else if (word.match(/^[A-Z]/)) override = "string"; + return override; + } + + function typeIsBlock(type, stream) { + return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin"); + } + + function typeIsInterpolation(type, stream) { + return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false); + } + + function typeIsPseudo(type, stream) { + return type == ":" && stream.match(/^[a-z-]+/, false); + } + + function startOfLine(stream) { + return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current()))); + } + + function endOfLine(stream) { + return stream.eol() || stream.match(/^\s*$/, false); + } + + function firstWordOfLine(line) { + var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i; + var result = typeof line == "string" ? line.match(re) : line.string.match(re); + return result ? result[0].replace(/^\s*/, "") : ""; + } + + + /** + * Block + */ + states.block = function(type, stream, state) { + if ((type == "comment" && startOfLine(stream)) || + (type == "," && endOfLine(stream)) || + type == "mixin") { + return pushContext(state, stream, "block", 0); + } + if (typeIsInterpolation(type, stream)) { + return pushContext(state, stream, "interpolation"); + } + if (endOfLine(stream) && type == "]") { + if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) { + return pushContext(state, stream, "block", 0); + } + } + if (typeIsBlock(type, stream)) { + return pushContext(state, stream, "block"); + } + if (type == "}" && endOfLine(stream)) { + return pushContext(state, stream, "block", 0); + } + if (type == "variable-name") { + if (stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/) || wordIsBlock(firstWordOfLine(stream))) { + return pushContext(state, stream, "variableName"); + } + else { + return pushContext(state, stream, "variableName", 0); + } + } + if (type == "=") { + if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "*") { + if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) { + override = "tag"; + return pushContext(state, stream, "block"); + } + } + if (typeIsPseudo(type, stream)) { + return pushContext(state, stream, "pseudo"); + } + if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { + return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); + } + if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { + return pushContext(state, stream, "keyframes"); + } + if (/@extends?/.test(type)) { + return pushContext(state, stream, "extend", 0); + } + if (type && type.charAt(0) == "@") { + + // Property Lookup + if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) { + override = "variable-2"; + return "block"; + } + if (/(@import|@require|@charset)/.test(type)) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "reference" && endOfLine(stream)) { + return pushContext(state, stream, "block"); + } + if (type == "(") { + return pushContext(state, stream, "parens"); + } + + if (type == "vendor-prefixes") { + return pushContext(state, stream, "vendorPrefixes"); + } + if (type == "word") { + var word = stream.current(); + override = wordAsValue(word); + + if (override == "property") { + if (startOfLine(stream)) { + return pushContext(state, stream, "block", 0); + } else { + override = "atom"; + return "block"; + } + } + + if (override == "tag") { + + // tag is a css value + if (/embed|menu|pre|progress|sub|table/.test(word)) { + if (wordIsProperty(firstWordOfLine(stream))) { + override = "atom"; + return "block"; + } + } + + // tag is an attribute + if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) { + override = "atom"; + return "block"; + } + + // tag is a variable + if (tagVariablesRegexp.test(word)) { + if ((startOfLine(stream) && stream.string.match(/=/)) || + (!startOfLine(stream) && + !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) && + !wordIsTag(firstWordOfLine(stream)))) { + override = "variable-2"; + if (wordIsBlock(firstWordOfLine(stream))) return "block"; + return pushContext(state, stream, "block", 0); + } + } + + if (endOfLine(stream)) return pushContext(state, stream, "block"); + } + if (override == "block-keyword") { + override = "keyword"; + + // Postfix conditionals + if (stream.current(/(if|unless)/) && !startOfLine(stream)) { + return "block"; + } + return pushContext(state, stream, "block"); + } + if (word == "return") return pushContext(state, stream, "block", 0); + + // Placeholder selector + if (override == "variable-2" && stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)) { + return pushContext(state, stream, "block"); + } + } + return state.context.type; + }; + + + /** + * Parens + */ + states.parens = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "parens"); + if (type == ")") { + if (state.context.prev.type == "parens") { + return popContext(state); + } + if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) || + wordIsBlock(firstWordOfLine(stream)) || + /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) || + (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) && + wordIsTag(firstWordOfLine(stream)))) { + return pushContext(state, stream, "block"); + } + if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) || + stream.string.match(/^\s*(\(|\)|[0-9])/) || + stream.string.match(/^\s+[a-z][\w-]*\(/i) || + stream.string.match(/^\s+[\$-]?[a-z]/i)) { + return pushContext(state, stream, "block", 0); + } + if (endOfLine(stream)) return pushContext(state, stream, "block"); + else return pushContext(state, stream, "block", 0); + } + if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) { + override = "variable-2"; + } + if (type == "word") { + var word = stream.current(); + override = wordAsValue(word); + if (override == "tag" && tagVariablesRegexp.test(word)) { + override = "variable-2"; + } + if (override == "property" || word == "to") override = "atom"; + } + if (type == "variable-name") { + return pushContext(state, stream, "variableName"); + } + if (typeIsPseudo(type, stream)) { + return pushContext(state, stream, "pseudo"); + } + return state.context.type; + }; + + + /** + * Vendor prefixes + */ + states.vendorPrefixes = function(type, stream, state) { + if (type == "word") { + override = "property"; + return pushContext(state, stream, "block", 0); + } + return popContext(state); + }; + + + /** + * Pseudo + */ + states.pseudo = function(type, stream, state) { + if (!wordIsProperty(firstWordOfLine(stream.string))) { + stream.match(/^[a-z-]+/); + override = "variable-3"; + if (endOfLine(stream)) return pushContext(state, stream, "block"); + return popContext(state); + } + return popAndPass(type, stream, state); + }; + + + /** + * atBlock + */ + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (typeIsBlock(type, stream)) { + return pushContext(state, stream, "block"); + } + if (typeIsInterpolation(type, stream)) { + return pushContext(state, stream, "interpolation"); + } + if (type == "word") { + var word = stream.current().toLowerCase(); + if (/^(only|not|and|or)$/.test(word)) + override = "keyword"; + else if (documentTypes.hasOwnProperty(word)) + override = "tag"; + else if (mediaTypes.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = "string-2"; + else override = wordAsValue(stream.current()); + if (override == "tag" && endOfLine(stream)) { + return pushContext(state, stream, "block"); + } + } + if (type == "operator" && /^(not|and|or)$/.test(stream.current())) { + override = "keyword"; + } + return state.context.type; + }; + + states.atBlock_parens = function(type, stream, state) { + if (type == "{" || type == "}") return state.context.type; + if (type == ")") { + if (endOfLine(stream)) return pushContext(state, stream, "block"); + else return pushContext(state, stream, "atBlock"); + } + if (type == "word") { + var word = stream.current().toLowerCase(); + override = wordAsValue(word); + if (/^(max|min)/.test(word)) override = "property"; + if (override == "tag") { + tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom"; + } + return state.context.type; + } + return states.atBlock(type, stream, state); + }; + + + /** + * Keyframes + */ + states.keyframes = function(type, stream, state) { + if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash" + || type == "qualifier" || wordIsTag(stream.current()))) { + return popAndPass(type, stream, state); + } + if (type == "{") return pushContext(state, stream, "keyframes"); + if (type == "}") { + if (startOfLine(stream)) return popContext(state, true); + else return pushContext(state, stream, "keyframes"); + } + if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) { + return pushContext(state, stream, "keyframes"); + } + if (type == "word") { + override = wordAsValue(stream.current()); + if (override == "block-keyword") { + override = "keyword"; + return pushContext(state, stream, "keyframes"); + } + } + if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { + return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); + } + if (type == "mixin") { + return pushContext(state, stream, "block", 0); + } + return state.context.type; + }; + + + /** + * Interpolation + */ + states.interpolation = function(type, stream, state) { + if (type == "{") popContext(state) && pushContext(state, stream, "block"); + if (type == "}") { + if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) || + (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) { + return pushContext(state, stream, "block"); + } + if (!stream.string.match(/^(\{|\s*\&)/) || + stream.match(/\s*[\w-]/,false)) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "variable-name") { + return pushContext(state, stream, "variableName", 0); + } + if (type == "word") { + override = wordAsValue(stream.current()); + if (override == "tag") override = "atom"; + } + return state.context.type; + }; + + + /** + * Extend/s + */ + states.extend = function(type, stream, state) { + if (type == "[" || type == "=") return "extend"; + if (type == "]") return popContext(state); + if (type == "word") { + override = wordAsValue(stream.current()); + return "extend"; + } + return popContext(state); + }; + + + /** + * Variable name + */ + states.variableName = function(type, stream, state) { + if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) { + if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2"; + return "variableName"; + } + return popAndPass(type, stream, state); + }; + + + return { + startState: function(base) { + return { + tokenize: null, + state: "block", + context: new Context("block", base || 0, null) + }; + }, + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + state.state = states[state.state](type, stream, state); + return override; + }, + indent: function(state, textAfter, line) { + + var cx = state.context, + ch = textAfter && textAfter.charAt(0), + indent = cx.indent, + lineFirstWord = firstWordOfLine(textAfter), + lineIndent = line.match(/^\s*/)[0].replace(/\t/g, indentUnitString).length, + prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "", + prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent; + + if (cx.prev && + (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") || + ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at"))) { + indent = cx.indent - indentUnit; + } else if (!(/(\})/.test(ch))) { + if (/@|\$|\d/.test(ch) || + /^\{/.test(textAfter) || +/^\s*\/(\/|\*)/.test(textAfter) || + /^\s*\/\*/.test(prevLineFirstWord) || + /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) || +/^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) || +/^return/.test(textAfter) || + wordIsBlock(lineFirstWord)) { + indent = lineIndent; + } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) { + if (/\,\s*$/.test(prevLineFirstWord)) { + indent = prevLineIndent; + } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) { + indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; + } else { + indent = lineIndent; + } + } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) { + if (wordIsBlock(prevLineFirstWord)) { + indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; + } else if (/^\{/.test(prevLineFirstWord)) { + indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit; + } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) { + indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent; + } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) || + /=\s*$/.test(prevLineFirstWord) || + wordIsTag(prevLineFirstWord) || + /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) { + indent = prevLineIndent + indentUnit; + } else { + indent = lineIndent; + } + } + } + return indent; + }, + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "indent" + }; + }); + + // developer.mozilla.org/en-US/docs/Web/HTML/Element + var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"]; + + // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js + // Note, "url-prefix" should precede "url" in order to match correctly in documentTypesRegexp + var documentTypes_ = ["domain", "regexp", "url-prefix", "url"]; + var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]; + var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","dynamic-range","video-dynamic-range"]; + var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"]; + var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"]; + var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]; + var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; + var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","conic-gradient","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","high","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","standard","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around", "unset"]; + + var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"], + blockKeywords_ = ["for","if","else","unless", "from", "to"], + commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"], + commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"]; + + var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_, + propertyKeywords_,nonStandardPropertyKeywords_, + colorKeywords_,valueKeywords_,fontProperties_, + wordOperatorKeywords_,blockKeywords_, + commonAtoms_,commonDef_); + + function wordRegexp(words) { + words = words.sort(function(a,b){return b > a;}); + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) keys[array[i]] = true; + return keys; + } + + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + + CodeMirror.registerHelper("hintWords", "stylus", hintWords); + CodeMirror.defineMIME("text/x-styl", "stylus"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js new file mode 100644 index 0000000000..55e31e2708 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js @@ -0,0 +1,223 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11 + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod) + else + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + function wordSet(words) { + var set = {} + for (var i = 0; i < words.length; i++) set[words[i]] = true + return set + } + + var keywords = wordSet(["_","var","let","class","enum","extension","import","protocol","struct","func","typealias","associatedtype", + "open","public","internal","fileprivate","private","deinit","init","new","override","self","subscript","super", + "convenience","dynamic","final","indirect","lazy","required","static","unowned","unowned(safe)","unowned(unsafe)","weak","as","is", + "break","case","continue","default","else","fallthrough","for","guard","if","in","repeat","switch","where","while", + "defer","return","inout","mutating","nonmutating","catch","do","rethrows","throw","throws","try","didSet","get","set","willSet", + "assignment","associativity","infix","left","none","operator","postfix","precedence","precedencegroup","prefix","right", + "Any","AnyObject","Type","dynamicType","Self","Protocol","__COLUMN__","__FILE__","__FUNCTION__","__LINE__"]) + var definingKeywords = wordSet(["var","let","class","enum","extension","import","protocol","struct","func","typealias","associatedtype","for"]) + var atoms = wordSet(["true","false","nil","self","super","_"]) + var types = wordSet(["Array","Bool","Character","Dictionary","Double","Float","Int","Int8","Int16","Int32","Int64","Never","Optional","Set","String", + "UInt8","UInt16","UInt32","UInt64","Void"]) + var operators = "+-/*%=|&<>~^?!" + var punc = ":;,.(){}[]" + var binary = /^\-?0b[01][01_]*/ + var octal = /^\-?0o[0-7][0-7_]*/ + var hexadecimal = /^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/ + var decimal = /^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/ + var identifier = /^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/ + var property = /^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/ + var instruction = /^\#[A-Za-z]+/ + var attribute = /^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/ + //var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\// + + function tokenBase(stream, state, prev) { + if (stream.sol()) state.indented = stream.indentation() + if (stream.eatSpace()) return null + + var ch = stream.peek() + if (ch == "/") { + if (stream.match("//")) { + stream.skipToEnd() + return "comment" + } + if (stream.match("/*")) { + state.tokenize.push(tokenComment) + return tokenComment(stream, state) + } + } + if (stream.match(instruction)) return "builtin" + if (stream.match(attribute)) return "attribute" + if (stream.match(binary)) return "number" + if (stream.match(octal)) return "number" + if (stream.match(hexadecimal)) return "number" + if (stream.match(decimal)) return "number" + if (stream.match(property)) return "property" + if (operators.indexOf(ch) > -1) { + stream.next() + return "operator" + } + if (punc.indexOf(ch) > -1) { + stream.next() + stream.match("..") + return "punctuation" + } + var stringMatch + if (stringMatch = stream.match(/("""|"|')/)) { + var tokenize = tokenString.bind(null, stringMatch[0]) + state.tokenize.push(tokenize) + return tokenize(stream, state) + } + + if (stream.match(identifier)) { + var ident = stream.current() + if (types.hasOwnProperty(ident)) return "variable-2" + if (atoms.hasOwnProperty(ident)) return "atom" + if (keywords.hasOwnProperty(ident)) { + if (definingKeywords.hasOwnProperty(ident)) + state.prev = "define" + return "keyword" + } + if (prev == "define") return "def" + return "variable" + } + + stream.next() + return null + } + + function tokenUntilClosingParen() { + var depth = 0 + return function(stream, state, prev) { + var inner = tokenBase(stream, state, prev) + if (inner == "punctuation") { + if (stream.current() == "(") ++depth + else if (stream.current() == ")") { + if (depth == 0) { + stream.backUp(1) + state.tokenize.pop() + return state.tokenize[state.tokenize.length - 1](stream, state) + } + else --depth + } + } + return inner + } + } + + function tokenString(openQuote, stream, state) { + var singleLine = openQuote.length == 1 + var ch, escaped = false + while (ch = stream.peek()) { + if (escaped) { + stream.next() + if (ch == "(") { + state.tokenize.push(tokenUntilClosingParen()) + return "string" + } + escaped = false + } else if (stream.match(openQuote)) { + state.tokenize.pop() + return "string" + } else { + stream.next() + escaped = ch == "\\" + } + } + if (singleLine) { + state.tokenize.pop() + } + return "string" + } + + function tokenComment(stream, state) { + var ch + while (true) { + stream.match(/^[^/*]+/, true) + ch = stream.next() + if (!ch) break + if (ch === "/" && stream.eat("*")) { + state.tokenize.push(tokenComment) + } else if (ch === "*" && stream.eat("/")) { + state.tokenize.pop() + } + } + return "comment" + } + + function Context(prev, align, indented) { + this.prev = prev + this.align = align + this.indented = indented + } + + function pushContext(state, stream) { + var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1 + state.context = new Context(state.context, align, state.indented) + } + + function popContext(state) { + if (state.context) { + state.indented = state.context.indented + state.context = state.context.prev + } + } + + CodeMirror.defineMode("swift", function(config) { + return { + startState: function() { + return { + prev: null, + context: null, + indented: 0, + tokenize: [] + } + }, + + token: function(stream, state) { + var prev = state.prev + state.prev = null + var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase + var style = tokenize(stream, state, prev) + if (!style || style == "comment") state.prev = prev + else if (!state.prev) state.prev = style + + if (style == "punctuation") { + var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current()) + if (bracket) (bracket[1] ? popContext : pushContext)(state, stream) + } + + return style + }, + + indent: function(state, textAfter) { + var cx = state.context + if (!cx) return 0 + var closing = /^[\]\}\)]/.test(textAfter) + if (cx.align != null) return cx.align - (closing ? 1 : 0) + return cx.indented + (closing ? 0 : config.indentUnit) + }, + + electricInput: /^\s*[\)\}\]]$/, + + lineComment: "//", + blockCommentStart: "/*", + blockCommentEnd: "*/", + fold: "brace", + closeBrackets: "()[]{}''\"\"``" + } + }) + + CodeMirror.defineMIME("text/x-swift","swift") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js new file mode 100644 index 0000000000..dec0662a60 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js @@ -0,0 +1,140 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tcl", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + + "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + + "binary break catch cd close concat continue dde eof encoding error " + + "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + + "filename flush for foreach format gets glob global history http if " + + "incr info interp join lappend lindex linsert list llength load lrange " + + "lreplace lsearch lset lsort memory msgcat namespace open package parray " + + "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + + "registry regsub rename resource return scan seek set socket source split " + + "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + + "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + + "tclvars tell time trace unknown unset update uplevel upvar variable " + + "vwait"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if ((ch == '"' || ch == "'") && state.inParams) { + return chain(stream, state, tokenString(ch)); + } else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } else if (ch == "#") { + if (stream.eat("*")) + return chain(stream, state, tokenComment); + if (ch == "#" && stream.match(/ *\[ *\[/)) + return chain(stream, state, tokenUnparsed); + stream.skipToEnd(); + return "comment"; + } else if (ch == '"') { + stream.skipTo(/"/); + return "comment"; + } else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); + stream.eatWhile(/}/); + state.beforeParams = true; + return "builtin"; + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "comment"; + } else { + stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + lineComment: "#" + }; +}); +CodeMirror.defineMIME("text/x-tcl", "tcl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js new file mode 100644 index 0000000000..b378fb61f5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js @@ -0,0 +1,469 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") { // CommonJS + mod(require("../../lib/codemirror")); + } else if (typeof define == "function" && define.amd) { // AMD + define(["../../lib/codemirror"], mod); + } else { // Plain browser env + mod(CodeMirror); + } +})(function(CodeMirror) { + "use strict"; + + var TOKEN_STYLES = { + addition: "positive", + attributes: "attribute", + bold: "strong", + cite: "keyword", + code: "atom", + definitionList: "number", + deletion: "negative", + div: "punctuation", + em: "em", + footnote: "variable", + footCite: "qualifier", + header: "header", + html: "comment", + image: "string", + italic: "em", + link: "link", + linkDefinition: "link", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + notextile: "string-2", + pre: "operator", + p: "property", + quote: "bracket", + span: "quote", + specialChar: "tag", + strong: "strong", + sub: "builtin", + sup: "builtin", + table: "variable-3", + tableHeading: "operator" + }; + + function startNewLine(stream, state) { + state.mode = Modes.newLayout; + state.tableHeading = false; + + if (state.layoutType === "definitionList" && state.spanningLayout && + stream.match(RE("definitionListEnd"), false)) + state.spanningLayout = false; + } + + function handlePhraseModifier(stream, state, ch) { + if (ch === "_") { + if (stream.eat("_")) + return togglePhraseModifier(stream, state, "italic", /__/, 2); + else + return togglePhraseModifier(stream, state, "em", /_/, 1); + } + + if (ch === "*") { + if (stream.eat("*")) { + return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); + } + return togglePhraseModifier(stream, state, "strong", /\*/, 1); + } + + if (ch === "[") { + if (stream.match(/\d+\]/)) state.footCite = true; + return tokenStyles(state); + } + + if (ch === "(") { + var spec = stream.match(/^(r|tm|c)\)/); + if (spec) + return tokenStylesWith(state, TOKEN_STYLES.specialChar); + } + + if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) + return tokenStylesWith(state, TOKEN_STYLES.html); + + if (ch === "?" && stream.eat("?")) + return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); + + if (ch === "=" && stream.eat("=")) + return togglePhraseModifier(stream, state, "notextile", /==/, 2); + + if (ch === "-" && !stream.eat("-")) + return togglePhraseModifier(stream, state, "deletion", /-/, 1); + + if (ch === "+") + return togglePhraseModifier(stream, state, "addition", /\+/, 1); + + if (ch === "~") + return togglePhraseModifier(stream, state, "sub", /~/, 1); + + if (ch === "^") + return togglePhraseModifier(stream, state, "sup", /\^/, 1); + + if (ch === "%") + return togglePhraseModifier(stream, state, "span", /%/, 1); + + if (ch === "@") + return togglePhraseModifier(stream, state, "code", /@/, 1); + + if (ch === "!") { + var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); + stream.match(/^:\S+/); // optional Url portion + return type; + } + return tokenStyles(state); + } + + function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { + var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; + var charAfter = stream.peek(); + if (state[phraseModifier]) { + if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { + var type = tokenStyles(state); + state[phraseModifier] = false; + return type; + } + } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && + stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { + state[phraseModifier] = true; + state.mode = Modes.attributes; + } + return tokenStyles(state); + }; + + function tokenStyles(state) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var styles = []; + if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); + + styles = styles.concat(activeStyles( + state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", + "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); + + if (state.layoutType === "header") + styles.push(TOKEN_STYLES.header + "-" + state.header); + + return styles.length ? styles.join(" ") : null; + } + + function textileDisabled(state) { + var type = state.layoutType; + + switch(type) { + case "notextile": + case "code": + case "pre": + return TOKEN_STYLES[type]; + default: + if (state.notextile) + return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); + return null; + } + } + + function tokenStylesWith(state, extraStyles) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var type = tokenStyles(state); + if (extraStyles) + return type ? (type + " " + extraStyles) : extraStyles; + else + return type; + } + + function activeStyles(state) { + var styles = []; + for (var i = 1; i < arguments.length; ++i) { + if (state[arguments[i]]) + styles.push(TOKEN_STYLES[arguments[i]]); + } + return styles; + } + + function blankLine(state) { + var spanningLayout = state.spanningLayout, type = state.layoutType; + + for (var key in state) if (state.hasOwnProperty(key)) + delete state[key]; + + state.mode = Modes.newLayout; + if (spanningLayout) { + state.layoutType = type; + state.spanningLayout = true; + } + } + + var REs = { + cache: {}, + single: { + bc: "bc", + bq: "bq", + definitionList: /- .*?:=+/, + definitionListEnd: /.*=:\s*$/, + div: "div", + drawTable: /\|.*\|/, + foot: /fn\d+/, + header: /h[1-6]/, + html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, + link: /[^"]+":\S/, + linkDefinition: /\[[^\s\]]+\]\S+/, + list: /(?:#+|\*+)/, + notextile: "notextile", + para: "p", + pre: "pre", + table: "table", + tableCellAttributes: /[\/\\]\d+/, + tableHeading: /\|_\./, + tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, + text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ + }, + attributes: { + align: /(?:<>|<|>|=)/, + selector: /\([^\(][^\)]+\)/, + lang: /\[[^\[\]]+\]/, + pad: /(?:\(+|\)+){1,2}/, + css: /\{[^\}]+\}/ + }, + createRe: function(name) { + switch (name) { + case "drawTable": + return REs.makeRe("^", REs.single.drawTable, "$"); + case "html": + return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); + case "linkDefinition": + return REs.makeRe("^", REs.single.linkDefinition, "$"); + case "listLayout": + return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); + case "tableCellAttributes": + return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, + RE("allAttributes")), "+\\."); + case "type": + return REs.makeRe("^", RE("allTypes")); + case "typeLayout": + return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), + "*\\.\\.?", "(\\s+|$)"); + case "attributes": + return REs.makeRe("^", RE("allAttributes"), "+"); + + case "allTypes": + return REs.choiceRe(REs.single.div, REs.single.foot, + REs.single.header, REs.single.bc, REs.single.bq, + REs.single.notextile, REs.single.pre, REs.single.table, + REs.single.para); + + case "allAttributes": + return REs.choiceRe(REs.attributes.selector, REs.attributes.css, + REs.attributes.lang, REs.attributes.align, REs.attributes.pad); + + default: + return REs.makeRe("^", REs.single[name]); + } + }, + makeRe: function() { + var pattern = ""; + for (var i = 0; i < arguments.length; ++i) { + var arg = arguments[i]; + pattern += (typeof arg === "string") ? arg : arg.source; + } + return new RegExp(pattern); + }, + choiceRe: function() { + var parts = [arguments[0]]; + for (var i = 1; i < arguments.length; ++i) { + parts[i * 2 - 1] = "|"; + parts[i * 2] = arguments[i]; + } + + parts.unshift("(?:"); + parts.push(")"); + return REs.makeRe.apply(null, parts); + } + }; + + function RE(name) { + return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); + } + + var Modes = { + newLayout: function(stream, state) { + if (stream.match(RE("typeLayout"), false)) { + state.spanningLayout = false; + return (state.mode = Modes.blockType)(stream, state); + } + var newMode; + if (!textileDisabled(state)) { + if (stream.match(RE("listLayout"), false)) + newMode = Modes.list; + else if (stream.match(RE("drawTable"), false)) + newMode = Modes.table; + else if (stream.match(RE("linkDefinition"), false)) + newMode = Modes.linkDefinition; + else if (stream.match(RE("definitionList"))) + newMode = Modes.definitionList; + else if (stream.match(RE("html"), false)) + newMode = Modes.html; + } + return (state.mode = (newMode || Modes.text))(stream, state); + }, + + blockType: function(stream, state) { + var match, type; + state.layoutType = null; + + if (match = stream.match(RE("type"))) + type = match[0]; + else + return (state.mode = Modes.text)(stream, state); + + if (match = type.match(RE("header"))) { + state.layoutType = "header"; + state.header = parseInt(match[0][1]); + } else if (type.match(RE("bq"))) { + state.layoutType = "quote"; + } else if (type.match(RE("bc"))) { + state.layoutType = "code"; + } else if (type.match(RE("foot"))) { + state.layoutType = "footnote"; + } else if (type.match(RE("notextile"))) { + state.layoutType = "notextile"; + } else if (type.match(RE("pre"))) { + state.layoutType = "pre"; + } else if (type.match(RE("div"))) { + state.layoutType = "div"; + } else if (type.match(RE("table"))) { + state.layoutType = "table"; + } + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + text: function(stream, state) { + if (stream.match(RE("text"))) return tokenStyles(state); + + var ch = stream.next(); + if (ch === '"') + return (state.mode = Modes.link)(stream, state); + return handlePhraseModifier(stream, state, ch); + }, + + attributes: function(stream, state) { + state.mode = Modes.layoutLength; + + if (stream.match(RE("attributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + layoutLength: function(stream, state) { + if (stream.eat(".") && stream.eat(".")) + state.spanningLayout = true; + + state.mode = Modes.text; + return tokenStyles(state); + }, + + list: function(stream, state) { + var match = stream.match(RE("list")); + state.listDepth = match[0].length; + var listMod = (state.listDepth - 1) % 3; + if (!listMod) + state.layoutType = "list1"; + else if (listMod === 1) + state.layoutType = "list2"; + else + state.layoutType = "list3"; + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + link: function(stream, state) { + state.mode = Modes.text; + if (stream.match(RE("link"))) { + stream.match(/\S+/); + return tokenStylesWith(state, TOKEN_STYLES.link); + } + return tokenStyles(state); + }, + + linkDefinition: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); + }, + + definitionList: function(stream, state) { + stream.match(RE("definitionList")); + + state.layoutType = "definitionList"; + + if (stream.match(/\s*$/)) + state.spanningLayout = true; + else + state.mode = Modes.attributes; + + return tokenStyles(state); + }, + + html: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.html); + }, + + table: function(stream, state) { + state.layoutType = "table"; + return (state.mode = Modes.tableCell)(stream, state); + }, + + tableCell: function(stream, state) { + if (stream.match(RE("tableHeading"))) + state.tableHeading = true; + else + stream.eat("|"); + + state.mode = Modes.tableCellAttributes; + return tokenStyles(state); + }, + + tableCellAttributes: function(stream, state) { + state.mode = Modes.tableText; + + if (stream.match(RE("tableCellAttributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + tableText: function(stream, state) { + if (stream.match(RE("tableText"))) + return tokenStyles(state); + + if (stream.peek() === "|") { // end of cell + state.mode = Modes.tableCell; + return tokenStyles(state); + } + return handlePhraseModifier(stream, state, stream.next()); + } + }; + + CodeMirror.defineMode("textile", function() { + return { + startState: function() { + return { mode: Modes.newLayout }; + }, + token: function(stream, state) { + if (stream.sol()) startNewLine(stream, state); + return state.mode(stream, state); + }, + blankLine: blankLine + }; + }); + + CodeMirror.defineMIME("text/x-textile", "textile"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css new file mode 100644 index 0000000000..9a69b639f8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css @@ -0,0 +1,14 @@ +span.cm-underlined { + text-decoration: underline; +} +span.cm-strikethrough { + text-decoration: line-through; +} +span.cm-brace { + color: #170; + font-weight: bold; +} +span.cm-table { + color: blue; + font-weight: bold; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js new file mode 100644 index 0000000000..6a9ce447ba --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js @@ -0,0 +1,308 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/*** + |''Name''|tiddlywiki.js| + |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| + |''Author''|PMario| + |''Version''|0.1.7| + |''Status''|''stable''| + |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| + |''Documentation''|https://codemirror.tiddlyspace.com/| + |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| + |''CoreVersion''|2.5.0| + |''Requires''|codemirror.js| + |''Keywords''|syntax highlighting color code mirror codemirror| + ! Info + CoreVersion parameter is needed for TiddlyWiki only! +***/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tiddlywiki", function () { + // Tokenizer + var textwords = {}; + + var keywords = { + "allTags": true, "closeAll": true, "list": true, + "newJournal": true, "newTiddler": true, + "permaview": true, "saveChanges": true, + "search": true, "slider": true, "tabs": true, + "tag": true, "tagging": true, "tags": true, + "tiddler": true, "timeline": true, + "today": true, "version": true, "option": true, + "with": true, "filter": true + }; + + var isSpaceName = /[\w_\-]/i, + reHR = /^\-\-\-\-+$/, //
+ reWikiCommentStart = /^\/\*\*\*$/, // /*** + reWikiCommentStop = /^\*\*\*\/$/, // ***/ + reBlockQuote = /^<<<$/, + + reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start + reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop + reXmlCodeStart = /^$/, // xml block start + reXmlCodeStop = /^$/, // xml stop + + reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start + reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop + + reUntilCodeStop = /.*?\}\}\}/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenBase(stream, state) { + var sol = stream.sol(), ch = stream.peek(); + + state.block = false; // indicates the start of a code block. + + // check start of blocks + if (sol && /[<\/\*{}\-]/.test(ch)) { + if (stream.match(reCodeBlockStart)) { + state.block = true; + return chain(stream, state, twTokenCode); + } + if (stream.match(reBlockQuote)) + return 'quote'; + if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) + return 'comment'; + if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) + return 'comment'; + if (stream.match(reHR)) + return 'hr'; + } + + stream.next(); + if (sol && /[\/\*!#;:>|]/.test(ch)) { + if (ch == "!") { // tw header + stream.skipToEnd(); + return "header"; + } + if (ch == "*") { // tw list + stream.eatWhile('*'); + return "comment"; + } + if (ch == "#") { // tw numbered list + stream.eatWhile('#'); + return "comment"; + } + if (ch == ";") { // definition list, term + stream.eatWhile(';'); + return "comment"; + } + if (ch == ":") { // definition list, description + stream.eatWhile(':'); + return "comment"; + } + if (ch == ">") { // single line quote + stream.eatWhile(">"); + return "quote"; + } + if (ch == '|') + return 'header'; + } + + if (ch == '{' && stream.match('{{')) + return chain(stream, state, twTokenCode); + + // rudimentary html:// file:// link matching. TW knows much more ... + if (/[hf]/i.test(ch) && + /[ti]/i.test(stream.peek()) && + stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) + return "link"; + + // just a little string indicator, don't want to have the whole string covered + if (ch == '"') + return 'string'; + + if (ch == '~') // _no_ CamelCase indicator should be bold + return 'brace'; + + if (/[\[\]]/.test(ch) && stream.match(ch)) // check for [[..]] + return 'brace'; + + if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting + stream.eatWhile(isSpaceName); + return "link"; + } + + if (/\d/.test(ch)) { // numbers + stream.eatWhile(/\d/); + return "number"; + } + + if (ch == "/") { // tw invisible comment + if (stream.eat("%")) { + return chain(stream, state, twTokenComment); + } else if (stream.eat("/")) { // + return chain(stream, state, twTokenEm); + } + } + + if (ch == "_" && stream.eat("_")) // tw underline + return chain(stream, state, twTokenUnderline); + + // strikethrough and mdash handling + if (ch == "-" && stream.eat("-")) { + // if strikethrough looks ugly, change CSS. + if (stream.peek() != ' ') + return chain(stream, state, twTokenStrike); + // mdash + if (stream.peek() == ' ') + return 'brace'; + } + + if (ch == "'" && stream.eat("'")) // tw bold + return chain(stream, state, twTokenStrong); + + if (ch == "<" && stream.eat("<")) // tw macro + return chain(stream, state, twTokenMacro); + + // core macro handling + stream.eatWhile(/[\w\$_]/); + return textwords.propertyIsEnumerable(stream.current()) ? "keyword" : null + } + + // tw invisible comment + function twTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "%"); + } + return "comment"; + } + + // tw strong / bold + function twTokenStrong(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "'" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "'"); + } + return "strong"; + } + + // tw code + function twTokenCode(stream, state) { + var sb = state.block; + + if (sb && stream.current()) { + return "comment"; + } + + if (!sb && stream.match(reUntilCodeStop)) { + state.tokenize = tokenBase; + return "comment"; + } + + if (sb && stream.sol() && stream.match(reCodeBlockStop)) { + state.tokenize = tokenBase; + return "comment"; + } + + stream.next(); + return "comment"; + } + + // tw em / italic + function twTokenEm(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "/"); + } + return "em"; + } + + // tw underlined text + function twTokenUnderline(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "_" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "_"); + } + return "underlined"; + } + + // tw strike through text looks ugly + // change CSS if needed + function twTokenStrike(stream, state) { + var maybeEnd = false, ch; + + while (ch = stream.next()) { + if (ch == "-" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "-"); + } + return "strikethrough"; + } + + // macro + function twTokenMacro(stream, state) { + if (stream.current() == '<<') { + return 'macro'; + } + + var ch = stream.next(); + if (!ch) { + state.tokenize = tokenBase; + return null; + } + if (ch == ">") { + if (stream.peek() == '>') { + stream.next(); + state.tokenize = tokenBase; + return "macro"; + } + } + + stream.eatWhile(/[\w\$_]/); + return keywords.propertyIsEnumerable(stream.current()) ? "keyword" : null + } + + // Interface + return { + startState: function () { + return {tokenize: tokenBase}; + }, + + token: function (stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css new file mode 100644 index 0000000000..1d8704c780 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css @@ -0,0 +1,26 @@ +.cm-tw-syntaxerror { + color: #FFF; + background-color: #900; +} + +.cm-tw-deleted { + text-decoration: line-through; +} + +.cm-tw-header5 { + font-weight: bold; +} +.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ + padding-left: 10px; +} + +.cm-tw-box { + border-top-width: 0px !important; + border-style: solid; + border-width: 1px; + border-color: inherit; +} + +.cm-tw-underline { + text-decoration: underline; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js new file mode 100644 index 0000000000..092b859532 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js @@ -0,0 +1,312 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('tiki', function(config) { + function inBlock(style, terminator, returnTokenizer) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + + if (returnTokenizer) state.tokenize = returnTokenizer; + + return style; + }; + } + + function inLine(style) { + return function(stream, state) { + while(!stream.eol()) { + stream.next(); + } + state.tokenize = inText; + return style; + }; + } + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var sol = stream.sol(); + var ch = stream.next(); + + //non start of line + switch (ch) { //switch is generally much faster than if, so it is used here + case "{": //plugin + stream.eat("/"); + stream.eatSpace(); + stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/); + state.tokenize = inPlugin; + return "tag"; + case "_": //bold + if (stream.eat("_")) + return chain(inBlock("strong", "__", inText)); + break; + case "'": //italics + if (stream.eat("'")) + return chain(inBlock("em", "''", inText)); + break; + case "(":// Wiki Link + if (stream.eat("(")) + return chain(inBlock("variable-2", "))", inText)); + break; + case "[":// Weblink + return chain(inBlock("variable-3", "]", inText)); + break; + case "|": //table + if (stream.eat("|")) + return chain(inBlock("comment", "||")); + break; + case "-": + if (stream.eat("=")) {//titleBar + return chain(inBlock("header string", "=-", inText)); + } else if (stream.eat("-")) {//deleted + return chain(inBlock("error tw-deleted", "--", inText)); + } + break; + case "=": //underline + if (stream.match("==")) + return chain(inBlock("tw-underline", "===", inText)); + break; + case ":": + if (stream.eat(":")) + return chain(inBlock("comment", "::")); + break; + case "^": //box + return chain(inBlock("tw-box", "^")); + break; + case "~": //np + if (stream.match("np~")) + return chain(inBlock("meta", "~/np~")); + break; + } + + //start of line types + if (sol) { + switch (ch) { + case "!": //header at start of line + if (stream.match('!!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!')) { + return chain(inLine("header string")); + } else { + return chain(inLine("header string")); + } + break; + case "*": //unordered list line item, or
  • at start of line + case "#": //ordered list line item, or
  • at start of line + case "+": //ordered list line item, or
  • at start of line + return chain(inLine("tw-listitem bracket")); + break; + } + } + + //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki + return null; + } + + var indentUnit = config.indentUnit; + + // Return variables for tokenizers + var pluginName, type; + function inPlugin(stream, state) { + var ch = stream.next(); + var peek = stream.peek(); + + if (ch == "}") { + state.tokenize = inText; + //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin + return "tag"; + } else if (ch == "(" || ch == ")") { + return "bracket"; + } else if (ch == "=") { + type = "equals"; + + if (peek == ">") { + stream.next(); + peek = stream.peek(); + } + + //here we detect values directly after equal character with no quotes + if (!/[\'\"]/.test(peek)) { + state.tokenize = inAttributeNoQuote(); + } + //end detect values + + return "operator"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + return state.tokenize(stream, state); + } else { + stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); + return "keyword"; + } + } + + function inAttribute(quote) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inPlugin; + break; + } + } + return "string"; + }; + } + + function inAttributeNoQuote() { + return function(stream, state) { + while (!stream.eol()) { + var ch = stream.next(); + var peek = stream.peek(); + if (ch == " " || ch == "," || /[ )}]/.test(peek)) { + state.tokenize = inPlugin; + break; + } + } + return "string"; +}; + } + +var curState, setStyle; +function pass() { + for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); +} + +function cont() { + pass.apply(null, arguments); + return true; +} + +function pushContext(pluginName, startOfLine) { + var noIndent = curState.context && curState.context.noIndent; + curState.context = { + prev: curState.context, + pluginName: pluginName, + indent: curState.indented, + startOfLine: startOfLine, + noIndent: noIndent + }; +} + +function popContext() { + if (curState.context) curState.context = curState.context.prev; +} + +function element(type) { + if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} + else if (type == "closePlugin") { + var err = false; + if (curState.context) { + err = curState.context.pluginName != pluginName; + popContext(); + } else { + err = true; + } + if (err) setStyle = "error"; + return cont(endcloseplugin(err)); + } + else if (type == "string") { + if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); + if (curState.tokenize == inText) popContext(); + return cont(); + } + else return cont(); +} + +function endplugin(startOfLine) { + return function(type) { + if ( + type == "selfclosePlugin" || + type == "endPlugin" + ) + return cont(); + if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} + return cont(); + }; +} + +function endcloseplugin(err) { + return function(type) { + if (err) setStyle = "error"; + if (type == "endPlugin") return cont(); + return pass(); + }; +} + +function attributes(type) { + if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} + if (type == "equals") return cont(attvalue, attributes); + return pass(); +} +function attvalue(type) { + if (type == "keyword") {setStyle = "string"; return cont();} + if (type == "string") return cont(attvaluemaybe); + return pass(); +} +function attvaluemaybe(type) { + if (type == "string") return cont(attvaluemaybe); + else return pass(); +} +return { + startState: function() { + return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; + }, + token: function(stream, state) { + if (stream.sol()) { + state.startOfLine = true; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + + setStyle = type = pluginName = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + curState = state; + while (true) { + var comb = state.cc.pop() || element; + if (comb(type || style)) break; + } + } + state.startOfLine = false; + return setStyle || style; + }, + indent: function(state, textAfter) { + var context = state.context; + if (context && context.noIndent) return 0; + if (context && /^{\//.test(textAfter)) + context = context.prev; + while (context && !context.startOfLine) + context = context.prev; + if (context) return context.indent + indentUnit; + else return 0; + }, + electricChars: "/" +}; +}); + +CodeMirror.defineMIME("text/tiki", "tiki"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js new file mode 100644 index 0000000000..891f384b5b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js @@ -0,0 +1,88 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("toml", function () { + return { + startState: function () { + return { + inString: false, + stringType: "", + lhs: true, + inArray: 0 + }; + }, + token: function (stream, state) { + //check for state changes + if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (stream.sol() && state.inArray === 0) { + state.lhs = true; + } + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inArray && stream.peek() === ']') { + stream.next(); + state.inArray--; + return 'bracket'; + } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { + stream.next();//skip closing ] + // array of objects has an extra open & close [] + if (stream.peek() === ']') stream.next(); + return "atom"; + } else if (stream.peek() === "#") { + stream.skipToEnd(); + return "comment"; + } else if (stream.eatSpace()) { + return null; + } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { + return "property"; + } else if (state.lhs && stream.peek() === "=") { + stream.next(); + state.lhs = false; + return null; + } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { + return 'atom'; //date + } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { + return 'atom'; + } else if (!state.lhs && stream.peek() === '[') { + state.inArray++; + stream.next(); + return 'bracket'; + } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { + return 'number'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME('text/x-toml', 'toml'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js new file mode 100644 index 0000000000..aa589a08c3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js @@ -0,0 +1,68 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("tornado:inner", function() { + var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", + "continue","datetime","def","del","elif","else","end","escape","except", + "exec","extends","false","finally","for","from","global","if","import","in", + "include","is","json_encode","lambda","length","linkify","load","module", + "none","not","or","pass","print","put","raise","raw","return","self","set", + "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; + keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + stream.eatWhile(/[^\{]/); + var ch = stream.next(); + if (ch == "{") { + if (ch = stream.eat(/\{|%|#/)) { + state.tokenize = inTag(ch); + return "tag"; + } + } + } + function inTag (close) { + if (close == "{") { + close = "}"; + } + return function (stream, state) { + var ch = stream.next(); + if ((ch == close) && stream.eat("}")) { + state.tokenize = tokenBase; + return "tag"; + } + if (stream.match(keywords)) { + return "keyword"; + } + return close == "#" ? "comment" : "string"; + }; + } + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + } + }; + }); + + CodeMirror.defineMode("tornado", function(config) { + var htmlBase = CodeMirror.getMode(config, "text/html"); + var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); + return CodeMirror.overlayMode(htmlBase, tornadoInner); + }); + + CodeMirror.defineMIME("text/x-tornado", "tornado"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js new file mode 100644 index 0000000000..0c2220d2cc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js @@ -0,0 +1,84 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('troff', function() { + + var words = {}; + + function tokenBase(stream) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + if (stream.match('fB') || stream.match('fR') || stream.match('fI') || + stream.match('u') || stream.match('d') || + stream.match('%') || stream.match('&')) { + return 'string'; + } + if (stream.match('m[')) { + stream.skipTo(']'); + stream.next(); + return 'string'; + } + if (stream.match('s+') || stream.match('s-')) { + stream.eatWhile(/[\d-]/); + return 'string'; + } + if (stream.match('\(') || stream.match('*\(')) { + stream.eatWhile(/[\w-]/); + return 'string'; + } + return 'string'; + } + if (sol && (ch === '.' || ch === '\'')) { + if (stream.eat('\\') && stream.eat('\"')) { + stream.skipToEnd(); + return 'comment'; + } + } + if (sol && ch === '.') { + if (stream.match('B ') || stream.match('I ') || stream.match('R ')) { + return 'attribute'; + } + if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) { + stream.skipToEnd(); + return 'quote'; + } + if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) { + return 'attribute'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME('text/troff', 'troff'); +CodeMirror.defineMIME('text/x-troff', 'troff'); +CodeMirror.defineMIME('application/x-troff', 'troff'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js new file mode 100644 index 0000000000..9d4b8405af --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js @@ -0,0 +1,214 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {}, + externalCommands = parserConfig.externalCommands || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[\|]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[:=]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "#"){ + stream.skipToEnd(); + return "comment"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + if (ch == "["){ + stream.eatWhile(/[\w_\]]/); + return "number sectionTitle"; + } + + stream.eatWhile(/[\w\$_]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (fileNCtrlMaskOptions.propertyIsEnumerable(cur)) + return "negative fileNCtrlMaskOptions"; + if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterNext = stream.peek(); + //look if the character if the quote is like the B in '10100010'B + if (afterNext){ + afterNext = afterNext.toLowerCase(); + if(afterNext == "b" || afterNext == "h" || afterNext == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") + && curPunc != ';') || (ctx.type == "statement" + && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + electricChars: "{}", + lineComment: "#", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) + obj[words[i]] = true; + return obj; + } + + CodeMirror.defineMIME("text/x-ttcn-cfg", { + name: "ttcn-cfg", + keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" + + " TimeStampFormat LogEventTypes SourceInfoFormat" + + " LogEntityName LogSourceInfo DiskFullAction" + + " LogFileNumber LogFileSize MatchingHints Detailed" + + " Compact SubCategories Stack Single None Seconds" + + " DateTime Time Stop Error Retry Delete TCPPort KillTimer" + + " NumHCs UnixSocketsEnabled LocalAddress"), + fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" + + " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" + + " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" + + " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" + + " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" + + " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" + + " VERDICTOP DEFAULTOP TESTCASE ACTION USER" + + " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" + + " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" + + " DEBUG_ENCDEC DEBUG_TESTPORT" + + " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" + + " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" + + " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" + + " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" + + " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" + + " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" + + " FUNCTION_RND FUNCTION_UNQUALIFIED" + + " MATCHING_DONE MATCHING_MCSUCCESS" + + " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" + + " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" + + " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" + + " MATCHING_PMUNSUCC MATCHING_PROBLEM" + + " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" + + " PARALLEL_PORTCONN PARALLEL_PORTMAP" + + " PARALLEL_PTC PARALLEL_UNQUALIFIED" + + " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" + + " PORTEVENT_MCRECV PORTEVENT_MCSEND" + + " PORTEVENT_MMRECV PORTEVENT_MMSEND" + + " PORTEVENT_MQUEUE PORTEVENT_PCIN" + + " PORTEVENT_PCOUT PORTEVENT_PMIN" + + " PORTEVENT_PMOUT PORTEVENT_PQUEUE" + + " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" + + " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" + + " TESTCASE_FINISH TESTCASE_START" + + " TESTCASE_UNQUALIFIED TIMEROP_GUARD" + + " TIMEROP_READ TIMEROP_START TIMEROP_STOP" + + " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" + + " USER_UNQUALIFIED VERDICTOP_FINAL" + + " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" + + " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"), + externalCommands: words("BeginControlPart EndControlPart BeginTestCase" + + " EndTestCase"), + multiLineStrings: true + }); +}); \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js new file mode 100644 index 0000000000..0304e7c53d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js @@ -0,0 +1,283 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ttcn", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + builtin = parserConfig.builtin || {}, + timerOps = parserConfig.timerOps || {}, + portOps = parserConfig.portOps || {}, + configOps = parserConfig.configOps || {}, + verdictOps = parserConfig.verdictOps || {}, + sutOps = parserConfig.sutOps || {}, + functionOps = parserConfig.functionOps || {}, + + verdictConsts = parserConfig.verdictConsts || {}, + booleanConsts = parserConfig.booleanConsts || {}, + otherConsts = parserConfig.otherConsts || {}, + + types = parserConfig.types || {}, + visibilityModifiers = parserConfig.visibilityModifiers || {}, + templateMatch = parserConfig.templateMatch || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[+\-*&@=<>!\/]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "#"){ + stream.skipToEnd(); + return "atom preprocessor"; + } + if (ch == "%"){ + stream.eatWhile(/\b/); + return "atom ttcn3Macros"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + if(ch == "@"){ + if(stream.match("try") || stream.match("catch") + || stream.match("lazy")){ + return "keyword"; + } + } + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (builtin.propertyIsEnumerable(cur)) return "builtin"; + + if (timerOps.propertyIsEnumerable(cur)) return "def timerOps"; + if (configOps.propertyIsEnumerable(cur)) return "def configOps"; + if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps"; + if (portOps.propertyIsEnumerable(cur)) return "def portOps"; + if (sutOps.propertyIsEnumerable(cur)) return "def sutOps"; + if (functionOps.propertyIsEnumerable(cur)) return "def functionOps"; + + if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts"; + if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts"; + if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts"; + + if (types.propertyIsEnumerable(cur)) return "builtin types"; + if (visibilityModifiers.propertyIsEnumerable(cur)) + return "builtin visibilityModifiers"; + if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterQuote = stream.peek(); + //look if the character after the quote is like the B in '10100010'B + if (afterQuote){ + afterQuote = afterQuote.toLowerCase(); + if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || + (ctx.type == "statement" && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + + state.startOfLine = false; + + return style; + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + + add(mode.keywords); + add(mode.builtin); + add(mode.timerOps); + add(mode.portOps); + + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], { + name: "ttcn", + keywords: words("activate address alive all alt altstep and and4b any" + + " break case component const continue control deactivate" + + " display do else encode enumerated except exception" + + " execute extends extension external for from function" + + " goto group if import in infinity inout interleave" + + " label language length log match message mixed mod" + + " modifies module modulepar mtc noblock not not4b nowait" + + " of on optional or or4b out override param pattern port" + + " procedure record recursive rem repeat return runs select" + + " self sender set signature system template testcase to" + + " type union value valueof var variant while with xor xor4b"), + builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" + + " decomp decvalue float2int float2str hex2bit hex2int" + + " hex2oct hex2str int2bit int2char int2float int2hex" + + " int2oct int2str int2unichar isbound ischosen ispresent" + + " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" + + " oct2str regexp replace rnd sizeof str2bit str2float" + + " str2hex str2int str2oct substr unichar2int unichar2char" + + " enum2int"), + types: words("anytype bitstring boolean char charstring default float" + + " hexstring integer objid octetstring universal verdicttype timer"), + timerOps: words("read running start stop timeout"), + portOps: words("call catch check clear getcall getreply halt raise receive" + + " reply send trigger"), + configOps: words("create connect disconnect done kill killed map unmap"), + verdictOps: words("getverdict setverdict"), + sutOps: words("action"), + functionOps: words("apply derefers refers"), + + verdictConsts: words("error fail inconc none pass"), + booleanConsts: words("true false"), + otherConsts: words("null NULL omit"), + + visibilityModifiers: words("private public friend"), + templateMatch: words("complement ifpresent subset superset permutation"), + multiLineStrings: true + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js new file mode 100644 index 0000000000..695239661f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js @@ -0,0 +1,162 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("turtle", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp([]); + var keywords = wordRegexp(["@prefix", "@base", "a"]); + var operatorChars = /[*+\-<>=&|]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return null; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return null; + } + else if (ch == ":") { + return "operator"; + } else { + stream.eatWhile(/[_\w\d]/); + if(stream.peek() == ":") { + return "variable-3"; + } else { + var word = stream.current(); + + if(keywords.test(word)) { + return "meta"; + } + + if(ch >= "A" && ch <= "Z") { + return "comment"; + } else { + return "keyword"; + } + } + var word = stream.current(); + if (ops.test(word)) + return null; + else if (keywords.test(word)) + return "meta"; + else + return "variable"; + } + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) popContext(state); + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/turtle", "turtle"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js new file mode 100644 index 0000000000..a6dd3f1a68 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js @@ -0,0 +1,141 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("twig:inner", function() { + var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"], + operator = /^[+\-*&%=<>!?|~^]/, + sign = /^[:\[\(\{]/, + atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"], + number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; + + keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); + atom = new RegExp("((" + atom.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + var ch = stream.peek(); + + //Comment + if (state.incomment) { + if (!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Tag + } else if (state.intag) { + //After operator + if (state.operator) { + state.operator = false; + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + } + //After sign + if (state.sign) { + state.sign = false; + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + } + + if (state.instring) { + if (ch == state.instring) { + state.instring = false; + } + stream.next(); + return "string"; + } else if (ch == "'" || ch == '"') { + state.instring = ch; + stream.next(); + return "string"; + } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { + state.intag = false; + return "tag"; + } else if (stream.match(operator)) { + state.operator = true; + return "operator"; + } else if (stream.match(sign)) { + state.sign = true; + } else { + if (stream.eat(" ") || stream.sol()) { + if (stream.match(keywords)) { + return "keyword"; + } + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + if (stream.sol()) { + stream.next(); + } + } else { + stream.next(); + } + + } + return "variable"; + } else if (stream.eat("{")) { + if (stream.eat("#")) { + state.incomment = true; + if (!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Open tag + } else if (ch = stream.eat(/\{|%/)) { + //Cache close tag + state.intag = ch; + if (ch == "{") { + state.intag = "}"; + } + stream.eat("-"); + return "tag"; + } + } + stream.next(); + }; + + return { + startState: function () { + return {}; + }, + token: function (stream, state) { + return tokenBase(stream, state); + } + }; + }); + + CodeMirror.defineMode("twig", function(config, parserConfig) { + var twigInner = CodeMirror.getMode(config, "twig:inner"); + if (!parserConfig || !parserConfig.base) return twigInner; + return CodeMirror.multiplexingMode( + CodeMirror.getMode(config, parserConfig.base), { + open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true + } + ); + }); + CodeMirror.defineMIME("text/x-twig", "twig"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js new file mode 100644 index 0000000000..6e4b476309 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js @@ -0,0 +1,275 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vb", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); + var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); + var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); + var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); + var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try', 'structure', 'synclock', 'using', 'with']; + var middleKeywords = ['else','elseif','case', 'catch', 'finally']; + var endKeywords = ['next','loop']; + + var operatorKeywords = ['and', "andalso", 'or', 'orelse', 'xor', 'in', 'not', 'is', 'isnot', 'like']; + var wordOperators = wordRegexp(operatorKeywords); + + var commonKeywords = ["#const", "#else", "#elseif", "#end", "#if", "#region", "addhandler", "addressof", "alias", "as", "byref", "byval", "cbool", "cbyte", "cchar", "cdate", "cdbl", "cdec", "cint", "clng", "cobj", "compare", "const", "continue", "csbyte", "cshort", "csng", "cstr", "cuint", "culng", "cushort", "declare", "default", "delegate", "dim", "directcast", "each", "erase", "error", "event", "exit", "explicit", "false", "for", "friend", "gettype", "goto", "handles", "implements", "imports", "infer", "inherits", "interface", "isfalse", "istrue", "lib", "me", "mod", "mustinherit", "mustoverride", "my", "mybase", "myclass", "namespace", "narrowing", "new", "nothing", "notinheritable", "notoverridable", "of", "off", "on", "operator", "option", "optional", "out", "overloads", "overridable", "overrides", "paramarray", "partial", "private", "protected", "public", "raiseevent", "readonly", "redim", "removehandler", "resume", "return", "shadows", "shared", "static", "step", "stop", "strict", "then", "throw", "to", "true", "trycast", "typeof", "until", "until", "when", "widening", "withevents", "writeonly"]; + + var commontypes = ['object', 'boolean', 'char', 'string', 'byte', 'sbyte', 'short', 'ushort', 'int16', 'uint16', 'integer', 'uinteger', 'int32', 'uint32', 'long', 'ulong', 'int64', 'uint64', 'decimal', 'single', 'double', 'float', 'date', 'datetime', 'intptr', 'uintptr']; + + var keywords = wordRegexp(commonKeywords); + var types = wordRegexp(commontypes); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + + var indentInfo = null; + + CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords) + .concat(operatorKeywords).concat(commonKeywords).concat(commontypes)); + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { + return null; + } + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + return 'keyword'; + } + if (stream.match(closing)) { + dedent(stream,state); + return 'keyword'; + } + + if (stream.match(types)) { + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + if (style === 'variable') { + return 'variable'; + } else { + return ERRORCLASS; + } + } + + + var delimiter_index = '[({'.indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state ); + } + if (indentInfo === 'dedent') { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = '])}'.indexOf(current); + if (delimiter_index !== -1) { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + }, + + lineComment: "'" + }; + return external; +}); + +CodeMirror.defineMIME("text/x-vb", "vb"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js new file mode 100644 index 0000000000..4033948133 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js @@ -0,0 +1,350 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* +For extra ASP classic objects, initialize CodeMirror instance with this option: + isASP: true + +E.G.: + var editor = CodeMirror.fromTextArea(document.getElementById("code"), { + lineNumbers: true, + isASP: true + }); +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vbscript", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); + var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); + var singleDelimiters = new RegExp('^[\\.,]'); + var brackets = new RegExp('^[\\(\\)]'); + var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; + var middleKeywords = ['else','elseif','case']; + var endKeywords = ['next','loop','wend']; + + var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); + var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', + 'byval','byref','new','property', 'exit', 'in', + 'const','private', 'public', + 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; + + //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx + var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; + //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx + var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', + 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', + 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', + 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', + 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', + 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; + + //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx + var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', + 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', + 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', + 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', + 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', + 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', + 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; + //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx + var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; + var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; + var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; + + var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; + var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response + 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request + 'contents', 'staticobjects', //application + 'codepage', 'lcid', 'sessionid', 'timeout', //session + 'scripttimeout']; //server + var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response + 'binaryread', //request + 'remove', 'removeall', 'lock', 'unlock', //application + 'abandon', //session + 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server + + var knownWords = knownMethods.concat(knownProperties); + + builtinObjsWords = builtinObjsWords.concat(builtinConsts); + + if (conf.isASP){ + builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); + knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); + }; + + var keywords = wordRegexp(commonkeywords); + var atoms = wordRegexp(atomWords); + var builtinFuncs = wordRegexp(builtinFuncsWords); + var builtinObjs = wordRegexp(builtinObjsWords); + var known = wordRegexp(knownWords); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + var noIndentWords = wordRegexp(['on error resume next', 'exit']); + var comment = wordRegexp(['rem']); + + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return 'space'; + //return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + if (stream.match(comment)){ + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + + if (stream.match(brackets)) { + return "bracket"; + } + + if (stream.match(noIndentWords)) { + state.doInCurrentLine = true; + + return 'keyword'; + } + + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + + return 'keyword'; + } + if (stream.match(closing)) { + if (! state.doInCurrentLine) + dedent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(atoms)) { + return 'atom'; + } + + if (stream.match(known)) { + return 'variable-2'; + } + + if (stream.match(builtinFuncs)) { + return 'builtin'; + } + + if (stream.match(builtinObjs)){ + return 'variable-2'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + + current = stream.current(); + if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { + if (style === 'builtin' || style === 'keyword') style='variable'; + if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; + + return style; + } else { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false, + ignoreKeyword: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + if (style==='space') style=null; + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + } + + }; + return external; +}); + +CodeMirror.defineMIME("text/vbscript", "vbscript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js new file mode 100644 index 0000000000..79a621a5b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js @@ -0,0 +1,202 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("velocity", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = parseWords("#end #else #break #stop #[[ #]] " + + "#{end} #{else} #{break} #{stop}"); + var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); + var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); + var isOperatorChar = /[+\-*&%=<>!?:\/|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + // start of unparsed string? + if ((ch == "'") && !state.inString && state.inParams) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenString(ch)); + } + // start of parsed string? + else if ((ch == '"')) { + state.lastTokenWasBuiltin = false; + if (state.inString) { + state.inString = false; + return "string"; + } + else if (state.inParams) + return chain(stream, state, tokenString(ch)); + } + // is it one of the special signs []{}().,;? Separator? + else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) + state.inParams = true; + else if (ch == ")") { + state.inParams = false; + state.lastTokenWasBuiltin = true; + } + return null; + } + // start of a number value? + else if (/\d/.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment? + else if (ch == "#" && stream.eat("*")) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenComment); + } + // unparsed content? + else if (ch == "#" && stream.match(/ *\[ *\[/)) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenUnparsed); + } + // single line comment? + else if (ch == "#" && stream.eat("#")) { + state.lastTokenWasBuiltin = false; + stream.skipToEnd(); + return "comment"; + } + // variable? + else if (ch == "$") { + stream.eat("!"); + stream.eatWhile(/[\w\d\$_\.{}-]/); + // is it one of the specials? + if (specials && specials.propertyIsEnumerable(stream.current())) { + return "keyword"; + } + else { + state.lastTokenWasBuiltin = true; + state.beforeParams = true; + return "builtin"; + } + } + // is it a operator? + else if (isOperatorChar.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the whole word + stream.eatWhile(/[\w\$_{}@]/); + var word = stream.current(); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + // is it one of the listed functions? + if (functions && functions.propertyIsEnumerable(word) || + (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && + !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { + state.beforeParams = true; + state.lastTokenWasBuiltin = false; + return "keyword"; + } + if (state.inString) { + state.lastTokenWasBuiltin = false; + return "string"; + } + if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) + return "builtin"; + // default: just a "word" + state.lastTokenWasBuiltin = false; + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if ((next == quote) && !escaped) { + end = true; + break; + } + if (quote=='"' && stream.peek() == '$' && !escaped) { + state.inString = true; + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + // Interface + + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false, + inString: false, + lastTokenWasBuiltin: false + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "#*", + blockCommentEnd: "*#", + lineComment: "##", + fold: "velocity" + }; +}); + +CodeMirror.defineMIME("text/velocity", "velocity"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js new file mode 100644 index 0000000000..6c799f298b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js @@ -0,0 +1,781 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("verilog", function(config, parserConfig) { + + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + // compilerDirectivesUseRegularIndentation - If set, Compiler directive + // indentation follows the same rules as everything else. Otherwise if + // false, compiler directives will track their own indentation. + // For example, `ifdef nested inside another `ifndef will be indented, + // but a `ifdef inside a function block may not be indented. + compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation, + noIndentKeywords = parserConfig.noIndentKeywords || [], + multiLineStrings = parserConfig.multiLineStrings, + hooks = parserConfig.hooks || {}; + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + /** + * Keywords from IEEE 1800-2012 + */ + var keywords = words( + "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + + "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + + "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + + "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + + "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + + "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + + "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + + "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + + "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + + "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + + "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + + "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + + "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + + "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + + "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + + "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + + "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + + "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); + + /** Operators from IEEE 1800-2012 + unary_operator ::= + + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_operator ::= + + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** + | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< + | -> | <-> + inc_or_dec_operator ::= ++ | -- + unary_module_path_operator ::= + ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_module_path_operator ::= + == | != | && | || | & | | | ^ | ^~ | ~^ + */ + var isOperatorChar = /[\+\-\*\/!~&|^%=?:<>]/; + var isBracketChar = /[\[\]{}()]/; + + var unsignedNumber = /\d[0-9_]*/; + var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; + var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; + var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; + var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; + var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; + + var closingBracketOrWord = /^((`?\w+)|[)}\]])/; + var closingBracket = /[)}\]]/; + var compilerDirectiveRegex = new RegExp( + "^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|" + + "nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\b"); + var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\b/; + var compilerDirectiveEndRegex = /^(`(?:elsif|else|endif))\b/; + + var curPunc; + var curKeyword; + + // Block openings which are closed by a matching keyword in the form of ("end" + keyword) + // E.g. "task" => "endtask" + var blockKeywords = words( + "case checker class clocking config function generate interface module package " + + "primitive program property specify sequence table task" + ); + + // Opening/closing pairs + var openClose = {}; + for (var keyword in blockKeywords) { + openClose[keyword] = "end" + keyword; + } + openClose["begin"] = "end"; + openClose["casex"] = "endcase"; + openClose["casez"] = "endcase"; + openClose["do" ] = "while"; + openClose["fork" ] = "join;join_any;join_none"; + openClose["covergroup"] = "endgroup"; + openClose["macro_begin"] = "macro_end"; + + for (var i in noIndentKeywords) { + var keyword = noIndentKeywords[i]; + if (openClose[keyword]) { + openClose[keyword] = undefined; + } + } + + // Keywords which open statements that are ended with a semi-colon + var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef"); + + function tokenBase(stream, state) { + var ch = stream.peek(), style; + if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; + if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) + return style; + + if (/[,;:\.]/.test(ch)) { + curPunc = stream.next(); + return null; + } + if (isBracketChar.test(ch)) { + curPunc = stream.next(); + return "bracket"; + } + // Macros (tick-defines) + if (ch == '`') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + var cur = stream.current(); + curKeyword = cur; + // Macros that end in _begin, are start of block and end with _end + if (cur.startsWith("`uvm_") && cur.endsWith("_begin")) { + var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + "end"; + openClose[cur] = keywordClose; + curPunc = "newblock"; + } else { + stream.eatSpace(); + if (stream.peek() == '(') { + // Check if this is a block + curPunc = "newmacro"; + } + var withSpace = stream.current(); + // Move the stream back before the spaces + stream.backUp(withSpace.length - cur.length); + } + return "def"; + } else { + return null; + } + } + // System calls + if (ch == '$') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + return "meta"; + } else { + return null; + } + } + // Time literals + if (ch == '#') { + stream.next(); + stream.eatWhile(/[\d_.]/); + return "def"; + } + // Event + if (ch == '@') { + stream.next(); + stream.eatWhile(/[@]/); + return "def"; + } + // Strings + if (ch == '"') { + stream.next(); + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + // Comments + if (ch == "/") { + stream.next(); + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + stream.backUp(1); + } + + // Numeric literals + if (stream.match(realLiteral) || + stream.match(decimalLiteral) || + stream.match(binaryLiteral) || + stream.match(octLiteral) || + stream.match(hexLiteral) || + stream.match(unsignedNumber) || + stream.match(realLiteral)) { + return "number"; + } + + // Operators + if (stream.eatWhile(isOperatorChar)) { + curPunc = stream.current(); + return "meta"; + } + + // Keywords / plain variables + if (stream.eatWhile(/[\w\$_]/)) { + var cur = stream.current(); + if (keywords[cur]) { + if (openClose[cur]) { + curPunc = "newblock"; + if (cur === "fork") { + // Fork can be a statement instead of block in cases of: + // "disable fork;" and "wait fork;" (trailing semicolon) + stream.eatSpace() + if (stream.peek() == ';') { + curPunc = "newstatement"; + } + stream.backUp(stream.current().length - cur.length); + } + } + if (statementKeywords[cur]) { + curPunc = "newstatement"; + } + curKeyword = cur; + return "keyword"; + } + return "variable"; + } + + stream.next(); + return null; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, scopekind, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.scopekind = scopekind; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type, scopekind) { + var indent = state.indented; + var c = new Context(indent, col, type, scopekind ? scopekind : "", null, state.context); + return state.context = c; + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") { + state.indented = state.context.indented; + } + return state.context = state.context.prev; + } + + function isClosing(text, contextClosing) { + if (text == contextClosing) { + return true; + } else { + // contextClosing may be multiple keywords separated by ; + var closingKeywords = contextClosing.split(";"); + for (var i in closingKeywords) { + if (text == closingKeywords[i]) { + return true; + } + } + return false; + } + } + + function isInsideScopeKind(ctx, scopekind) { + if (ctx == null) { + return false; + } + if (ctx.scopekind === scopekind) { + return true; + } + return isInsideScopeKind(ctx.prev, scopekind); + } + + function buildElectricInputRegEx() { + // Reindentation should occur on any bracket char: {}()[] + // or on a match of any of the block closing keywords, at + // the end of a line + var allClosings = []; + for (var i in openClose) { + if (openClose[i]) { + var closings = openClose[i].split(";"); + for (var j in closings) { + allClosings.push(closings[j]); + } + } + } + var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); + return re; + } + + // Interface + return { + + // Regex to force current line to reindent + electricInput: buildElectricInputRegEx(), + + startState: function(basecolumn) { + var state = { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", "top", false), + indented: 0, + compilerDirectiveIndented: 0, + startOfLine: true + }; + if (hooks.startState) hooks.startState(state); + return state; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (hooks.token) { + // Call hook, with an optional return value of a style to override verilog styling. + var style = hooks.token(stream, state); + if (style !== undefined) { + return style; + } + } + if (stream.eatSpace()) return null; + curPunc = null; + curKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta" || style == "variable") { + if (((curPunc === "=") || (curPunc === "<=")) && !isInsideScopeKind(ctx, "assignment")) { + // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent) + // Search through the context to see if we are already in an assignment. + // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block. + pushContext(state, stream.column() + curPunc.length, "assignment", "assignment"); + if (ctx.align == null) ctx.align = true; + } + return style; + } + if (ctx.align == null) ctx.align = true; + + var isClosingAssignment = ctx.type == "assignment" && + closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc; + if (curPunc == ctx.type || isClosingAssignment) { + if (isClosingAssignment) { + ctx = popContext(state); + } + ctx = popContext(state); + if (curPunc == ")") { + // Handle closing macros, assuming they could have a semicolon or begin/end block inside. + if (ctx && (ctx.type === "macro")) { + ctx = popContext(state); + while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); + } + } else if (curPunc == "}") { + // Handle closing statements like constraint block: "foreach () {}" which + // do not have semicolon at end. + if (ctx && (ctx.type === "statement")) { + while (ctx && (ctx.type == "statement")) ctx = popContext(state); + } + } + } else if (((curPunc == ";" || curPunc == ",") && (ctx.type == "statement" || ctx.type == "assignment")) || + (ctx.type && isClosing(curKeyword, ctx.type))) { + ctx = popContext(state); + while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); + } else if (curPunc == "{") { + pushContext(state, stream.column(), "}"); + } else if (curPunc == "[") { + pushContext(state, stream.column(), "]"); + } else if (curPunc == "(") { + pushContext(state, stream.column(), ")"); + } else if (ctx && ctx.type == "endcase" && curPunc == ":") { + pushContext(state, stream.column(), "statement", "case"); + } else if (curPunc == "newstatement") { + pushContext(state, stream.column(), "statement", curKeyword); + } else if (curPunc == "newblock") { + if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { + // The 'function' keyword can appear in some other contexts where it actually does not + // indicate a function (import/export DPI and covergroup definitions). + // Do nothing in this case + } else if (curKeyword == "task" && ctx && ctx.type == "statement") { + // Same thing for task + } else if (curKeyword == "class" && ctx && ctx.type == "statement") { + // Same thing for class (e.g. typedef) + } else { + var close = openClose[curKeyword]; + pushContext(state, stream.column(), close, curKeyword); + } + } else if (curPunc == "newmacro" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) { + if (curPunc == "newmacro") { + // Macros (especially if they have parenthesis) potentially have a semicolon + // or complete statement/block inside, and should be treated as such. + pushContext(state, stream.column(), "macro", "macro"); + } + if (curKeyword.match(compilerDirectiveEndRegex)) { + state.compilerDirectiveIndented -= statementIndentUnit; + } + if (curKeyword.match(compilerDirectiveBeginRegex)) { + state.compilerDirectiveIndented += statementIndentUnit; + } + } + + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + if (hooks.indent) { + var fromHook = hooks.indent(state); + if (fromHook >= 0) return fromHook; + } + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = false; + var possibleClosing = textAfter.match(closingBracketOrWord); + if (possibleClosing) + closing = isClosing(possibleClosing[0], ctx.type); + if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) { + if (textAfter.match(compilerDirectiveEndRegex)) { + return state.compilerDirectiveIndented - statementIndentUnit; + } + return state.compilerDirectiveIndented; + } + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + else if ((closingBracket.test(ctx.type) || ctx.type == "assignment") + && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); + else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "indent" + }; +}); + + CodeMirror.defineMIME("text/x-verilog", { + name: "verilog" + }); + + CodeMirror.defineMIME("text/x-systemverilog", { + name: "verilog" + }); + + + + // TL-Verilog mode. + // See tl-x.org for language spec. + // See the mode in action at makerchip.com. + // Contact: steve.hoover@redwoodeda.com + + // TLV Identifier prefixes. + // Note that sign is not treated separately, so "+/-" versions of numeric identifiers + // are included. + var tlvIdentifierStyle = { + "|": "link", + ">": "property", // Should condition this off for > TLV 1c. + "$": "variable", + "$$": "variable", + "?$": "qualifier", + "?*": "qualifier", + "-": "hr", + "/": "property", + "/-": "property", + "@": "variable-3", + "@-": "variable-3", + "@++": "variable-3", + "@+=": "variable-3", + "@+=-": "variable-3", + "@--": "variable-3", + "@-=": "variable-3", + "%+": "tag", + "%-": "tag", + "%": "tag", + ">>": "tag", + "<<": "tag", + "<>": "tag", + "#": "tag", // Need to choose a style for this. + "^": "attribute", + "^^": "attribute", + "^!": "attribute", + "*": "variable-2", + "**": "variable-2", + "\\": "keyword", + "\"": "comment" + }; + + // Lines starting with these characters define scope (result in indentation). + var tlvScopePrefixChars = { + "/": "beh-hier", + ">": "beh-hier", + "-": "phys-hier", + "|": "pipe", + "?": "when", + "@": "stage", + "\\": "keyword" + }; + var tlvIndentUnit = 3; + var tlvTrackStatements = false; + var tlvIdentMatch = /^([~!@#\$%\^&\*-\+=\?\/\\\|'"<>]+)([\d\w_]*)/; // Matches an identifier. + // Note that ':' is excluded, because of it's use in [:]. + var tlvFirstLevelIndentMatch = /^[! ] /; + var tlvLineIndentationMatch = /^[! ] */; + var tlvCommentMatch = /^\/[\/\*]/; + + + // Returns a style specific to the scope at the given indentation column. + // Type is one of: "indent", "scope-ident", "before-scope-ident". + function tlvScopeStyle(state, indentation, type) { + // Begin scope. + var depth = indentation / tlvIndentUnit; // TODO: Pass this in instead. + return "tlv-" + state.tlvIndentationStyle[depth] + "-" + type; + } + + // Return true if the next thing in the stream is an identifier with a mnemonic. + function tlvIdentNext(stream) { + var match; + return (match = stream.match(tlvIdentMatch, false)) && match[2].length > 0; + } + + CodeMirror.defineMIME("text/x-tlv", { + name: "verilog", + + hooks: { + + electricInput: false, + + + // Return undefined for verilog tokenizing, or style for TLV token (null not used). + // Standard CM styles are used for most formatting, but some TL-Verilog-specific highlighting + // can be enabled with the definition of cm-tlv-* styles, including highlighting for: + // - M4 tokens + // - TLV scope indentation + // - Statement delimitation (enabled by tlvTrackStatements) + token: function(stream, state) { + var style = undefined; + var match; // Return value of pattern matches. + + // Set highlighting mode based on code region (TLV or SV). + if (stream.sol() && ! state.tlvInBlockComment) { + // Process region. + if (stream.peek() == '\\') { + style = "def"; + stream.skipToEnd(); + if (stream.string.match(/\\SV/)) { + state.tlvCodeActive = false; + } else if (stream.string.match(/\\TLV/)){ + state.tlvCodeActive = true; + } + } + // Correct indentation in the face of a line prefix char. + if (state.tlvCodeActive && stream.pos == 0 && + (state.indented == 0) && (match = stream.match(tlvLineIndentationMatch, false))) { + state.indented = match[0].length; + } + + // Compute indentation state: + // o Auto indentation on next line + // o Indentation scope styles + var indented = state.indented; + var depth = indented / tlvIndentUnit; + if (depth <= state.tlvIndentationStyle.length) { + // not deeper than current scope + + var blankline = stream.string.length == indented; + var chPos = depth * tlvIndentUnit; + if (chPos < stream.string.length) { + var bodyString = stream.string.slice(chPos); + var ch = bodyString[0]; + if (tlvScopePrefixChars[ch] && ((match = bodyString.match(tlvIdentMatch)) && + tlvIdentifierStyle[match[1]])) { + // This line begins scope. + // Next line gets indented one level. + indented += tlvIndentUnit; + // Style the next level of indentation (except non-region keyword identifiers, + // which are statements themselves) + if (!(ch == "\\" && chPos > 0)) { + state.tlvIndentationStyle[depth] = tlvScopePrefixChars[ch]; + if (tlvTrackStatements) {state.statementComment = false;} + depth++; + } + } + } + // Clear out deeper indentation levels unless line is blank. + if (!blankline) { + while (state.tlvIndentationStyle.length > depth) { + state.tlvIndentationStyle.pop(); + } + } + } + // Set next level of indentation. + state.tlvNextIndent = indented; + } + + if (state.tlvCodeActive) { + // Highlight as TLV. + + var beginStatement = false; + if (tlvTrackStatements) { + // This starts a statement if the position is at the scope level + // and we're not within a statement leading comment. + beginStatement = + (stream.peek() != " ") && // not a space + (style === undefined) && // not a region identifier + !state.tlvInBlockComment && // not in block comment + //!stream.match(tlvCommentMatch, false) && // not comment start + (stream.column() == state.tlvIndentationStyle.length * tlvIndentUnit); // at scope level + if (beginStatement) { + if (state.statementComment) { + // statement already started by comment + beginStatement = false; + } + state.statementComment = + stream.match(tlvCommentMatch, false); // comment start + } + } + + var match; + if (style !== undefined) { + // Region line. + style += " " + tlvScopeStyle(state, 0, "scope-ident") + } else if (((stream.pos / tlvIndentUnit) < state.tlvIndentationStyle.length) && + (match = stream.match(stream.sol() ? tlvFirstLevelIndentMatch : /^ /))) { + // Indentation + style = // make this style distinct from the previous one to prevent + // codemirror from combining spans + "tlv-indent-" + (((stream.pos % 2) == 0) ? "even" : "odd") + + // and style it + " " + tlvScopeStyle(state, stream.pos - tlvIndentUnit, "indent"); + // Style the line prefix character. + if (match[0].charAt(0) == "!") { + style += " tlv-alert-line-prefix"; + } + // Place a class before a scope identifier. + if (tlvIdentNext(stream)) { + style += " " + tlvScopeStyle(state, stream.pos, "before-scope-ident"); + } + } else if (state.tlvInBlockComment) { + // In a block comment. + if (stream.match(/^.*?\*\//)) { + // Exit block comment. + state.tlvInBlockComment = false; + if (tlvTrackStatements && !stream.eol()) { + // Anything after comment is assumed to be real statement content. + state.statementComment = false; + } + } else { + stream.skipToEnd(); + } + style = "comment"; + } else if ((match = stream.match(tlvCommentMatch)) && !state.tlvInBlockComment) { + // Start comment. + if (match[0] == "//") { + // Line comment. + stream.skipToEnd(); + } else { + // Block comment. + state.tlvInBlockComment = true; + } + style = "comment"; + } else if (match = stream.match(tlvIdentMatch)) { + // looks like an identifier (or identifier prefix) + var prefix = match[1]; + var mnemonic = match[2]; + if (// is identifier prefix + tlvIdentifierStyle.hasOwnProperty(prefix) && + // has mnemonic or we're at the end of the line (maybe it hasn't been typed yet) + (mnemonic.length > 0 || stream.eol())) { + style = tlvIdentifierStyle[prefix]; + if (stream.column() == state.indented) { + // Begin scope. + style += " " + tlvScopeStyle(state, stream.column(), "scope-ident") + } + } else { + // Just swallow one character and try again. + // This enables subsequent identifier match with preceding symbol character, which + // is legal within a statement. (E.g., !$reset). It also enables detection of + // comment start with preceding symbols. + stream.backUp(stream.current().length - 1); + style = "tlv-default"; + } + } else if (stream.match(/^\t+/)) { + // Highlight tabs, which are illegal. + style = "tlv-tab"; + } else if (stream.match(/^[\[\]{}\(\);\:]+/)) { + // [:], (), {}, ;. + style = "meta"; + } else if (match = stream.match(/^[mM]4([\+_])?[\w\d_]*/)) { + // m4 pre proc + style = (match[1] == "+") ? "tlv-m4-plus" : "tlv-m4"; + } else if (stream.match(/^ +/)){ + // Skip over spaces. + if (stream.eol()) { + // Trailing spaces. + style = "error"; + } else { + // Non-trailing spaces. + style = "tlv-default"; + } + } else if (stream.match(/^[\w\d_]+/)) { + // alpha-numeric token. + style = "number"; + } else { + // Eat the next char w/ no formatting. + stream.next(); + style = "tlv-default"; + } + if (beginStatement) { + style += " tlv-statement"; + } + } else { + if (stream.match(/^[mM]4([\w\d_]*)/)) { + // m4 pre proc + style = "tlv-m4"; + } + } + return style; + }, + + indent: function(state) { + return (state.tlvCodeActive == true) ? state.tlvNextIndent : -1; + }, + + startState: function(state) { + state.tlvIndentationStyle = []; // Styles to use for each level of indentation. + state.tlvCodeActive = true; // True when we're in a TLV region (and at beginning of file). + state.tlvNextIndent = -1; // The number of spaces to autoindent the next line if tlvCodeActive. + state.tlvInBlockComment = false; // True inside /**/ comment. + if (tlvTrackStatements) { + state.statementComment = false; // True inside a statement's header comment. + } + } + + } + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js new file mode 100644 index 0000000000..133e67a268 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js @@ -0,0 +1,189 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Originally written by Alf Nielsen, re-written by Michael Zhou +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function words(str) { + var obj = {}, words = str.split(","); + for (var i = 0; i < words.length; ++i) { + var allCaps = words[i].toUpperCase(); + var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1); + obj[words[i]] = true; + obj[allCaps] = true; + obj[firstCap] = true; + } + return obj; +} + +function metaHook(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; +} + +CodeMirror.defineMode("vhdl", function(config, parserConfig) { + var indentUnit = config.indentUnit, + atoms = parserConfig.atoms || words("null"), + hooks = parserConfig.hooks || {"`": metaHook, "$": metaHook}, + multiLineStrings = parserConfig.multiLineStrings; + + var keywords = words("abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block," + + "body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case," + + "end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for," + + "function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage," + + "literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map," + + "postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal," + + "sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor"); + + var blockKeywords = words("architecture,entity,begin,case,port,else,elsif,end,for,function,if"); + + var isOperatorChar = /[&|~>!\?@#$%&|:\.]+)/, token: "variable-2"}, + {regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"}, + {regex: /\(;.*?/, token: "comment", next: "comment"}, + {regex: /;;.*$/, token: "comment"}, + {regex: /\(/, indent: true}, + {regex: /\)/, dedent: true}, + ], + + comment: [ + {regex: /.*?;\)/, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"}, + ], + + meta: { + dontIndentStates: ['comment'], + }, +}); + +// https://github.com/WebAssembly/design/issues/981 mentions text/webassembly, +// which seems like a reasonable choice, although it's not standard right now. +CodeMirror.defineMIME("text/webassembly", "wast"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js new file mode 100644 index 0000000000..120de6bea7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); +}; + +var builtinArray = [ + "Clamp", + "Constructor", + "EnforceRange", + "Exposed", + "ImplicitThis", + "Global", "PrimaryGlobal", + "LegacyArrayClass", + "LegacyUnenumerableNamedProperties", + "LenientThis", + "NamedConstructor", + "NewObject", + "NoInterfaceObject", + "OverrideBuiltins", + "PutForwards", + "Replaceable", + "SameObject", + "TreatNonObjectAsNull", + "TreatNullAs", + "EmptyString", + "Unforgeable", + "Unscopeable" +]; +var builtins = wordRegexp(builtinArray); + +var typeArray = [ + "unsigned", "short", "long", // UnsignedIntegerType + "unrestricted", "float", "double", // UnrestrictedFloatType + "boolean", "byte", "octet", // Rest of PrimitiveType + "Promise", // PromiseType + "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array", + "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", + "Float32Array", "Float64Array", // BufferRelatedType + "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp", + "Error", "DOMException", "FrozenArray", // Rest of NonAnyType + "any", // Rest of SingleType + "void" // Rest of ReturnType +]; +var types = wordRegexp(typeArray); + +var keywordArray = [ + "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter", + "implements", "inherit", "interface", "iterable", "legacycaller", "maplike", + "partial", "required", "serializer", "setlike", "setter", "static", + "stringifier", "typedef", // ArgumentNameKeyword except + // "unrestricted" + "optional", "readonly", "or" +]; +var keywords = wordRegexp(keywordArray); + +var atomArray = [ + "true", "false", // BooleanLiteral + "Infinity", "NaN", // FloatLiteral + "null" // Rest of ConstValue +]; +var atoms = wordRegexp(atomArray); + +CodeMirror.registerHelper("hintWords", "webidl", + builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray)); + +var startDefArray = ["callback", "dictionary", "enum", "interface"]; +var startDefs = wordRegexp(startDefArray); + +var endDefArray = ["typedef"]; +var endDefs = wordRegexp(endDefArray); + +var singleOperators = /^[:<=>?]/; +var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/; +var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/; +var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/; +var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/; +var strings = /^"[^"]*"/; +var multilineComments = /^\/\*.*?\*\//; +var multilineCommentsStart = /^\/\*.*/; +var multilineCommentsEnd = /^.*?\*\//; + +function readToken(stream, state) { + // whitespace + if (stream.eatSpace()) return null; + + // comment + if (state.inComment) { + if (stream.match(multilineCommentsEnd)) { + state.inComment = false; + return "comment"; + } + stream.skipToEnd(); + return "comment"; + } + if (stream.match("//")) { + stream.skipToEnd(); + return "comment"; + } + if (stream.match(multilineComments)) return "comment"; + if (stream.match(multilineCommentsStart)) { + state.inComment = true; + return "comment"; + } + + // integer and float + if (stream.match(/^-?[0-9\.]/, false)) { + if (stream.match(integers) || stream.match(floats)) return "number"; + } + + // string + if (stream.match(strings)) return "string"; + + // identifier + if (state.startDef && stream.match(identifiers)) return "def"; + + if (state.endDef && stream.match(identifiersEnd)) { + state.endDef = false; + return "def"; + } + + if (stream.match(keywords)) return "keyword"; + + if (stream.match(types)) { + var lastToken = state.lastToken; + var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1]; + + if (lastToken === ":" || lastToken === "implements" || + nextToken === "implements" || nextToken === "=") { + // Used as identifier + return "builtin"; + } else { + // Used as type + return "variable-3"; + } + } + + if (stream.match(builtins)) return "builtin"; + if (stream.match(atoms)) return "atom"; + if (stream.match(identifiers)) return "variable"; + + // other + if (stream.match(singleOperators)) return "operator"; + + // unrecognized + stream.next(); + return null; +}; + +CodeMirror.defineMode("webidl", function() { + return { + startState: function() { + return { + // Is in multiline comment + inComment: false, + // Last non-whitespace, matched token + lastToken: "", + // Next token is a definition + startDef: false, + // Last token of the statement is a definition + endDef: false + }; + }, + token: function(stream, state) { + var style = readToken(stream, state); + + if (style) { + var cur = stream.current(); + state.lastToken = cur; + if (style === "keyword") { + state.startDef = startDefs.test(cur); + state.endDef = state.endDef || endDefs.test(cur); + } else { + state.startDef = false; + } + } + + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-webidl", "webidl"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js new file mode 100644 index 0000000000..4e36106b49 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js @@ -0,0 +1,417 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var htmlConfig = { + autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, + 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, + 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, + 'track': true, 'wbr': true, 'menuitem': true}, + implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, + 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, + 'th': true, 'tr': true}, + contextGrabbers: { + 'dd': {'dd': true, 'dt': true}, + 'dt': {'dd': true, 'dt': true}, + 'li': {'li': true}, + 'option': {'option': true, 'optgroup': true}, + 'optgroup': {'optgroup': true}, + 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, + 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, + 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, + 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, + 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, + 'rp': {'rp': true, 'rt': true}, + 'rt': {'rp': true, 'rt': true}, + 'tbody': {'tbody': true, 'tfoot': true}, + 'td': {'td': true, 'th': true}, + 'tfoot': {'tbody': true}, + 'th': {'td': true, 'th': true}, + 'thead': {'tbody': true, 'tfoot': true}, + 'tr': {'tr': true} + }, + doNotIndent: {"pre": true}, + allowUnquoted: true, + allowMissing: true, + caseFold: true +} + +var xmlConfig = { + autoSelfClosers: {}, + implicitlyClosed: {}, + contextGrabbers: {}, + doNotIndent: {}, + allowUnquoted: false, + allowMissing: false, + allowMissingTagName: false, + caseFold: false +} + +CodeMirror.defineMode("xml", function(editorConf, config_) { + var indentUnit = editorConf.indentUnit + var config = {} + var defaults = config_.htmlMode ? htmlConfig : xmlConfig + for (var prop in defaults) config[prop] = defaults[prop] + for (var prop in config_) config[prop] = config_[prop] + + // Return variables for tokenizers + var type, setStyle; + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var ch = stream.next(); + if (ch == "<") { + if (stream.eat("!")) { + if (stream.eat("[")) { + if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); + else return null; + } else if (stream.match("--")) { + return chain(inBlock("comment", "-->")); + } else if (stream.match("DOCTYPE", true, true)) { + stream.eatWhile(/[\w\._\-]/); + return chain(doctype(1)); + } else { + return null; + } + } else if (stream.eat("?")) { + stream.eatWhile(/[\w\._\-]/); + state.tokenize = inBlock("meta", "?>"); + return "meta"; + } else { + type = stream.eat("/") ? "closeTag" : "openTag"; + state.tokenize = inTag; + return "tag bracket"; + } + } else if (ch == "&") { + var ok; + if (stream.eat("#")) { + if (stream.eat("x")) { + ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); + } else { + ok = stream.eatWhile(/[\d]/) && stream.eat(";"); + } + } else { + ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); + } + return ok ? "atom" : "error"; + } else { + stream.eatWhile(/[^&<]/); + return null; + } + } + inText.isInText = true; + + function inTag(stream, state) { + var ch = stream.next(); + if (ch == ">" || (ch == "/" && stream.eat(">"))) { + state.tokenize = inText; + type = ch == ">" ? "endTag" : "selfcloseTag"; + return "tag bracket"; + } else if (ch == "=") { + type = "equals"; + return null; + } else if (ch == "<") { + state.tokenize = inText; + state.state = baseState; + state.tagName = state.tagStart = null; + var next = state.tokenize(stream, state); + return next ? next + " tag error" : "tag error"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + state.stringStartCol = stream.column(); + return state.tokenize(stream, state); + } else { + stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); + return "word"; + } + } + + function inAttribute(quote) { + var closure = function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inTag; + break; + } + } + return "string"; + }; + closure.isInAttribute = true; + return closure; + } + + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + return style; + } + } + + function doctype(depth) { + return function(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch == "<") { + state.tokenize = doctype(depth + 1); + return state.tokenize(stream, state); + } else if (ch == ">") { + if (depth == 1) { + state.tokenize = inText; + break; + } else { + state.tokenize = doctype(depth - 1); + return state.tokenize(stream, state); + } + } + } + return "meta"; + }; + } + + function lower(tagName) { + return tagName && tagName.toLowerCase(); + } + + function Context(state, tagName, startOfLine) { + this.prev = state.context; + this.tagName = tagName || ""; + this.indent = state.indented; + this.startOfLine = startOfLine; + if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) + this.noIndent = true; + } + function popContext(state) { + if (state.context) state.context = state.context.prev; + } + function maybePopContext(state, nextTagName) { + var parentTagName; + while (true) { + if (!state.context) { + return; + } + parentTagName = state.context.tagName; + if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) || + !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) { + return; + } + popContext(state); + } + } + + function baseState(type, stream, state) { + if (type == "openTag") { + state.tagStart = stream.column(); + return tagNameState; + } else if (type == "closeTag") { + return closeTagNameState; + } else { + return baseState; + } + } + function tagNameState(type, stream, state) { + if (type == "word") { + state.tagName = stream.current(); + setStyle = "tag"; + return attrState; + } else if (config.allowMissingTagName && type == "endTag") { + setStyle = "tag bracket"; + return attrState(type, stream, state); + } else { + setStyle = "error"; + return tagNameState; + } + } + function closeTagNameState(type, stream, state) { + if (type == "word") { + var tagName = stream.current(); + if (state.context && state.context.tagName != tagName && + config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName))) + popContext(state); + if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) { + setStyle = "tag"; + return closeState; + } else { + setStyle = "tag error"; + return closeStateErr; + } + } else if (config.allowMissingTagName && type == "endTag") { + setStyle = "tag bracket"; + return closeState(type, stream, state); + } else { + setStyle = "error"; + return closeStateErr; + } + } + + function closeState(type, _stream, state) { + if (type != "endTag") { + setStyle = "error"; + return closeState; + } + popContext(state); + return baseState; + } + function closeStateErr(type, stream, state) { + setStyle = "error"; + return closeState(type, stream, state); + } + + function attrState(type, _stream, state) { + if (type == "word") { + setStyle = "attribute"; + return attrEqState; + } else if (type == "endTag" || type == "selfcloseTag") { + var tagName = state.tagName, tagStart = state.tagStart; + state.tagName = state.tagStart = null; + if (type == "selfcloseTag" || + config.autoSelfClosers.hasOwnProperty(lower(tagName))) { + maybePopContext(state, tagName); + } else { + maybePopContext(state, tagName); + state.context = new Context(state, tagName, tagStart == state.indented); + } + return baseState; + } + setStyle = "error"; + return attrState; + } + function attrEqState(type, stream, state) { + if (type == "equals") return attrValueState; + if (!config.allowMissing) setStyle = "error"; + return attrState(type, stream, state); + } + function attrValueState(type, stream, state) { + if (type == "string") return attrContinuedState; + if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;} + setStyle = "error"; + return attrState(type, stream, state); + } + function attrContinuedState(type, stream, state) { + if (type == "string") return attrContinuedState; + return attrState(type, stream, state); + } + + return { + startState: function(baseIndent) { + var state = {tokenize: inText, + state: baseState, + indented: baseIndent || 0, + tagName: null, tagStart: null, + context: null} + if (baseIndent != null) state.baseIndent = baseIndent + return state + }, + + token: function(stream, state) { + if (!state.tagName && stream.sol()) + state.indented = stream.indentation(); + + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + setStyle = null; + state.state = state.state(type || style, stream, state); + if (setStyle) + style = setStyle == "error" ? style + " error" : setStyle; + } + return style; + }, + + indent: function(state, textAfter, fullLine) { + var context = state.context; + // Indent multi-line strings (e.g. css). + if (state.tokenize.isInAttribute) { + if (state.tagStart == state.indented) + return state.stringStartCol + 1; + else + return state.indented + indentUnit; + } + if (context && context.noIndent) return CodeMirror.Pass; + if (state.tokenize != inTag && state.tokenize != inText) + return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; + // Indent the starts of attribute names. + if (state.tagName) { + if (config.multilineTagIndentPastTag !== false) + return state.tagStart + state.tagName.length + 2; + else + return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); + } + if (config.alignCDATA && /$/, + blockCommentStart: "", + + configuration: config.htmlMode ? "html" : "xml", + helperType: config.htmlMode ? "html" : "xml", + + skipAttribute: function(state) { + if (state.state == attrValueState) + state.state = attrState + }, + + xmlCurrentTag: function(state) { + return state.tagName ? {name: state.tagName, close: state.type == "closeTag"} : null + }, + + xmlCurrentContext: function(state) { + var context = [] + for (var cx = state.context; cx; cx = cx.prev) + context.push(cx.tagName) + return context.reverse() + } + }; +}); + +CodeMirror.defineMIME("text/xml", "xml"); +CodeMirror.defineMIME("application/xml", "xml"); +if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) + CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js new file mode 100644 index 0000000000..395b6a7014 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js @@ -0,0 +1,448 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("xquery", function() { + + // The keywords object is set to the result of this self executing + // function. Each keyword is a property of the keywords object whose + // value is {type: atype, style: astyle} + var keywords = function(){ + // convenience functions used to build keywords object + function kw(type) {return {type: type, style: "keyword"};} + var operator = kw("operator") + , atom = {type: "atom", style: "atom"} + , punctuation = {type: "punctuation", style: null} + , qualifier = {type: "axis_specifier", style: "qualifier"}; + + // kwObj is what is return from this function at the end + var kwObj = { + ',': punctuation + }; + + // a list of 'basic' keywords. For each add a property to kwObj with the value of + // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} + var basic = ['after', 'all', 'allowing', 'ancestor', 'ancestor-or-self', 'any', 'array', 'as', + 'ascending', 'at', 'attribute', 'base-uri', 'before', 'boundary-space', 'by', 'case', 'cast', + 'castable', 'catch', 'child', 'collation', 'comment', 'construction', 'contains', 'content', + 'context', 'copy', 'copy-namespaces', 'count', 'decimal-format', 'declare', 'default', 'delete', + 'descendant', 'descendant-or-self', 'descending', 'diacritics', 'different', 'distance', + 'document', 'document-node', 'element', 'else', 'empty', 'empty-sequence', 'encoding', 'end', + 'entire', 'every', 'exactly', 'except', 'external', 'first', 'following', 'following-sibling', + 'for', 'from', 'ftand', 'ftnot', 'ft-option', 'ftor', 'function', 'fuzzy', 'greatest', 'group', + 'if', 'import', 'in', 'inherit', 'insensitive', 'insert', 'instance', 'intersect', 'into', + 'invoke', 'is', 'item', 'language', 'last', 'lax', 'least', 'let', 'levels', 'lowercase', 'map', + 'modify', 'module', 'most', 'namespace', 'next', 'no', 'node', 'nodes', 'no-inherit', + 'no-preserve', 'not', 'occurs', 'of', 'only', 'option', 'order', 'ordered', 'ordering', + 'paragraph', 'paragraphs', 'parent', 'phrase', 'preceding', 'preceding-sibling', 'preserve', + 'previous', 'processing-instruction', 'relationship', 'rename', 'replace', 'return', + 'revalidation', 'same', 'satisfies', 'schema', 'schema-attribute', 'schema-element', 'score', + 'self', 'sensitive', 'sentence', 'sentences', 'sequence', 'skip', 'sliding', 'some', 'stable', + 'start', 'stemming', 'stop', 'strict', 'strip', 'switch', 'text', 'then', 'thesaurus', 'times', + 'to', 'transform', 'treat', 'try', 'tumbling', 'type', 'typeswitch', 'union', 'unordered', + 'update', 'updating', 'uppercase', 'using', 'validate', 'value', 'variable', 'version', + 'weight', 'when', 'where', 'wildcards', 'window', 'with', 'without', 'word', 'words', 'xquery']; + for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; + + // a list of types. For each add a property to kwObj with the value of + // {type: "atom", style: "atom"} + var types = ['xs:anyAtomicType', 'xs:anySimpleType', 'xs:anyType', 'xs:anyURI', + 'xs:base64Binary', 'xs:boolean', 'xs:byte', 'xs:date', 'xs:dateTime', 'xs:dateTimeStamp', + 'xs:dayTimeDuration', 'xs:decimal', 'xs:double', 'xs:duration', 'xs:ENTITIES', 'xs:ENTITY', + 'xs:float', 'xs:gDay', 'xs:gMonth', 'xs:gMonthDay', 'xs:gYear', 'xs:gYearMonth', 'xs:hexBinary', + 'xs:ID', 'xs:IDREF', 'xs:IDREFS', 'xs:int', 'xs:integer', 'xs:item', 'xs:java', 'xs:language', + 'xs:long', 'xs:Name', 'xs:NCName', 'xs:negativeInteger', 'xs:NMTOKEN', 'xs:NMTOKENS', + 'xs:nonNegativeInteger', 'xs:nonPositiveInteger', 'xs:normalizedString', 'xs:NOTATION', + 'xs:numeric', 'xs:positiveInteger', 'xs:precisionDecimal', 'xs:QName', 'xs:short', 'xs:string', + 'xs:time', 'xs:token', 'xs:unsignedByte', 'xs:unsignedInt', 'xs:unsignedLong', + 'xs:unsignedShort', 'xs:untyped', 'xs:untypedAtomic', 'xs:yearMonthDuration']; + for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; + + // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} + var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; + for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; + + // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} + var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", + "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; + for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; + + return kwObj; + }(); + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + // the primary mode tokenizer + function tokenBase(stream, state) { + var ch = stream.next(), + mightBeFunction = false, + isEQName = isEQNameAhead(stream); + + // an XML tag (if not in some sub, chained tokenizer) + if (ch == "<") { + if(stream.match("!--", true)) + return chain(stream, state, tokenXMLComment); + + if(stream.match("![CDATA", false)) { + state.tokenize = tokenCDATA; + return "tag"; + } + + if(stream.match("?", false)) { + return chain(stream, state, tokenPreProcessing); + } + + var isclose = stream.eat("/"); + stream.eatSpace(); + var tagName = "", c; + while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; + + return chain(stream, state, tokenTag(tagName, isclose)); + } + // start code block + else if(ch == "{") { + pushStateStack(state, { type: "codeblock"}); + return null; + } + // end code block + else if(ch == "}") { + popStateStack(state); + return null; + } + // if we're in an XML block + else if(isInXmlBlock(state)) { + if(ch == ">") + return "tag"; + else if(ch == "/" && stream.eat(">")) { + popStateStack(state); + return "tag"; + } + else + return "variable"; + } + // if a number + else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); + return "atom"; + } + // comment start + else if (ch === "(" && stream.eat(":")) { + pushStateStack(state, { type: "comment"}); + return chain(stream, state, tokenComment); + } + // quoted string + else if (!isEQName && (ch === '"' || ch === "'")) + return chain(stream, state, tokenString(ch)); + // variable + else if(ch === "$") { + return chain(stream, state, tokenVariable); + } + // assignment + else if(ch ===":" && stream.eat("=")) { + return "keyword"; + } + // open paren + else if(ch === "(") { + pushStateStack(state, { type: "paren"}); + return null; + } + // close paren + else if(ch === ")") { + popStateStack(state); + return null; + } + // open paren + else if(ch === "[") { + pushStateStack(state, { type: "bracket"}); + return null; + } + // close paren + else if(ch === "]") { + popStateStack(state); + return null; + } + else { + var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; + + // if there's a EQName ahead, consume the rest of the string portion, it's likely a function + if(isEQName && ch === '\"') while(stream.next() !== '"'){} + if(isEQName && ch === '\'') while(stream.next() !== '\''){} + + // gobble up a word if the character is not known + if(!known) stream.eatWhile(/[\w\$_-]/); + + // gobble a colon in the case that is a lib func type call fn:doc + var foundColon = stream.eat(":"); + + // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier + // which should get matched as a keyword + if(!stream.eat(":") && foundColon) { + stream.eatWhile(/[\w\$_-]/); + } + // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) + if(stream.match(/^[ \t]*\(/, false)) { + mightBeFunction = true; + } + // is the word a keyword? + var word = stream.current(); + known = keywords.propertyIsEnumerable(word) && keywords[word]; + + // if we think it's a function call but not yet known, + // set style to variable for now for lack of something better + if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; + + // if the previous word was element, attribute, axis specifier, this word should be the name of that + if(isInXmlConstructor(state)) { + popStateStack(state); + return "variable"; + } + // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and + // push the stack so we know to look for it on the next word + if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); + + // if the word is known, return the details of that else just call this a generic 'word' + return known ? known.style : "variable"; + } + } + + // handle comments, including nested + function tokenComment(stream, state) { + var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + if(nestedCount > 0) + nestedCount--; + else { + popStateStack(state); + break; + } + } + else if(ch == ":" && maybeNested) { + nestedCount++; + } + maybeEnd = (ch == ":"); + maybeNested = (ch == "("); + } + + return "comment"; + } + + // tokenizer for string literals + // optionally pass a tokenizer function to set state.tokenize back to when finished + function tokenString(quote, f) { + return function(stream, state) { + var ch; + + if(isInString(state) && stream.current() == quote) { + popStateStack(state); + if(f) state.tokenize = f; + return "string"; + } + + pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); + + // if we're in a string and in an XML block, allow an embedded code block + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return "string"; + } + + + while (ch = stream.next()) { + if (ch == quote) { + popStateStack(state); + if(f) state.tokenize = f; + break; + } + else { + // if we're in a string and in an XML block, allow an embedded code block in an attribute + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return "string"; + } + + } + } + + return "string"; + }; + } + + // tokenizer for variables + function tokenVariable(stream, state) { + var isVariableChar = /[\w\$_-]/; + + // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote + if(stream.eat("\"")) { + while(stream.next() !== '\"'){}; + stream.eat(":"); + } else { + stream.eatWhile(isVariableChar); + if(!stream.match(":=", false)) stream.eat(":"); + } + stream.eatWhile(isVariableChar); + state.tokenize = tokenBase; + return "variable"; + } + + // tokenizer for XML tags + function tokenTag(name, isclose) { + return function(stream, state) { + stream.eatSpace(); + if(isclose && stream.eat(">")) { + popStateStack(state); + state.tokenize = tokenBase; + return "tag"; + } + // self closing tag without attributes? + if(!stream.eat("/")) + pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); + if(!stream.eat(">")) { + state.tokenize = tokenAttribute; + return "tag"; + } + else { + state.tokenize = tokenBase; + } + return "tag"; + }; + } + + // tokenizer for XML attributes + function tokenAttribute(stream, state) { + var ch = stream.next(); + + if(ch == "/" && stream.eat(">")) { + if(isInXmlAttributeBlock(state)) popStateStack(state); + if(isInXmlBlock(state)) popStateStack(state); + return "tag"; + } + if(ch == ">") { + if(isInXmlAttributeBlock(state)) popStateStack(state); + return "tag"; + } + if(ch == "=") + return null; + // quoted string + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch, tokenAttribute)); + + if(!isInXmlAttributeBlock(state)) + pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); + + stream.eat(/[a-zA-Z_:]/); + stream.eatWhile(/[-a-zA-Z0-9_:.]/); + stream.eatSpace(); + + // the case where the attribute has not value and the tag was closed + if(stream.match(">", false) || stream.match("/", false)) { + popStateStack(state); + state.tokenize = tokenBase; + } + + return "attribute"; + } + + // handle comments, including nested + function tokenXMLComment(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "-" && stream.match("->", true)) { + state.tokenize = tokenBase; + return "comment"; + } + } + } + + + // handle CDATA + function tokenCDATA(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "]" && stream.match("]", true)) { + state.tokenize = tokenBase; + return "comment"; + } + } + } + + // handle preprocessing instructions + function tokenPreProcessing(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "?" && stream.match(">", true)) { + state.tokenize = tokenBase; + return "comment meta"; + } + } + } + + + // functions to test the current context of the state + function isInXmlBlock(state) { return isIn(state, "tag"); } + function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } + function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } + function isInString(state) { return isIn(state, "string"); } + + function isEQNameAhead(stream) { + // assume we've already eaten a quote (") + if(stream.current() === '"') + return stream.match(/^[^\"]+\"\:/, false); + else if(stream.current() === '\'') + return stream.match(/^[^\"]+\'\:/, false); + else + return false; + } + + function isIn(state, type) { + return (state.stack.length && state.stack[state.stack.length - 1].type == type); + } + + function pushStateStack(state, newState) { + state.stack.push(newState); + } + + function popStateStack(state) { + state.stack.pop(); + var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; + state.tokenize = reinstateTokenize || tokenBase; + } + + // the interface for the mode API + return { + startState: function() { + return { + tokenize: tokenBase, + cc: [], + stack: [] + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + }, + + blockCommentStart: "(:", + blockCommentEnd: ":)" + + }; + +}); + +CodeMirror.defineMIME("application/xquery", "xquery"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js new file mode 100644 index 0000000000..b7ac96b71d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js @@ -0,0 +1,204 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Yacas mode copyright (c) 2015 by Grzegorz Mazur +// Loosely based on mathematica mode by Calin Barbat + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('yacas', function(_config, _parserConfig) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var bodiedOps = words("Assert BackQuote D Defun Deriv For ForEach FromFile " + + "FromString Function Integrate InverseTaylor Limit " + + "LocalSymbols Macro MacroRule MacroRulePattern " + + "NIntegrate Rule RulePattern Subst TD TExplicitSum " + + "TSum Taylor Taylor1 Taylor2 Taylor3 ToFile " + + "ToStdout ToString TraceRule Until While"); + + // patterns + var pFloatForm = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)"; + var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)"; + + // regular expressions + var reFloatForm = new RegExp(pFloatForm); + var reIdentifier = new RegExp(pIdentifier); + var rePattern = new RegExp(pIdentifier + "?_" + pIdentifier); + var reFunctionLike = new RegExp(pIdentifier + "\\s*\\("); + + function tokenBase(stream, state) { + var ch; + + // get next character + ch = stream.next(); + + // string + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + + // comment + if (ch === '/') { + if (stream.eat('*')) { + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + + // go back one character + stream.backUp(1); + + // update scope info + var m = stream.match(/^(\w+)\s*\(/, false); + if (m !== null && bodiedOps.hasOwnProperty(m[1])) + state.scopes.push('bodied'); + + var scope = currentScope(state); + + if (scope === 'bodied' && ch === '[') + state.scopes.pop(); + + if (ch === '[' || ch === '{' || ch === '(') + state.scopes.push(ch); + + scope = currentScope(state); + + if (scope === '[' && ch === ']' || + scope === '{' && ch === '}' || + scope === '(' && ch === ')') + state.scopes.pop(); + + if (ch === ';') { + while (scope === 'bodied') { + state.scopes.pop(); + scope = currentScope(state); + } + } + + // look for ordered rules + if (stream.match(/\d+ *#/, true, false)) { + return 'qualifier'; + } + + // look for numbers + if (stream.match(reFloatForm, true, false)) { + return 'number'; + } + + // look for placeholders + if (stream.match(rePattern, true, false)) { + return 'variable-3'; + } + + // match all braces separately + if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { + return 'bracket'; + } + + // literals looking like function calls + if (stream.match(reFunctionLike, true, false)) { + stream.backUp(1); + return 'variable'; + } + + // all other identifiers + if (stream.match(reIdentifier, true, false)) { + return 'variable-2'; + } + + // operators; note that operators like @@ or /; are matched separately for each symbol. + if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%|#)/, true, false)) { + return 'operator'; + } + + // everything else is an error + return 'error'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while((next = stream.next()) != null) { + if (prev === '*' && next === '/') { + state.tokenize = tokenBase; + break; + } + prev = next; + } + return 'comment'; + } + + function currentScope(state) { + var scope = null; + if (state.scopes.length > 0) + scope = state.scopes[state.scopes.length - 1]; + return scope; + } + + return { + startState: function() { + return { + tokenize: tokenBase, + scopes: [] + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + indent: function(state, textAfter) { + if (state.tokenize !== tokenBase && state.tokenize !== null) + return CodeMirror.Pass; + + var delta = 0; + if (textAfter === ']' || textAfter === '];' || + textAfter === '}' || textAfter === '};' || + textAfter === ');') + delta = -1; + + return (state.scopes.length + delta) * _config.indentUnit; + }, + electricChars: "{}[]();", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME('text/x-yacas', { + name: 'yacas' +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js new file mode 100644 index 0000000000..5c6175e4ec --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../yaml/yaml")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../yaml/yaml"], mod) + else // Plain browser env + mod(CodeMirror) +})(function (CodeMirror) { + + var START = 0, FRONTMATTER = 1, BODY = 2 + + // a mixed mode for Markdown text with an optional YAML front matter + CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) { + var yamlMode = CodeMirror.getMode(config, "yaml") + var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm") + + function localMode(state) { + return state.state == FRONTMATTER ? {mode: yamlMode, state: state.yaml} : {mode: innerMode, state: state.inner} + } + + return { + startState: function () { + return { + state: START, + yaml: null, + inner: CodeMirror.startState(innerMode) + } + }, + copyState: function (state) { + return { + state: state.state, + yaml: state.yaml && CodeMirror.copyState(yamlMode, state.yaml), + inner: CodeMirror.copyState(innerMode, state.inner) + } + }, + token: function (stream, state) { + if (state.state == START) { + if (stream.match('---', false)) { + state.state = FRONTMATTER + state.yaml = CodeMirror.startState(yamlMode) + return yamlMode.token(stream, state.yaml) + } else { + state.state = BODY + return innerMode.token(stream, state.inner) + } + } else if (state.state == FRONTMATTER) { + var end = stream.sol() && stream.match(/(---|\.\.\.)/, false) + var style = yamlMode.token(stream, state.yaml) + if (end) { + state.state = BODY + state.yaml = null + } + return style + } else { + return innerMode.token(stream, state.inner) + } + }, + innerMode: localMode, + indent: function(state, a, b) { + var m = localMode(state) + return m.mode.indent ? m.mode.indent(m.state, a, b) : CodeMirror.Pass + }, + blankLine: function (state) { + var m = localMode(state) + if (m.mode.blankLine) return m.mode.blankLine(m.state) + } + } + }) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js new file mode 100644 index 0000000000..d464941026 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js @@ -0,0 +1,120 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("yaml", function() { + + var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; + var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); + + return { + token: function(stream, state) { + var ch = stream.peek(); + var esc = state.escaped; + state.escaped = false; + /* comments */ + if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { + stream.skipToEnd(); + return "comment"; + } + + if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) + return "string"; + + if (state.literal && stream.indentation() > state.keyCol) { + stream.skipToEnd(); return "string"; + } else if (state.literal) { state.literal = false; } + if (stream.sol()) { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + /* document start */ + if(stream.match('---')) { return "def"; } + /* document end */ + if (stream.match('...')) { return "def"; } + /* array list item */ + if (stream.match(/\s*-\s+/)) { return 'meta'; } + } + /* inline pairs/lists */ + if (stream.match(/^(\{|\}|\[|\])/)) { + if (ch == '{') + state.inlinePairs++; + else if (ch == '}') + state.inlinePairs--; + else if (ch == '[') + state.inlineList++; + else + state.inlineList--; + return 'meta'; + } + + /* list separator */ + if (state.inlineList > 0 && !esc && ch == ',') { + stream.next(); + return 'meta'; + } + /* pairs separator */ + if (state.inlinePairs > 0 && !esc && ch == ',') { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + stream.next(); + return 'meta'; + } + + /* start of value of a pair */ + if (state.pairStart) { + /* block literals */ + if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; + /* references */ + if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } + /* numbers */ + if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } + if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } + /* keywords */ + if (stream.match(keywordRegex)) { return 'keyword'; } + } + + /* pairs (associative arrays) -> key */ + if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { + state.pair = true; + state.keyCol = stream.indentation(); + return "atom"; + } + if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } + + /* nothing found, continue */ + state.pairStart = false; + state.escaped = (ch == '\\'); + stream.next(); + return null; + }, + startState: function() { + return { + pair: false, + pairStart: false, + keyCol: 0, + inlinePairs: 0, + inlineList: 0, + literal: false, + escaped: false + }; + }, + lineComment: "#", + fold: "indent" + }; +}); + +CodeMirror.defineMIME("text/x-yaml", "yaml"); +CodeMirror.defineMIME("text/yaml", "yaml"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js new file mode 100644 index 0000000000..8cea4ff90c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js @@ -0,0 +1,116 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('z80', function(_config, parserConfig) { + var ez80 = parserConfig.ez80; + var keywords1, keywords2; + if (ez80) { + keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i; + keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i; + } else { + keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; + keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i; + } + + var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; + var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; + var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; + var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; + + return { + startState: function() { + return { + context: 0 + }; + }, + token: function(stream, state) { + if (!stream.column()) + state.context = 0; + + if (stream.eatSpace()) + return null; + + var w; + + if (stream.eatWhile(/\w/)) { + if (ez80 && stream.eat('.')) { + stream.eatWhile(/\w/); + } + w = stream.current(); + + if (stream.indentation()) { + if ((state.context == 1 || state.context == 4) && variables1.test(w)) { + state.context = 4; + return 'var2'; + } + + if (state.context == 2 && variables2.test(w)) { + state.context = 4; + return 'var3'; + } + + if (keywords1.test(w)) { + state.context = 1; + return 'keyword'; + } else if (keywords2.test(w)) { + state.context = 2; + return 'keyword'; + } else if (state.context == 4 && numbers.test(w)) { + return 'number'; + } + + if (errors.test(w)) + return 'error'; + } else if (stream.match(numbers)) { + return 'number'; + } else { + return null; + } + } else if (stream.eat(';')) { + stream.skipToEnd(); + return 'comment'; + } else if (stream.eat('"')) { + while (w = stream.next()) { + if (w == '"') + break; + + if (w == '\\') + stream.next(); + } + return 'string'; + } else if (stream.eat('\'')) { + if (stream.match(/\\?.'/)) + return 'number'; + } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { + state.context = 5; + + if (stream.eatWhile(/\w/)) + return 'def'; + } else if (stream.eat('$')) { + if (stream.eatWhile(/[\da-f]/i)) + return 'number'; + } else if (stream.eat('%')) { + if (stream.eatWhile(/[01]/)) + return 'number'; + } else { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-z80", "z80"); +CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css new file mode 100644 index 0000000000..7132655306 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css @@ -0,0 +1,41 @@ +/* + + Name: 3024 day + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; } +.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; } + +.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; } +.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; } + +.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; } +.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } +.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; } + +.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; } + +.cm-s-3024-day span.cm-comment { color: #cdab53; } +.cm-s-3024-day span.cm-atom { color: #a16a94; } +.cm-s-3024-day span.cm-number { color: #a16a94; } + +.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; } +.cm-s-3024-day span.cm-keyword { color: #db2d20; } +.cm-s-3024-day span.cm-string { color: #fded02; } + +.cm-s-3024-day span.cm-variable { color: #01a252; } +.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-day span.cm-def { color: #e8bbd0; } +.cm-s-3024-day span.cm-bracket { color: #3a3432; } +.cm-s-3024-day span.cm-tag { color: #db2d20; } +.cm-s-3024-day span.cm-link { color: #a16a94; } +.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; } + +.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css new file mode 100644 index 0000000000..adc5900ad1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css @@ -0,0 +1,39 @@ +/* + + Name: 3024 night + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-night.CodeMirror { background: #090300; color: #d6d5d4; } +.cm-s-3024-night div.CodeMirror-selected { background: #3a3432; } +.cm-s-3024-night .CodeMirror-line::selection, .cm-s-3024-night .CodeMirror-line > span::selection, .cm-s-3024-night .CodeMirror-line > span > span::selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-line::-moz-selection, .cm-s-3024-night .CodeMirror-line > span::-moz-selection, .cm-s-3024-night .CodeMirror-line > span > span::-moz-selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-gutters { background: #090300; border-right: 0px; } +.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } +.cm-s-3024-night .CodeMirror-linenumber { color: #5c5855; } + +.cm-s-3024-night .CodeMirror-cursor { border-left: 1px solid #807d7c; } + +.cm-s-3024-night span.cm-comment { color: #cdab53; } +.cm-s-3024-night span.cm-atom { color: #a16a94; } +.cm-s-3024-night span.cm-number { color: #a16a94; } + +.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute { color: #01a252; } +.cm-s-3024-night span.cm-keyword { color: #db2d20; } +.cm-s-3024-night span.cm-string { color: #fded02; } + +.cm-s-3024-night span.cm-variable { color: #01a252; } +.cm-s-3024-night span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-night span.cm-def { color: #e8bbd0; } +.cm-s-3024-night span.cm-bracket { color: #d6d5d4; } +.cm-s-3024-night span.cm-tag { color: #db2d20; } +.cm-s-3024-night span.cm-link { color: #a16a94; } +.cm-s-3024-night span.cm-error { background: #db2d20; color: #807d7c; } + +.cm-s-3024-night .CodeMirror-activeline-background { background: #2F2F2F; } +.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css new file mode 100644 index 0000000000..3e516a67f9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css @@ -0,0 +1,268 @@ +/* + * abbott.css + * A warm, dark theme for prose and code, with pastels and pretty greens. + * + * Ported from abbott.vim (https://github.com/bcat/abbott.vim) version 2.1. + * Original design and CodeMirror port by Jonathan Rascher. + * + * This theme shares the following color palette with the Vim color scheme. + * + * Brown shades: + * bistre: #231c14 + * chocolate: #3c3022 + * cocoa: #745d42 + * vanilla_cream: #fef3b4 + * + * Red shades: + * crimson: #d80450 + * cinnabar: #f63f05 + * + * Green shades: + * dark_olive: #273900 + * forest_green: #24a507 + * chartreuse: #a0ea00 + * pastel_chartreuse: #d8ff84 + * + * Yellow shades: + * marigold: #fbb32f + * lemon_meringue: #fbec5d + * + * Blue shades: + * cornflower_blue: #3f91f1 + * periwinkle_blue: #8ccdf0 + * + * Magenta shades: + * french_pink: #ec6c99 + * lavender: #e6a2f3 + * + * Cyan shades: + * zomp: #39a78d + * seafoam_green: #00ff7f + */ + +/* Style the UI: */ + +/* Equivalent to Vim's Normal group. */ +.cm-s-abbott.CodeMirror { + background: #231c14 /* bistre */; + color: #d8ff84 /* pastel_chartreuse */; +} + +/* Roughly equivalent to Vim's LineNr group. */ +.cm-s-abbott .CodeMirror-gutters { + background: #231c14 /* bistre */; + border: none; +} +.cm-s-abbott .CodeMirror-linenumber { color: #fbec5d /* lemon_meringue */; } + +.cm-s-abbott .CodeMirror-guttermarker { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's FoldColumn group. */ +.cm-s-abbott .CodeMirror-guttermarker-subtle { color: #fbb32f /* marigold */; } + +/* + * Roughly equivalent to Vim's CursorColumn group. (We use a brighter color + * since Vim's cursorcolumn option highlights a whole column, whereas + * CodeMirror's rule just highlights a thin line.) + */ +.cm-s-abbott .CodeMirror-ruler { border-color: #745d42 /* cocoa */; } + +/* Equivalent to Vim's Cursor group in insert mode. */ +.cm-s-abbott .CodeMirror-cursor { border-color: #a0ea00 /* chartreuse */; } + +/* Equivalent to Vim's Cursor group in normal mode. */ +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursor, +.cm-s-abbott .cm-animate-fat-cursor { + /* + * CodeMirror doesn't allow changing the foreground color of the character + * under the cursor, so we can't use a reverse video effect for the cursor. + * Instead, make it semitransparent. + */ + background: rgba(160, 234, 0, 0.5) /* chartreuse */; +} +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursors { + /* + * Boost the z-index so the fat cursor shows up on top of text and + * matchingbracket/matchingtag highlights. + */ + z-index: 3; +} + +/* Equivalent to Vim's Cursor group in replace mode. */ +.cm-s-abbott .CodeMirror-overwrite .CodeMirror-cursor { + border-bottom: 1px solid #a0ea00 /* chartreuse */; + border-left: none; + width: auto; +} + +/* Roughly equivalent to Vim's CursorIM group. */ +.cm-s-abbott .CodeMirror-secondarycursor { + border-color: #00ff7f /* seafoam_green */; +} + +/* Roughly equivalent to Vim's Visual group. */ +.cm-s-abbott .CodeMirror-selected, +.cm-s-abbott.CodeMirror-focused .CodeMirror-selected { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::selection, +.cm-s-abbott .CodeMirror-line > span::selection, +.cm-s-abbott .CodeMirror-line > span > span::selection { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::-moz-selection, +.cm-s-abbott .CodeMirror-line > span::-moz-selection, +.cm-s-abbott .CodeMirror-line > span > span::-moz-selection { + background: #273900 /* dark_olive */; +} + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott .cm-tab { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Search group. */ +.cm-s-abbott .cm-searching { + background: #fef3b4 /* vanilla_cream */ !important; + color: #231c14 /* bistre */ !important; +} + +/* Style syntax highlighting modes: */ + +/* Equivalent to Vim's Comment group. */ +.cm-s-abbott span.cm-comment { + color: #fbb32f /* marigold */; + font-style: italic; +} + +/* Equivalent to Vim's String group. */ +.cm-s-abbott span.cm-string, +.cm-s-abbott span.cm-string-2 { + color: #e6a2f3 /* lavender */; +} + +/* Equivalent to Vim's Constant group. */ +.cm-s-abbott span.cm-number, +.cm-s-abbott span.cm-string.cm-url { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott span.cm-invalidchar { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Special group. */ +.cm-s-abbott span.cm-atom { color: #fef3b4 /* vanilla_cream */; } + +/* Equivalent to Vim's Delimiter group. */ +.cm-s-abbott span.cm-bracket, +.cm-s-abbott span.cm-punctuation { + color: #fef3b4 /* vanilla_cream */; +} + +/* Equivalent Vim's Operator group. */ +.cm-s-abbott span.cm-operator { font-weight: bold; } + +/* Roughly equivalent to Vim's Identifier group. */ +.cm-s-abbott span.cm-def, +.cm-s-abbott span.cm-variable, +.cm-s-abbott span.cm-variable-2, +.cm-s-abbott span.cm-variable-3 { + color: #8ccdf0 /* periwinkle_blue */; +} + +/* Roughly equivalent to Vim's Function group. */ +.cm-s-abbott span.cm-builtin, +.cm-s-abbott span.cm-property, +.cm-s-abbott span.cm-qualifier { + color: #3f91f1 /* cornflower_blue */; +} + +/* Equivalent to Vim's Type group. */ +.cm-s-abbott span.cm-type { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's Keyword group. */ +.cm-s-abbott span.cm-keyword { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's PreProc group. */ +.cm-s-abbott span.cm-meta { color: #ec6c99 /* french_pink */; } + +/* Equivalent to Vim's htmlTagName group (linked to Statement). */ +.cm-s-abbott span.cm-tag { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's htmlArg group (linked to Type). */ +.cm-s-abbott span.cm-attribute { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's htmlH1, markdownH1, etc. groups (linked to Title). */ +.cm-s-abbott span.cm-header { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's markdownRule group (linked to PreProc). */ +.cm-s-abbott span.cm-hr { color: #ec6c99 /* french_pink */; } + +/* Roughly equivalent to Vim's Underlined group. */ +.cm-s-abbott span.cm-link { color: #e6a2f3 /* lavender */; } + +/* Equivalent to Vim's diffRemoved group. */ +.cm-s-abbott span.cm-negative { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Equivalent to Vim's diffAdded group. */ +.cm-s-abbott span.cm-positive { + background: #a0ea00 /* chartreuse */; + color: #231c14 /* bistre */; + font-weight: bold; +} + +/* Equivalent to Vim's Error group. */ +.cm-s-abbott span.cm-error { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Style addons: */ + +/* Equivalent to Vim's MatchParen group. */ +.cm-s-abbott span.CodeMirror-matchingbracket { + background: #745d42 /* cocoa */ !important; + color: #231c14 /* bistre */ !important; + font-weight: bold; +} + +/* + * Roughly equivalent to Vim's Error group. (Vim doesn't seem to have a direct + * equivalent in its own matchparen plugin, but many syntax highlighting plugins + * mark mismatched brackets as Error.) + */ +.cm-s-abbott span.CodeMirror-nonmatchingbracket { + background: #d80450 /* crimson */ !important; + color: #231c14 /* bistre */ !important; +} + +.cm-s-abbott .CodeMirror-matchingtag, +.cm-s-abbott .cm-matchhighlight { + outline: 1px solid #39a78d /* zomp */; +} + +/* Equivalent to Vim's CursorLine group. */ +.cm-s-abbott .CodeMirror-activeline-background, +.cm-s-abbott .CodeMirror-activeline-gutter { + background: #3c3022 /* chocolate */; +} + +/* Equivalent to Vim's CursorLineNr group. */ +.cm-s-abbott .CodeMirror-activeline-gutter .CodeMirror-linenumber { + color: #d8ff84 /* pastel_chartreuse */; + font-weight: bold; +} + +/* Roughly equivalent to Vim's Folded group. */ +.cm-s-abbott .CodeMirror-foldmarker { + color: #f63f05 /* cinnabar */; + text-shadow: none; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css new file mode 100644 index 0000000000..cf93530946 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css @@ -0,0 +1,32 @@ +.cm-s-abcdef.CodeMirror { background: #0f0f0f; color: #defdef; } +.cm-s-abcdef div.CodeMirror-selected { background: #515151; } +.cm-s-abcdef .CodeMirror-line::selection, .cm-s-abcdef .CodeMirror-line > span::selection, .cm-s-abcdef .CodeMirror-line > span > span::selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-line::-moz-selection, .cm-s-abcdef .CodeMirror-line > span::-moz-selection, .cm-s-abcdef .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-gutters { background: #555; border-right: 2px solid #314151; } +.cm-s-abcdef .CodeMirror-guttermarker { color: #222; } +.cm-s-abcdef .CodeMirror-guttermarker-subtle { color: azure; } +.cm-s-abcdef .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-abcdef .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-abcdef span.cm-keyword { color: darkgoldenrod; font-weight: bold; } +.cm-s-abcdef span.cm-atom { color: #77F; } +.cm-s-abcdef span.cm-number { color: violet; } +.cm-s-abcdef span.cm-def { color: #fffabc; } +.cm-s-abcdef span.cm-variable { color: #abcdef; } +.cm-s-abcdef span.cm-variable-2 { color: #cacbcc; } +.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; } +.cm-s-abcdef span.cm-property { color: #fedcba; } +.cm-s-abcdef span.cm-operator { color: #ff0; } +.cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;} +.cm-s-abcdef span.cm-string { color: #2b4; } +.cm-s-abcdef span.cm-meta { color: #C9F; } +.cm-s-abcdef span.cm-qualifier { color: #FFF700; } +.cm-s-abcdef span.cm-builtin { color: #30aabc; } +.cm-s-abcdef span.cm-bracket { color: #8a8a8a; } +.cm-s-abcdef span.cm-tag { color: #FFDD44; } +.cm-s-abcdef span.cm-attribute { color: #DDFF00; } +.cm-s-abcdef span.cm-error { color: #FF0000; } +.cm-s-abcdef span.cm-header { color: aquamarine; font-weight: bold; } +.cm-s-abcdef span.cm-link { color: blueviolet; } + +.cm-s-abcdef .CodeMirror-activeline-background { background: #314151; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css new file mode 100644 index 0000000000..88d332e1a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css @@ -0,0 +1,5 @@ +.cm-s-ambiance.CodeMirror { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css new file mode 100644 index 0000000000..782fca43f5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css @@ -0,0 +1,74 @@ +/* ambiance theme for codemirror */ + +/* Color scheme */ + +.cm-s-ambiance .cm-header { color: blue; } +.cm-s-ambiance .cm-quote { color: #24C2C7; } + +.cm-s-ambiance .cm-keyword { color: #cda869; } +.cm-s-ambiance .cm-atom { color: #CF7EA9; } +.cm-s-ambiance .cm-number { color: #78CF8A; } +.cm-s-ambiance .cm-def { color: #aac6e3; } +.cm-s-ambiance .cm-variable { color: #ffb795; } +.cm-s-ambiance .cm-variable-2 { color: #eed1b3; } +.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; } +.cm-s-ambiance .cm-property { color: #eed1b3; } +.cm-s-ambiance .cm-operator { color: #fa8d6a; } +.cm-s-ambiance .cm-comment { color: #555; font-style:italic; } +.cm-s-ambiance .cm-string { color: #8f9d6a; } +.cm-s-ambiance .cm-string-2 { color: #9d937c; } +.cm-s-ambiance .cm-meta { color: #D2A8A1; } +.cm-s-ambiance .cm-qualifier { color: yellow; } +.cm-s-ambiance .cm-builtin { color: #9999cc; } +.cm-s-ambiance .cm-bracket { color: #24C2C7; } +.cm-s-ambiance .cm-tag { color: #fee4ff; } +.cm-s-ambiance .cm-attribute { color: #9B859D; } +.cm-s-ambiance .cm-hr { color: pink; } +.cm-s-ambiance .cm-link { color: #F4C20B; } +.cm-s-ambiance .cm-special { color: #FF9D00; } +.cm-s-ambiance .cm-error { color: #AF2018; } + +.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } +.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } + +.cm-s-ambiance div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } +.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::selection, .cm-s-ambiance .CodeMirror-line > span::selection, .cm-s-ambiance .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::-moz-selection, .cm-s-ambiance .CodeMirror-line > span::-moz-selection, .cm-s-ambiance .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } + +/* Editor styling */ + +.cm-s-ambiance.CodeMirror { + line-height: 1.40em; + color: #E6E1DC; + background-color: #202020; + -webkit-box-shadow: inset 0 0 10px black; + -moz-box-shadow: inset 0 0 10px black; + box-shadow: inset 0 0 10px black; +} + +.cm-s-ambiance .CodeMirror-gutters { + background: #3D3D3D; + border-right: 1px solid #4D4D4D; + box-shadow: 0 10px 20px black; +} + +.cm-s-ambiance .CodeMirror-linenumber { + text-shadow: 0px 1px 1px #4d4d4d; + color: #111; + padding: 0 5px; +} + +.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } +.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } + +.cm-s-ambiance .CodeMirror-cursor { border-left: 1px solid #7991E8; } + +.cm-s-ambiance .CodeMirror-activeline-background { + background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); +} + +.cm-s-ambiance.CodeMirror, +.cm-s-ambiance .CodeMirror-gutters { + background-image: url("data:image/png;base64,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"); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css new file mode 100644 index 0000000000..13656b94bb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css @@ -0,0 +1,44 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-dark.CodeMirror { background: #0a0e14; color: #b3b1ad; } +.cm-s-ayu-dark div.CodeMirror-selected { background: #273747; } +.cm-s-ayu-dark .CodeMirror-line::selection, .cm-s-ayu-dark .CodeMirror-line > span::selection, .cm-s-ayu-dark .CodeMirror-line > span > span::selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-line::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-gutters { background: #0a0e14; border-right: 0px; } +.cm-s-ayu-dark .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-dark .CodeMirror-guttermarker-subtle { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-linenumber { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-cursor { border-left: 1px solid #e6b450; } +.cm-s-ayu-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-ayu-dark .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-dark span.cm-comment { color: #626a73; } +.cm-s-ayu-dark span.cm-atom { color: #ae81ff; } +.cm-s-ayu-dark span.cm-number { color: #e6b450; } + +.cm-s-ayu-dark span.cm-comment.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-comment.cm-def { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-comment.cm-tag { color: #39bae6; } +.cm-s-ayu-dark span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-dark span.cm-property, .cm-s-ayu-dark span.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-keyword { color: #ff8f40; } +.cm-s-ayu-dark span.cm-builtin { color: #e6b450; } +.cm-s-ayu-dark span.cm-string { color: #c2d94c; } + +.cm-s-ayu-dark span.cm-variable { color: #b3b1ad; } +.cm-s-ayu-dark span.cm-variable-2 { color: #f07178; } +.cm-s-ayu-dark span.cm-variable-3 { color: #39bae6; } +.cm-s-ayu-dark span.cm-type { color: #ff8f40; } +.cm-s-ayu-dark span.cm-def { color: #ffee99; } +.cm-s-ayu-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-ayu-dark span.cm-tag { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-header { color: #c2d94c; } +.cm-s-ayu-dark span.cm-link { color: #39bae6; } +.cm-s-ayu-dark span.cm-error { color: #ff3333; } + +.cm-s-ayu-dark .CodeMirror-activeline-background { background: #01060e; } +.cm-s-ayu-dark .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css new file mode 100644 index 0000000000..19403cefb5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css @@ -0,0 +1,45 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-mirage.CodeMirror { background: #1f2430; color: #cbccc6; } +.cm-s-ayu-mirage div.CodeMirror-selected { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::selection, .cm-s-ayu-mirage .CodeMirror-line > span::selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::selection { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::-moz-selection { background: rgba(25, 30, 42, 99); } +.cm-s-ayu-mirage .CodeMirror-gutters { background: #1f2430; border-right: 0px; } +.cm-s-ayu-mirage .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-mirage .CodeMirror-guttermarker-subtle { color: rgba(112, 122, 140, 66); } +.cm-s-ayu-mirage .CodeMirror-linenumber { color: rgba(61, 66, 77, 99); } +.cm-s-ayu-mirage .CodeMirror-cursor { border-left: 1px solid #ffcc66; } +.cm-s-ayu-mirage.cm-fat-cursor .CodeMirror-cursor {background-color: #a2a8a175 !important;} +.cm-s-ayu-mirage .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-mirage span.cm-comment { color: #5c6773; font-style:italic; } +.cm-s-ayu-mirage span.cm-atom { color: #ae81ff; } +.cm-s-ayu-mirage span.cm-number { color: #ffcc66; } + +.cm-s-ayu-mirage span.cm-comment.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-comment.cm-def { color: #d4bfff; } +.cm-s-ayu-mirage span.cm-comment.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-mirage span.cm-property { color: #f29e74; } +.cm-s-ayu-mirage span.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-keyword { color: #ffa759; } +.cm-s-ayu-mirage span.cm-builtin { color: #ffcc66; } +.cm-s-ayu-mirage span.cm-string { color: #bae67e; } + +.cm-s-ayu-mirage span.cm-variable { color: #cbccc6; } +.cm-s-ayu-mirage span.cm-variable-2 { color: #f28779; } +.cm-s-ayu-mirage span.cm-variable-3 { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-type { color: #ffa759; } +.cm-s-ayu-mirage span.cm-def { color: #ffd580; } +.cm-s-ayu-mirage span.cm-bracket { color: rgba(92, 207, 230, 80); } +.cm-s-ayu-mirage span.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-header { color: #bae67e; } +.cm-s-ayu-mirage span.cm-link { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-error { color: #ff3333; } + +.cm-s-ayu-mirage .CodeMirror-activeline-background { background: #191e2a; } +.cm-s-ayu-mirage .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css new file mode 100644 index 0000000000..b3c31aba20 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css @@ -0,0 +1,40 @@ +/* + + Name: Base16 Default Dark + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-dark.CodeMirror { background: #151515; color: #e0e0e0; } +.cm-s-base16-dark div.CodeMirror-selected { background: #303030; } +.cm-s-base16-dark .CodeMirror-line::selection, .cm-s-base16-dark .CodeMirror-line > span::selection, .cm-s-base16-dark .CodeMirror-line > span > span::selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-line::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-gutters { background: #151515; border-right: 0px; } +.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } +.cm-s-base16-dark .CodeMirror-linenumber { color: #505050; } +.cm-s-base16-dark .CodeMirror-cursor { border-left: 1px solid #b0b0b0; } +.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-base16-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } + +.cm-s-base16-dark span.cm-comment { color: #8f5536; } +.cm-s-base16-dark span.cm-atom { color: #aa759f; } +.cm-s-base16-dark span.cm-number { color: #aa759f; } + +.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute { color: #90a959; } +.cm-s-base16-dark span.cm-keyword { color: #ac4142; } +.cm-s-base16-dark span.cm-string { color: #f4bf75; } + +.cm-s-base16-dark span.cm-variable { color: #90a959; } +.cm-s-base16-dark span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-dark span.cm-def { color: #d28445; } +.cm-s-base16-dark span.cm-bracket { color: #e0e0e0; } +.cm-s-base16-dark span.cm-tag { color: #ac4142; } +.cm-s-base16-dark span.cm-link { color: #aa759f; } +.cm-s-base16-dark span.cm-error { background: #ac4142; color: #b0b0b0; } + +.cm-s-base16-dark .CodeMirror-activeline-background { background: #202020; } +.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css new file mode 100644 index 0000000000..1d5f582f6a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css @@ -0,0 +1,38 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; } +.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; } +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; } + +.cm-s-base16-light span.cm-comment { color: #8f5536; } +.cm-s-base16-light span.cm-atom { color: #aa759f; } +.cm-s-base16-light span.cm-number { color: #aa759f; } + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; } +.cm-s-base16-light span.cm-keyword { color: #ac4142; } +.cm-s-base16-light span.cm-string { color: #f4bf75; } + +.cm-s-base16-light span.cm-variable { color: #90a959; } +.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-light span.cm-def { color: #d28445; } +.cm-s-base16-light span.cm-bracket { color: #202020; } +.cm-s-base16-light span.cm-tag { color: #ac4142; } +.cm-s-base16-light span.cm-link { color: #aa759f; } +.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; } + +.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; } +.cm-s-base16-light .CodeMirror-matchingbracket { color: #f5f5f5 !important; background-color: #6A9FB5 !important} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css new file mode 100644 index 0000000000..60913ba938 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css @@ -0,0 +1,34 @@ +/* + + Name: Bespin + Author: Mozilla / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;} +.cm-s-bespin div.CodeMirror-selected {background: #36312e !important;} +.cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;} +.cm-s-bespin .CodeMirror-linenumber {color: #666666;} +.cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;} + +.cm-s-bespin span.cm-comment {color: #937121;} +.cm-s-bespin span.cm-atom {color: #9b859d;} +.cm-s-bespin span.cm-number {color: #9b859d;} + +.cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;} +.cm-s-bespin span.cm-keyword {color: #cf6a4c;} +.cm-s-bespin span.cm-string {color: #f9ee98;} + +.cm-s-bespin span.cm-variable {color: #54be0d;} +.cm-s-bespin span.cm-variable-2 {color: #5ea6ea;} +.cm-s-bespin span.cm-def {color: #cf7d34;} +.cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;} +.cm-s-bespin span.cm-bracket {color: #9d9b97;} +.cm-s-bespin span.cm-tag {color: #cf6a4c;} +.cm-s-bespin span.cm-link {color: #9b859d;} + +.cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-bespin .CodeMirror-activeline-background { background: #404040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css new file mode 100644 index 0000000000..b6eaedb180 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css @@ -0,0 +1,32 @@ +/* Port of TextMate's Blackboard theme */ + +.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } +.cm-s-blackboard div.CodeMirror-selected { background: #253B76; } +.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } +.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } +.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } +.cm-s-blackboard .CodeMirror-linenumber { color: #888; } +.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } + +.cm-s-blackboard .cm-keyword { color: #FBDE2D; } +.cm-s-blackboard .cm-atom { color: #D8FA3C; } +.cm-s-blackboard .cm-number { color: #D8FA3C; } +.cm-s-blackboard .cm-def { color: #8DA6CE; } +.cm-s-blackboard .cm-variable { color: #FF6400; } +.cm-s-blackboard .cm-operator { color: #FBDE2D; } +.cm-s-blackboard .cm-comment { color: #AEAEAE; } +.cm-s-blackboard .cm-string { color: #61CE3C; } +.cm-s-blackboard .cm-string-2 { color: #61CE3C; } +.cm-s-blackboard .cm-meta { color: #D8FA3C; } +.cm-s-blackboard .cm-builtin { color: #8DA6CE; } +.cm-s-blackboard .cm-tag { color: #8DA6CE; } +.cm-s-blackboard .cm-attribute { color: #8DA6CE; } +.cm-s-blackboard .cm-header { color: #FF6400; } +.cm-s-blackboard .cm-hr { color: #AEAEAE; } +.cm-s-blackboard .cm-link { color: #8DA6CE; } +.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } + +.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; } +.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css new file mode 100644 index 0000000000..bbbda3b543 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css @@ -0,0 +1,25 @@ +.cm-s-cobalt.CodeMirror { background: #002240; color: white; } +.cm-s-cobalt div.CodeMirror-selected { background: #b36539; } +.cm-s-cobalt .CodeMirror-line::selection, .cm-s-cobalt .CodeMirror-line > span::selection, .cm-s-cobalt .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-line::-moz-selection, .cm-s-cobalt .CodeMirror-line > span::-moz-selection, .cm-s-cobalt .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } +.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-cobalt span.cm-comment { color: #08f; } +.cm-s-cobalt span.cm-atom { color: #845dc4; } +.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } +.cm-s-cobalt span.cm-keyword { color: #ffee80; } +.cm-s-cobalt span.cm-string { color: #3ad900; } +.cm-s-cobalt span.cm-meta { color: #ff9d00; } +.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } +.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; } +.cm-s-cobalt span.cm-bracket { color: #d8d8d8; } +.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } +.cm-s-cobalt span.cm-link { color: #845dc4; } +.cm-s-cobalt span.cm-error { color: #9d1e15; } + +.cm-s-cobalt .CodeMirror-activeline-background { background: #002D57; } +.cm-s-cobalt .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css new file mode 100644 index 0000000000..19095e41d9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css @@ -0,0 +1,33 @@ +.cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } +.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } +.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } +.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-colorforth span.cm-comment { color: #ededed; } +.cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } +.cm-s-colorforth span.cm-keyword { color: #ffd900; } +.cm-s-colorforth span.cm-builtin { color: #00d95a; } +.cm-s-colorforth span.cm-variable { color: #73ff00; } +.cm-s-colorforth span.cm-string { color: #007bff; } +.cm-s-colorforth span.cm-number { color: #00c4ff; } +.cm-s-colorforth span.cm-atom { color: #606060; } + +.cm-s-colorforth span.cm-variable-2 { color: #EEE; } +.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; } +.cm-s-colorforth span.cm-property {} +.cm-s-colorforth span.cm-operator {} + +.cm-s-colorforth span.cm-meta { color: yellow; } +.cm-s-colorforth span.cm-qualifier { color: #FFF700; } +.cm-s-colorforth span.cm-bracket { color: #cc7; } +.cm-s-colorforth span.cm-tag { color: #FFBD40; } +.cm-s-colorforth span.cm-attribute { color: #FFF700; } +.cm-s-colorforth span.cm-error { color: #f00; } + +.cm-s-colorforth div.CodeMirror-selected { background: #333d53; } + +.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } + +.cm-s-colorforth .CodeMirror-activeline-background { background: #253540; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css new file mode 100644 index 0000000000..2ec81a3557 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css @@ -0,0 +1,53 @@ +/** + Name: IntelliJ IDEA darcula theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-darcula { font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;} +.cm-s-darcula.CodeMirror { background: #2B2B2B; color: #A9B7C6; } + +.cm-s-darcula span.cm-meta { color: #BBB529; } +.cm-s-darcula span.cm-number { color: #6897BB; } +.cm-s-darcula span.cm-keyword { color: #CC7832; line-height: 1em; font-weight: bold; } +.cm-s-darcula span.cm-def { color: #A9B7C6; font-style: italic; } +.cm-s-darcula span.cm-variable { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-2 { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-3 { color: #9876AA; } +.cm-s-darcula span.cm-type { color: #AABBCC; font-weight: bold; } +.cm-s-darcula span.cm-property { color: #FFC66D; } +.cm-s-darcula span.cm-operator { color: #A9B7C6; } +.cm-s-darcula span.cm-string { color: #6A8759; } +.cm-s-darcula span.cm-string-2 { color: #6A8759; } +.cm-s-darcula span.cm-comment { color: #61A151; font-style: italic; } +.cm-s-darcula span.cm-link { color: #CC7832; } +.cm-s-darcula span.cm-atom { color: #CC7832; } +.cm-s-darcula span.cm-error { color: #BC3F3C; } +.cm-s-darcula span.cm-tag { color: #629755; font-weight: bold; font-style: italic; text-decoration: underline; } +.cm-s-darcula span.cm-attribute { color: #6897bb; } +.cm-s-darcula span.cm-qualifier { color: #6A8759; } +.cm-s-darcula span.cm-bracket { color: #A9B7C6; } +.cm-s-darcula span.cm-builtin { color: #FF9E59; } +.cm-s-darcula span.cm-special { color: #FF9E59; } +.cm-s-darcula span.cm-matchhighlight { color: #FFFFFF; background-color: rgba(50, 89, 48, .7); font-weight: normal;} +.cm-s-darcula span.cm-searching { color: #FFFFFF; background-color: rgba(61, 115, 59, .7); font-weight: normal;} + +.cm-s-darcula .CodeMirror-cursor { border-left: 1px solid #A9B7C6; } +.cm-s-darcula .CodeMirror-activeline-background { background: #323232; } +.cm-s-darcula .CodeMirror-gutters { background: #313335; border-right: 1px solid #313335; } +.cm-s-darcula .CodeMirror-guttermarker { color: #FFEE80; } +.cm-s-darcula .CodeMirror-guttermarker-subtle { color: #D0D0D0; } +.cm-s-darcula .CodeMirrir-linenumber { color: #606366; } +.cm-s-darcula .CodeMirror-matchingbracket { background-color: #3B514D; color: #FFEF28 !important; font-weight: bold; } + +.cm-s-darcula div.CodeMirror-selected { background: #214283; } + +.CodeMirror-hints.darcula { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #9C9E9E; + background-color: #3B3E3F !important; +} + +.CodeMirror-hints.darcula .CodeMirror-hint-active { + background-color: #494D4E !important; + color: #9C9E9E !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css new file mode 100644 index 0000000000..253133efe7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css @@ -0,0 +1,40 @@ +/* + + Name: dracula + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme) + +*/ + + +.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters { + background-color: #282a36 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-dracula .CodeMirror-gutters { color: #282a36; } +.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula span.cm-comment { color: #6272a4; } +.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; } +.cm-s-dracula span.cm-number { color: #bd93f9; } +.cm-s-dracula span.cm-variable { color: #50fa7b; } +.cm-s-dracula span.cm-variable-2 { color: white; } +.cm-s-dracula span.cm-def { color: #50fa7b; } +.cm-s-dracula span.cm-operator { color: #ff79c6; } +.cm-s-dracula span.cm-keyword { color: #ff79c6; } +.cm-s-dracula span.cm-atom { color: #bd93f9; } +.cm-s-dracula span.cm-meta { color: #f8f8f2; } +.cm-s-dracula span.cm-tag { color: #ff79c6; } +.cm-s-dracula span.cm-attribute { color: #50fa7b; } +.cm-s-dracula span.cm-qualifier { color: #50fa7b; } +.cm-s-dracula span.cm-property { color: #66d9ef; } +.cm-s-dracula span.cm-builtin { color: #50fa7b; } +.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; } + +.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); } +.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css new file mode 100644 index 0000000000..88fdc76c8e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css @@ -0,0 +1,35 @@ +/* +Name: DuoTone-Dark +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; } +.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; } +.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; } +.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; } + +/* begin cursor */ +.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; } +.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280; */ opacity: .5;} +.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;} +/* end cursor */ + +.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; } + +.cm-s-duotone-dark span.cm-property { color: #9a86fd; } +.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; } +.cm-s-duotone-dark span.cm-string { color: #ffb870; } +.cm-s-duotone-dark span.cm-operator { color: #ffad5c; } +.cm-s-duotone-dark span.cm-positive { color: #6a51e6; } + +.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; } +.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; } +.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-dark span.cm-header { font-weight: normal; } +.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css new file mode 100644 index 0000000000..d99480f7c4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css @@ -0,0 +1,36 @@ +/* +Name: DuoTone-Light +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-light.CodeMirror { background: #faf8f5; color: #b29762; } +.cm-s-duotone-light div.CodeMirror-selected { background: #e3dcce !important; } +.cm-s-duotone-light .CodeMirror-gutters { background: #faf8f5; border-right: 0px; } +.cm-s-duotone-light .CodeMirror-linenumber { color: #cdc4b1; } + +/* begin cursor */ +.cm-s-duotone-light .CodeMirror-cursor { border-left: 1px solid #93abdc; /* border-left: 1px solid #93abdc80; */ border-right: .5em solid #93abdc; /* border-right: .5em solid #93abdc80; */ opacity: .5; } +.cm-s-duotone-light .CodeMirror-activeline-background { background: #e3dcce; /* background: #e3dcce80; */ opacity: .5; } +.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor { background: #93abdc; /* #93abdc80; */ opacity: .5; } +/* end cursor */ + +.cm-s-duotone-light span.cm-atom, .cm-s-duotone-light span.cm-number, .cm-s-duotone-light span.cm-keyword, .cm-s-duotone-light span.cm-variable, .cm-s-duotone-light span.cm-attribute, .cm-s-duotone-light span.cm-quote, .cm-s-duotone-light-light span.cm-hr, .cm-s-duotone-light-light span.cm-link { color: #063289; } + +.cm-s-duotone-light span.cm-property { color: #b29762; } +.cm-s-duotone-light span.cm-punctuation, .cm-s-duotone-light span.cm-unit, .cm-s-duotone-light span.cm-negative { color: #063289; } +.cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; } +.cm-s-duotone-light span.cm-positive { color: #896724; } + +.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; } +.cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; } +.cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +/* .cm-s-duotone-light span.cm-error { background: #896724; color: #728fcb; } */ +.cm-s-duotone-light span.cm-error, .cm-s-duotone-light span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-light span.cm-header { font-weight: normal; } +.cm-s-duotone-light .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; } + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css new file mode 100644 index 0000000000..800d603f6d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css @@ -0,0 +1,23 @@ +.cm-s-eclipse span.cm-meta { color: #FF1717; } +.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } +.cm-s-eclipse span.cm-atom { color: #219; } +.cm-s-eclipse span.cm-number { color: #164; } +.cm-s-eclipse span.cm-def { color: #00f; } +.cm-s-eclipse span.cm-variable { color: black; } +.cm-s-eclipse span.cm-variable-2 { color: #0000C0; } +.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; } +.cm-s-eclipse span.cm-property { color: black; } +.cm-s-eclipse span.cm-operator { color: black; } +.cm-s-eclipse span.cm-comment { color: #3F7F5F; } +.cm-s-eclipse span.cm-string { color: #2A00FF; } +.cm-s-eclipse span.cm-string-2 { color: #f50; } +.cm-s-eclipse span.cm-qualifier { color: #555; } +.cm-s-eclipse span.cm-builtin { color: #30a; } +.cm-s-eclipse span.cm-bracket { color: #cc7; } +.cm-s-eclipse span.cm-tag { color: #170; } +.cm-s-eclipse span.cm-attribute { color: #00c; } +.cm-s-eclipse span.cm-link { color: #219; } +.cm-s-eclipse span.cm-error { color: #f00; } + +.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css new file mode 100644 index 0000000000..45b3ea655e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css @@ -0,0 +1,13 @@ +.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; } +.cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-variable { color: black; } +.cm-s-elegant span.cm-variable-2 { color: #b11; } +.cm-s-elegant span.cm-qualifier { color: #555; } +.cm-s-elegant span.cm-keyword { color: #730; } +.cm-s-elegant span.cm-builtin { color: #30a; } +.cm-s-elegant span.cm-link { color: #762; } +.cm-s-elegant span.cm-error { background-color: #fdd; } + +.cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css new file mode 100644 index 0000000000..8c8a4171a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css @@ -0,0 +1,34 @@ +.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } +.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; } +.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } +.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-erlang-dark span.cm-quote { color: #ccc; } +.cm-s-erlang-dark span.cm-atom { color: #f133f1; } +.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } +.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } +.cm-s-erlang-dark span.cm-builtin { color: #eaa; } +.cm-s-erlang-dark span.cm-comment { color: #77f; } +.cm-s-erlang-dark span.cm-def { color: #e7a; } +.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } +.cm-s-erlang-dark span.cm-meta { color: #50fefe; } +.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } +.cm-s-erlang-dark span.cm-operator { color: #d55; } +.cm-s-erlang-dark span.cm-property { color: #ccc; } +.cm-s-erlang-dark span.cm-qualifier { color: #ccc; } +.cm-s-erlang-dark span.cm-special { color: #ffbbbb; } +.cm-s-erlang-dark span.cm-string { color: #3ad900; } +.cm-s-erlang-dark span.cm-string-2 { color: #ccc; } +.cm-s-erlang-dark span.cm-tag { color: #9effff; } +.cm-s-erlang-dark span.cm-variable { color: #50fe50; } +.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } +.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; } +.cm-s-erlang-dark span.cm-error { color: #9d1e15; } + +.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; } +.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css new file mode 100644 index 0000000000..d712dda08d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css @@ -0,0 +1,39 @@ +/* + + Name: gruvbox-dark + Author: kRkk (https://github.com/krkk) + + Original gruvbox color scheme by Pavel Pertsev (https://github.com/morhetz/gruvbox) + +*/ + +.cm-s-gruvbox-dark.CodeMirror, .cm-s-gruvbox-dark .CodeMirror-gutters { background-color: #282828; color: #bdae93; } +.cm-s-gruvbox-dark .CodeMirror-gutters {background: #282828; border-right: 0px;} +.cm-s-gruvbox-dark .CodeMirror-linenumber {color: #7c6f64;} +.cm-s-gruvbox-dark .CodeMirror-cursor { border-left: 1px solid #ebdbb2; } +.cm-s-gruvbox-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark div.CodeMirror-selected { background: #928374; } +.cm-s-gruvbox-dark span.cm-meta { color: #83a598; } + +.cm-s-gruvbox-dark span.cm-comment { color: #928374; } +.cm-s-gruvbox-dark span.cm-number, span.cm-atom { color: #d3869b; } +.cm-s-gruvbox-dark span.cm-keyword { color: #f84934; } + +.cm-s-gruvbox-dark span.cm-variable { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-2 { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-3, .cm-s-gruvbox-dark span.cm-type { color: #fabd2f; } +.cm-s-gruvbox-dark span.cm-operator { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-callee { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-def { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-property { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-string { color: #b8bb26; } +.cm-s-gruvbox-dark span.cm-string-2 { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-qualifier { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-attribute { color: #8ec07c; } + +.cm-s-gruvbox-dark .CodeMirror-activeline-background { background: #3c3836; } +.cm-s-gruvbox-dark .CodeMirror-matchingbracket { background: #928374; color:#282828 !important; } + +.cm-s-gruvbox-dark span.cm-builtin { color: #fe8019; } +.cm-s-gruvbox-dark span.cm-tag { color: #fe8019; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css new file mode 100644 index 0000000000..7d05431bdc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css @@ -0,0 +1,34 @@ +/* + + Name: Hopscotch + Author: Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;} +.cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;} +.cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;} +.cm-s-hopscotch .CodeMirror-linenumber {color: #797379;} +.cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;} + +.cm-s-hopscotch span.cm-comment {color: #b33508;} +.cm-s-hopscotch span.cm-atom {color: #c85e7c;} +.cm-s-hopscotch span.cm-number {color: #c85e7c;} + +.cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;} +.cm-s-hopscotch span.cm-keyword {color: #dd464c;} +.cm-s-hopscotch span.cm-string {color: #fdcc59;} + +.cm-s-hopscotch span.cm-variable {color: #8fc13e;} +.cm-s-hopscotch span.cm-variable-2 {color: #1290bf;} +.cm-s-hopscotch span.cm-def {color: #fd8b19;} +.cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;} +.cm-s-hopscotch span.cm-bracket {color: #d5d3d5;} +.cm-s-hopscotch span.cm-tag {color: #dd464c;} +.cm-s-hopscotch span.cm-link {color: #c85e7c;} + +.cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css new file mode 100644 index 0000000000..5440fbe27c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css @@ -0,0 +1,43 @@ +/* +ICEcoder default theme by Matt Pass, used in code editor available at https://icecoder.net +*/ + +.cm-s-icecoder { color: #666; background: #1d1d1b; } + +.cm-s-icecoder span.cm-keyword { color: #eee; font-weight:bold; } /* off-white 1 */ +.cm-s-icecoder span.cm-atom { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-number { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-def { color: #b9ca4a; } /* green */ + +.cm-s-icecoder span.cm-variable { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; } /* pink */ +.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */ + +.cm-s-icecoder span.cm-property { color: #eee; } /* off-white 1 */ +.cm-s-icecoder span.cm-operator { color: #9179bb; } /* purple */ +.cm-s-icecoder span.cm-comment { color: #97a3aa; } /* grey-blue */ + +.cm-s-icecoder span.cm-string { color: #b9ca4a; } /* green */ +.cm-s-icecoder span.cm-string-2 { color: #6cb5d9; } /* blue */ + +.cm-s-icecoder span.cm-meta { color: #555; } /* grey */ + +.cm-s-icecoder span.cm-qualifier { color: #555; } /* grey */ +.cm-s-icecoder span.cm-builtin { color: #214e7b; } /* bright blue */ +.cm-s-icecoder span.cm-bracket { color: #cc7; } /* grey-yellow */ + +.cm-s-icecoder span.cm-tag { color: #e8e8e8; } /* off-white 2 */ +.cm-s-icecoder span.cm-attribute { color: #099; } /* teal */ + +.cm-s-icecoder span.cm-header { color: #6a0d6a; } /* purple-pink */ +.cm-s-icecoder span.cm-quote { color: #186718; } /* dark green */ +.cm-s-icecoder span.cm-hr { color: #888; } /* mid-grey */ +.cm-s-icecoder span.cm-link { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-error { color: #d00; } /* red */ + +.cm-s-icecoder .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-icecoder div.CodeMirror-selected { color: #fff; background: #037; } +.cm-s-icecoder .CodeMirror-gutters { background: #1d1d1b; min-width: 41px; border-right: 0; } +.cm-s-icecoder .CodeMirror-linenumber { color: #555; cursor: default; } +.cm-s-icecoder .CodeMirror-matchingbracket { color: #fff !important; background: #555 !important; } +.cm-s-icecoder .CodeMirror-activeline-background { background: #000; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css new file mode 100644 index 0000000000..eab36717ad --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css @@ -0,0 +1,42 @@ +/** + Name: IDEA default theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-idea span.cm-meta { color: #808000; } +.cm-s-idea span.cm-number { color: #0000FF; } +.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; } +.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; } +.cm-s-idea span.cm-def { color: #000000; } +.cm-s-idea span.cm-variable { color: black; } +.cm-s-idea span.cm-variable-2 { color: black; } +.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; } +.cm-s-idea span.cm-property { color: black; } +.cm-s-idea span.cm-operator { color: black; } +.cm-s-idea span.cm-comment { color: #808080; } +.cm-s-idea span.cm-string { color: #008000; } +.cm-s-idea span.cm-string-2 { color: #008000; } +.cm-s-idea span.cm-qualifier { color: #555; } +.cm-s-idea span.cm-error { color: #FF0000; } +.cm-s-idea span.cm-attribute { color: #0000FF; } +.cm-s-idea span.cm-tag { color: #000080; } +.cm-s-idea span.cm-link { color: #0000FF; } +.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; } + +.cm-s-idea span.cm-builtin { color: #30a; } +.cm-s-idea span.cm-bracket { color: #cc7; } +.cm-s-idea { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;} + + +.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } + +.CodeMirror-hints.idea { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #616569; + background-color: #ebf3fd !important; +} + +.CodeMirror-hints.idea .CodeMirror-hint-active { + background-color: #a2b8c9 !important; + color: #5c6065 !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css new file mode 100644 index 0000000000..d0d6263cf4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css @@ -0,0 +1,34 @@ +/* + + Name: Isotope + Author: David Desandro / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;} +.cm-s-isotope div.CodeMirror-selected {background: #404040 !important;} +.cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;} +.cm-s-isotope .CodeMirror-linenumber {color: #808080;} +.cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;} + +.cm-s-isotope span.cm-comment {color: #3300ff;} +.cm-s-isotope span.cm-atom {color: #cc00ff;} +.cm-s-isotope span.cm-number {color: #cc00ff;} + +.cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;} +.cm-s-isotope span.cm-keyword {color: #ff0000;} +.cm-s-isotope span.cm-string {color: #ff0099;} + +.cm-s-isotope span.cm-variable {color: #33ff00;} +.cm-s-isotope span.cm-variable-2 {color: #0066ff;} +.cm-s-isotope span.cm-def {color: #ff9900;} +.cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;} +.cm-s-isotope span.cm-bracket {color: #e0e0e0;} +.cm-s-isotope span.cm-tag {color: #ff0000;} +.cm-s-isotope span.cm-link {color: #cc00ff;} + +.cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-isotope .CodeMirror-activeline-background { background: #202020; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css new file mode 100644 index 0000000000..38cf7fe373 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css @@ -0,0 +1,30 @@ +.cm-s-juejin.CodeMirror { + background: #f8f9fa; +} +.cm-s-juejin .cm-header, +.cm-s-juejin .cm-def { + color: #1ba2f0; +} +.cm-s-juejin .cm-comment { + color: #009e9d; +} +.cm-s-juejin .cm-quote, +.cm-s-juejin .cm-link, +.cm-s-juejin .cm-strong, +.cm-s-juejin .cm-attribute { + color: #fd7741; +} +.cm-s-juejin .cm-url, +.cm-s-juejin .cm-keyword, +.cm-s-juejin .cm-builtin { + color: #bb51b8; +} +.cm-s-juejin .cm-hr { + color: #909090; +} +.cm-s-juejin .cm-tag { + color: #107000; +} +.cm-s-juejin .cm-variable-2 { + color: #0050a0; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css new file mode 100644 index 0000000000..f96bf430c2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css @@ -0,0 +1,47 @@ +/* +http://lesscss.org/ dark theme +Ported to CodeMirror by Peter Kroon +*/ +.cm-s-lesser-dark { + line-height: 1.3em; +} +.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } +.cm-s-lesser-dark div.CodeMirror-selected { background: #45443B; } /* 33322B*/ +.cm-s-lesser-dark .CodeMirror-line::selection, .cm-s-lesser-dark .CodeMirror-line > span::selection, .cm-s-lesser-dark .CodeMirror-line > span > span::selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-line::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ + +.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ + +.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } +.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } +.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } + +.cm-s-lesser-dark span.cm-header { color: #a0a; } +.cm-s-lesser-dark span.cm-quote { color: #090; } +.cm-s-lesser-dark span.cm-keyword { color: #599eff; } +.cm-s-lesser-dark span.cm-atom { color: #C2B470; } +.cm-s-lesser-dark span.cm-number { color: #B35E4D; } +.cm-s-lesser-dark span.cm-def { color: white; } +.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } +.cm-s-lesser-dark span.cm-variable-2 { color: #669199; } +.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; } +.cm-s-lesser-dark span.cm-property { color: #92A75C; } +.cm-s-lesser-dark span.cm-operator { color: #92A75C; } +.cm-s-lesser-dark span.cm-comment { color: #666; } +.cm-s-lesser-dark span.cm-string { color: #BCD279; } +.cm-s-lesser-dark span.cm-string-2 { color: #f50; } +.cm-s-lesser-dark span.cm-meta { color: #738C73; } +.cm-s-lesser-dark span.cm-qualifier { color: #555; } +.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } +.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } +.cm-s-lesser-dark span.cm-tag { color: #669199; } +.cm-s-lesser-dark span.cm-attribute { color: #81a4d5; } +.cm-s-lesser-dark span.cm-hr { color: #999; } +.cm-s-lesser-dark span.cm-link { color: #7070E6; } +.cm-s-lesser-dark span.cm-error { color: #9d1e15; } + +.cm-s-lesser-dark .CodeMirror-activeline-background { background: #3C3A3A; } +.cm-s-lesser-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css new file mode 100644 index 0000000000..393825e029 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css @@ -0,0 +1,95 @@ +.cm-s-liquibyte.CodeMirror { + background-color: #000; + color: #fff; + line-height: 1.2em; + font-size: 1em; +} +.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight { + text-decoration: underline; + text-decoration-color: #0f0; + text-decoration-style: wavy; +} +.cm-s-liquibyte .cm-trailingspace { + text-decoration: line-through; + text-decoration-color: #f00; + text-decoration-style: dotted; +} +.cm-s-liquibyte .cm-tab { + text-decoration: line-through; + text-decoration-color: #404040; + text-decoration-style: dotted; +} +.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; } +.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; } +.cm-s-liquibyte .CodeMirror-guttermarker { } +.cm-s-liquibyte .CodeMirror-guttermarker-subtle { } +.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; } +.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; } + +.cm-s-liquibyte span.cm-comment { color: #008000; } +.cm-s-liquibyte span.cm-def { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-keyword { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-builtin { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-variable { color: #5967ff; font-weight: bold; } +.cm-s-liquibyte span.cm-string { color: #ff8000; } +.cm-s-liquibyte span.cm-number { color: #0f0; font-weight: bold; } +.cm-s-liquibyte span.cm-atom { color: #bf3030; font-weight: bold; } + +.cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; } +.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; } +.cm-s-liquibyte span.cm-operator { color: #fff; } + +.cm-s-liquibyte span.cm-meta { color: #0f0; } +.cm-s-liquibyte span.cm-qualifier { color: #fff700; font-weight: bold; } +.cm-s-liquibyte span.cm-bracket { color: #cc7; } +.cm-s-liquibyte span.cm-tag { color: #ff0; font-weight: bold; } +.cm-s-liquibyte span.cm-attribute { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-error { color: #f00; } + +.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); } + +.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); } + +.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); } + +/* Default styles for common addons */ +.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; } +.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; } +.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); } +/* Scrollbars */ +/* Simple */ +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover { + background-color: rgba(80, 80, 80, .7); +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + background-color: rgba(80, 80, 80, .3); + border: 1px solid #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + border-top: 1px solid #404040; + border-bottom: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div { + border-left: 1px solid #404040; + border-right: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical { + background-color: #262626; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal { + background-color: #262626; + border-top: 1px solid #404040; +} +/* Overlay */ +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div { + background-color: #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div { + border: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div { + border: 1px solid #404040; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css new file mode 100644 index 0000000000..17a1551032 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css @@ -0,0 +1,37 @@ +/* + Name: lucario + Author: Raphael Amorim + + Original Lucario color scheme (https://github.com/raphamorim/lucario) +*/ + +.cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters { + background-color: #2b3e50 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-lucario .CodeMirror-gutters { color: #2b3e50; } +.cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; } +.cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; } +.cm-s-lucario .CodeMirror-selected { background: #243443; } +.cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; } +.cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; } +.cm-s-lucario span.cm-comment { color: #5c98cd; } +.cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; } +.cm-s-lucario span.cm-number { color: #ca94ff; } +.cm-s-lucario span.cm-variable { color: #f8f8f2; } +.cm-s-lucario span.cm-variable-2 { color: #f8f8f2; } +.cm-s-lucario span.cm-def { color: #72C05D; } +.cm-s-lucario span.cm-operator { color: #66D9EF; } +.cm-s-lucario span.cm-keyword { color: #ff6541; } +.cm-s-lucario span.cm-atom { color: #bd93f9; } +.cm-s-lucario span.cm-meta { color: #f8f8f2; } +.cm-s-lucario span.cm-tag { color: #ff6541; } +.cm-s-lucario span.cm-attribute { color: #66D9EF; } +.cm-s-lucario span.cm-qualifier { color: #72C05D; } +.cm-s-lucario span.cm-property { color: #f8f8f2; } +.cm-s-lucario span.cm-builtin { color: #72C05D; } +.cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; } + +.cm-s-lucario .CodeMirror-activeline-background { background: #243443; } +.cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css new file mode 100644 index 0000000000..45b64efb25 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css @@ -0,0 +1,135 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-darker.CodeMirror { + background-color: #212121; + color: #EEFFFF; +} + +.cm-s-material-darker .CodeMirror-gutters { + background: #212121; + color: #545454; + border: none; +} + +.cm-s-material-darker .CodeMirror-guttermarker, +.cm-s-material-darker .CodeMirror-guttermarker-subtle, +.cm-s-material-darker .CodeMirror-linenumber { + color: #545454; +} + +.cm-s-material-darker .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-material-darker div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker.CodeMirror-focused div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::selection, +.cm-s-material-darker .CodeMirror-line>span::selection, +.cm-s-material-darker .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-darker .cm-keyword { + color: #C792EA; +} + +.cm-s-material-darker .cm-operator { + color: #89DDFF; +} + +.cm-s-material-darker .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #f07178; +} + +.cm-s-material-darker .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-atom { + color: #F78C6C; +} + +.cm-s-material-darker .cm-number { + color: #FF5370; +} + +.cm-s-material-darker .cm-def { + color: #82AAFF; +} + +.cm-s-material-darker .cm-string { + color: #C3E88D; +} + +.cm-s-material-darker .cm-string-2 { + color: #f07178; +} + +.cm-s-material-darker .cm-comment { + color: #545454; +} + +.cm-s-material-darker .cm-variable { + color: #f07178; +} + +.cm-s-material-darker .cm-tag { + color: #FF5370; +} + +.cm-s-material-darker .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-attribute { + color: #C792EA; +} + +.cm-s-material-darker .cm-property { + color: #C792EA; +} + +.cm-s-material-darker .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #DECB6B; +} + + +.cm-s-material-darker .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-darker .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css new file mode 100644 index 0000000000..404178de22 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-ocean.CodeMirror { + background-color: #0F111A; + color: #8F93A2; +} + +.cm-s-material-ocean .CodeMirror-gutters { + background: #0F111A; + color: #464B5D; + border: none; +} + +.cm-s-material-ocean .CodeMirror-guttermarker, +.cm-s-material-ocean .CodeMirror-guttermarker-subtle, +.cm-s-material-ocean .CodeMirror-linenumber { + color: #464B5D; +} + +.cm-s-material-ocean .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-ocean.cm-fat-cursor .CodeMirror-cursor { + background-color: #a2a8a175 !important; +} +.cm-s-material-ocean .cm-animate-fat-cursor { + background-color: #a2a8a175 !important; +} + +.cm-s-material-ocean div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::selection, +.cm-s-material-ocean .CodeMirror-line>span::selection, +.cm-s-material-ocean .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-ocean .cm-keyword { + color: #C792EA; +} + +.cm-s-material-ocean .cm-operator { + color: #89DDFF; +} + +.cm-s-material-ocean .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #f07178; +} + +.cm-s-material-ocean .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-atom { + color: #F78C6C; +} + +.cm-s-material-ocean .cm-number { + color: #FF5370; +} + +.cm-s-material-ocean .cm-def { + color: #82AAFF; +} + +.cm-s-material-ocean .cm-string { + color: #C3E88D; +} + +.cm-s-material-ocean .cm-string-2 { + color: #f07178; +} + +.cm-s-material-ocean .cm-comment { + color: #464B5D; +} + +.cm-s-material-ocean .cm-variable { + color: #f07178; +} + +.cm-s-material-ocean .cm-tag { + color: #FF5370; +} + +.cm-s-material-ocean .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-attribute { + color: #C792EA; +} + +.cm-s-material-ocean .cm-property { + color: #C792EA; +} + +.cm-s-material-ocean .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #DECB6B; +} + + +.cm-s-material-ocean .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-ocean .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css new file mode 100644 index 0000000000..6712c43a0e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-palenight.CodeMirror { + background-color: #292D3E; + color: #A6ACCD; +} + +.cm-s-material-palenight .CodeMirror-gutters { + background: #292D3E; + color: #676E95; + border: none; +} + +.cm-s-material-palenight .CodeMirror-guttermarker, +.cm-s-material-palenight .CodeMirror-guttermarker-subtle, +.cm-s-material-palenight .CodeMirror-linenumber { + color: #676E95; +} + +.cm-s-material-palenight .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-palenight.cm-fat-cursor .CodeMirror-cursor { + background-color: #607c8b80 !important; +} +.cm-s-material-palenight .cm-animate-fat-cursor { + background-color: #607c8b80 !important; +} + +.cm-s-material-palenight div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::selection, +.cm-s-material-palenight .CodeMirror-line>span::selection, +.cm-s-material-palenight .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-palenight .cm-keyword { + color: #C792EA; +} + +.cm-s-material-palenight .cm-operator { + color: #89DDFF; +} + +.cm-s-material-palenight .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #f07178; +} + +.cm-s-material-palenight .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-atom { + color: #F78C6C; +} + +.cm-s-material-palenight .cm-number { + color: #FF5370; +} + +.cm-s-material-palenight .cm-def { + color: #82AAFF; +} + +.cm-s-material-palenight .cm-string { + color: #C3E88D; +} + +.cm-s-material-palenight .cm-string-2 { + color: #f07178; +} + +.cm-s-material-palenight .cm-comment { + color: #676E95; +} + +.cm-s-material-palenight .cm-variable { + color: #f07178; +} + +.cm-s-material-palenight .cm-tag { + color: #FF5370; +} + +.cm-s-material-palenight .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-attribute { + color: #C792EA; +} + +.cm-s-material-palenight .cm-property { + color: #C792EA; +} + +.cm-s-material-palenight .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #DECB6B; +} + + +.cm-s-material-palenight .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-palenight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css new file mode 100644 index 0000000000..a7848499a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material.CodeMirror { + background-color: #263238; + color: #EEFFFF; +} + +.cm-s-material .CodeMirror-gutters { + background: #263238; + color: #546E7A; + border: none; +} + +.cm-s-material .CodeMirror-guttermarker, +.cm-s-material .CodeMirror-guttermarker-subtle, +.cm-s-material .CodeMirror-linenumber { + color: #546E7A; +} + +.cm-s-material .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material.cm-fat-cursor .CodeMirror-cursor { + background-color: #5d6d5c80 !important; +} +.cm-s-material .cm-animate-fat-cursor { + background-color: #5d6d5c80 !important; +} + +.cm-s-material div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material.CodeMirror-focused div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::selection, +.cm-s-material .CodeMirror-line>span::selection, +.cm-s-material .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::-moz-selection, +.cm-s-material .CodeMirror-line>span::-moz-selection, +.cm-s-material .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material .cm-keyword { + color: #C792EA; +} + +.cm-s-material .cm-operator { + color: #89DDFF; +} + +.cm-s-material .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #f07178; +} + +.cm-s-material .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material .cm-atom { + color: #F78C6C; +} + +.cm-s-material .cm-number { + color: #FF5370; +} + +.cm-s-material .cm-def { + color: #82AAFF; +} + +.cm-s-material .cm-string { + color: #C3E88D; +} + +.cm-s-material .cm-string-2 { + color: #f07178; +} + +.cm-s-material .cm-comment { + color: #546E7A; +} + +.cm-s-material .cm-variable { + color: #f07178; +} + +.cm-s-material .cm-tag { + color: #FF5370; +} + +.cm-s-material .cm-meta { + color: #FFCB6B; +} + +.cm-s-material .cm-attribute { + color: #C792EA; +} + +.cm-s-material .cm-property { + color: #C792EA; +} + +.cm-s-material .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #DECB6B; +} + + +.cm-s-material .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css new file mode 100644 index 0000000000..e164fcf42a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css @@ -0,0 +1,37 @@ +/****************************************************************/ +/* Based on mbonaci's Brackets mbo theme */ +/* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ +/* Create your own: http://tmtheme-editor.herokuapp.com */ +/****************************************************************/ + +.cm-s-mbo.CodeMirror { background: #2c2c2c; color: #ffffec; } +.cm-s-mbo div.CodeMirror-selected { background: #716C62; } +.cm-s-mbo .CodeMirror-line::selection, .cm-s-mbo .CodeMirror-line > span::selection, .cm-s-mbo .CodeMirror-line > span > span::selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-line::-moz-selection, .cm-s-mbo .CodeMirror-line > span::-moz-selection, .cm-s-mbo .CodeMirror-line > span > span::-moz-selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-gutters { background: #4e4e4e; border-right: 0px; } +.cm-s-mbo .CodeMirror-guttermarker { color: white; } +.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } +.cm-s-mbo .CodeMirror-linenumber { color: #dadada; } +.cm-s-mbo .CodeMirror-cursor { border-left: 1px solid #ffffec; } + +.cm-s-mbo span.cm-comment { color: #95958a; } +.cm-s-mbo span.cm-atom { color: #00a8c6; } +.cm-s-mbo span.cm-number { color: #00a8c6; } + +.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute { color: #9ddfe9; } +.cm-s-mbo span.cm-keyword { color: #ffb928; } +.cm-s-mbo span.cm-string { color: #ffcf6c; } +.cm-s-mbo span.cm-string.cm-property { color: #ffffec; } + +.cm-s-mbo span.cm-variable { color: #ffffec; } +.cm-s-mbo span.cm-variable-2 { color: #00a8c6; } +.cm-s-mbo span.cm-def { color: #ffffec; } +.cm-s-mbo span.cm-bracket { color: #fffffc; font-weight: bold; } +.cm-s-mbo span.cm-tag { color: #9ddfe9; } +.cm-s-mbo span.cm-link { color: #f54b07; } +.cm-s-mbo span.cm-error { border-bottom: #636363; color: #ffffec; } +.cm-s-mbo span.cm-qualifier { color: #ffffec; } + +.cm-s-mbo .CodeMirror-activeline-background { background: #494b41; } +.cm-s-mbo .CodeMirror-matchingbracket { color: #ffb928 !important; } +.cm-s-mbo .CodeMirror-matchingtag { background: rgba(255, 255, 255, .37); } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css new file mode 100644 index 0000000000..622ed3efb7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css @@ -0,0 +1,46 @@ +/* + MDN-LIKE Theme - Mozilla + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon + + The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation + +*/ +.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } +.cm-s-mdn-like div.CodeMirror-selected { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::selection, .cm-s-mdn-like .CodeMirror-line > span::selection, .cm-s-mdn-like .CodeMirror-line > span > span::selection { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span > span::-moz-selection { background: #cfc; } + +.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } +.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; } +.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } + +.cm-s-mdn-like .cm-keyword { color: #6262FF; } +.cm-s-mdn-like .cm-atom { color: #F90; } +.cm-s-mdn-like .cm-number { color: #ca7841; } +.cm-s-mdn-like .cm-def { color: #8DA6CE; } +.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } +.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; } + +.cm-s-mdn-like .cm-variable { color: #07a; } +.cm-s-mdn-like .cm-property { color: #905; } +.cm-s-mdn-like .cm-qualifier { color: #690; } + +.cm-s-mdn-like .cm-operator { color: #cda869; } +.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } +.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } +.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-mdn-like .cm-meta { color: #000; } /*?*/ +.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ +.cm-s-mdn-like .cm-tag { color: #997643; } +.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-mdn-like .cm-header { color: #FF6400; } +.cm-s-mdn-like .cm-hr { color: #AEAEAE; } +.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } +.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } + +div.cm-s-mdn-like .CodeMirror-activeline-background { background: #efefff; } +div.cm-s-mdn-like span.CodeMirror-matchingbracket { outline:1px solid grey; color: inherit; } + +.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,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); } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css new file mode 100644 index 0000000000..fc26474a4a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css @@ -0,0 +1,39 @@ +/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ + +/**/ +.cm-s-midnight .CodeMirror-activeline-background { background: #253540; } + +.cm-s-midnight.CodeMirror { + background: #0F192A; + color: #D1EDFF; +} + +.cm-s-midnight div.CodeMirror-selected { background: #314D67; } +.cm-s-midnight .CodeMirror-line::selection, .cm-s-midnight .CodeMirror-line > span::selection, .cm-s-midnight .CodeMirror-line > span > span::selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-line::-moz-selection, .cm-s-midnight .CodeMirror-line > span::-moz-selection, .cm-s-midnight .CodeMirror-line > span > span::-moz-selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-gutters { background: #0F192A; border-right: 1px solid; } +.cm-s-midnight .CodeMirror-guttermarker { color: white; } +.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-midnight .CodeMirror-linenumber { color: #D0D0D0; } +.cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0; } + +.cm-s-midnight span.cm-comment { color: #428BDD; } +.cm-s-midnight span.cm-atom { color: #AE81FF; } +.cm-s-midnight span.cm-number { color: #D1EDFF; } + +.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute { color: #A6E22E; } +.cm-s-midnight span.cm-keyword { color: #E83737; } +.cm-s-midnight span.cm-string { color: #1DC116; } + +.cm-s-midnight span.cm-variable { color: #FFAA3E; } +.cm-s-midnight span.cm-variable-2 { color: #FFAA3E; } +.cm-s-midnight span.cm-def { color: #4DD; } +.cm-s-midnight span.cm-bracket { color: #D1EDFF; } +.cm-s-midnight span.cm-tag { color: #449; } +.cm-s-midnight span.cm-link { color: #AE81FF; } +.cm-s-midnight span.cm-error { background: #F92672; color: #F8F8F0; } + +.cm-s-midnight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css new file mode 100644 index 0000000000..cd4cd55720 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css @@ -0,0 +1,41 @@ +/* Based on Sublime Text's Monokai theme */ + +.cm-s-monokai.CodeMirror { background: #272822; color: #f8f8f2; } +.cm-s-monokai div.CodeMirror-selected { background: #49483E; } +.cm-s-monokai .CodeMirror-line::selection, .cm-s-monokai .CodeMirror-line > span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; } +.cm-s-monokai .CodeMirror-guttermarker { color: white; } +.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-monokai span.cm-comment { color: #75715e; } +.cm-s-monokai span.cm-atom { color: #ae81ff; } +.cm-s-monokai span.cm-number { color: #ae81ff; } + +.cm-s-monokai span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-monokai span.cm-comment.cm-def { color: #bc9262; } +.cm-s-monokai span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-monokai span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; } +.cm-s-monokai span.cm-keyword { color: #f92672; } +.cm-s-monokai span.cm-builtin { color: #66d9ef; } +.cm-s-monokai span.cm-string { color: #e6db74; } + +.cm-s-monokai span.cm-variable { color: #f8f8f2; } +.cm-s-monokai span.cm-variable-2 { color: #9effff; } +.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; } +.cm-s-monokai span.cm-def { color: #fd971f; } +.cm-s-monokai span.cm-bracket { color: #f8f8f2; } +.cm-s-monokai span.cm-tag { color: #f92672; } +.cm-s-monokai span.cm-header { color: #ae81ff; } +.cm-s-monokai span.cm-link { color: #ae81ff; } +.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; } + +.cm-s-monokai .CodeMirror-activeline-background { background: #373831; } +.cm-s-monokai .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css new file mode 100644 index 0000000000..b3ca35e385 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css @@ -0,0 +1,143 @@ +/* + Name: Moxer Theme + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://github.com/moxer-theme/moxer-code +*/ + +.cm-s-moxer.CodeMirror { + background-color: #090A0F; + color: #8E95B4; + line-height: 1.8; +} + +.cm-s-moxer .CodeMirror-gutters { + background: #090A0F; + color: #35394B; + border: none; +} + +.cm-s-moxer .CodeMirror-guttermarker, +.cm-s-moxer .CodeMirror-guttermarker-subtle, +.cm-s-moxer .CodeMirror-linenumber { + color: #35394B; +} + + +.cm-s-moxer .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-moxer div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-moxer.CodeMirror-focused div.CodeMirror-selected { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::selection, +.cm-s-moxer .CodeMirror-line>span::selection, +.cm-s-moxer .CodeMirror-line>span>span::selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::-moz-selection, +.cm-s-moxer .CodeMirror-line>span::-moz-selection, +.cm-s-moxer .CodeMirror-line>span>span::-moz-selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-activeline-background, +.cm-s-moxer .CodeMirror-activeline-gutter .CodeMirror-linenumber { + background: rgba(33, 36, 49, 0.5); +} + +.cm-s-moxer .cm-keyword { + color: #D46C6C; +} + +.cm-s-moxer .cm-operator { + color: #D46C6C; +} + +.cm-s-moxer .cm-variable-2 { + color: #81C5DA; +} + + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #f07178; +} + +.cm-s-moxer .cm-builtin { + color: #FFCB6B; +} + +.cm-s-moxer .cm-atom { + color: #A99BE2; +} + +.cm-s-moxer .cm-number { + color: #7CA4C0; +} + +.cm-s-moxer .cm-def { + color: #F5DFA5; +} + +.cm-s-moxer .CodeMirror-line .cm-def ~ .cm-def { + color: #81C5DA; +} + +.cm-s-moxer .cm-string { + color: #B2E4AE; +} + +.cm-s-moxer .cm-string-2 { + color: #f07178; +} + +.cm-s-moxer .cm-comment { + color: #3F445A; +} + +.cm-s-moxer .cm-variable { + color: #8E95B4; +} + +.cm-s-moxer .cm-tag { + color: #FF5370; +} + +.cm-s-moxer .cm-meta { + color: #FFCB6B; +} + +.cm-s-moxer .cm-attribute { + color: #C792EA; +} + +.cm-s-moxer .cm-property { + color: #81C5DA; +} + +.cm-s-moxer .cm-qualifier { + color: #DECB6B; +} + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #DECB6B; +} + + +.cm-s-moxer .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-moxer .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css new file mode 100644 index 0000000000..4267b1a37d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css @@ -0,0 +1,12 @@ +.cm-s-neat span.cm-comment { color: #a86; } +.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } +.cm-s-neat span.cm-string { color: #a22; } +.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } +.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } +.cm-s-neat span.cm-variable { color: black; } +.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } +.cm-s-neat span.cm-meta { color: #555; } +.cm-s-neat span.cm-link { color: #3a3; } + +.cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css new file mode 100644 index 0000000000..b28d5c65fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css @@ -0,0 +1,43 @@ +/* neo theme for codemirror */ + +/* Color scheme */ + +.cm-s-neo.CodeMirror { + background-color:#ffffff; + color:#2e383c; + line-height:1.4375; +} +.cm-s-neo .cm-comment { color:#75787b; } +.cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; } +.cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; } +.cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; } +.cm-s-neo .cm-string { color:#b35e14; } +.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; } + + +/* Editor styling */ + +.cm-s-neo pre { + padding:0; +} + +.cm-s-neo .CodeMirror-gutters { + border:none; + border-right:10px solid transparent; + background-color:transparent; +} + +.cm-s-neo .CodeMirror-linenumber { + padding:0; + color:#e0e2e5; +} + +.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } +.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } + +.cm-s-neo .CodeMirror-cursor { + width: auto; + border: 0; + background: rgba(155,157,162,0.37); + z-index: 1; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css new file mode 100644 index 0000000000..f631bf42c7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css @@ -0,0 +1,27 @@ +/* Loosely based on the Midnight Textmate theme */ + +.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-night div.CodeMirror-selected { background: #447; } +.cm-s-night .CodeMirror-line::selection, .cm-s-night .CodeMirror-line > span::selection, .cm-s-night .CodeMirror-line > span > span::selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-line::-moz-selection, .cm-s-night .CodeMirror-line > span::-moz-selection, .cm-s-night .CodeMirror-line > span > span::-moz-selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-night .CodeMirror-guttermarker { color: white; } +.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } +.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-night .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-night span.cm-comment { color: #8900d1; } +.cm-s-night span.cm-atom { color: #845dc4; } +.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } +.cm-s-night span.cm-keyword { color: #599eff; } +.cm-s-night span.cm-string { color: #37f14a; } +.cm-s-night span.cm-meta { color: #7678e2; } +.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } +.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; } +.cm-s-night span.cm-bracket { color: #8da6ce; } +.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } +.cm-s-night span.cm-link { color: #845dc4; } +.cm-s-night span.cm-error { color: #9d1e15; } + +.cm-s-night .CodeMirror-activeline-background { background: #1C005A; } +.cm-s-night .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css new file mode 100644 index 0000000000..41a8ad7782 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css @@ -0,0 +1,42 @@ +/* Based on arcticicestudio's Nord theme */ +/* https://github.com/arcticicestudio/nord */ + +.cm-s-nord.CodeMirror { background: #2e3440; color: #d8dee9; } +.cm-s-nord div.CodeMirror-selected { background: #434c5e; } +.cm-s-nord .CodeMirror-line::selection, .cm-s-nord .CodeMirror-line > span::selection, .cm-s-nord .CodeMirror-line > span > span::selection { background: #3b4252; } +.cm-s-nord .CodeMirror-line::-moz-selection, .cm-s-nord .CodeMirror-line > span::-moz-selection, .cm-s-nord .CodeMirror-line > span > span::-moz-selection { background: #3b4252; } +.cm-s-nord .CodeMirror-gutters { background: #2e3440; border-right: 0px; } +.cm-s-nord .CodeMirror-guttermarker { color: #4c566a; } +.cm-s-nord .CodeMirror-guttermarker-subtle { color: #4c566a; } +.cm-s-nord .CodeMirror-linenumber { color: #4c566a; } +.cm-s-nord .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-nord span.cm-comment { color: #4c566a; } +.cm-s-nord span.cm-atom { color: #b48ead; } +.cm-s-nord span.cm-number { color: #b48ead; } + +.cm-s-nord span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-nord span.cm-comment.cm-def { color: #bc9262; } +.cm-s-nord span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-nord span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-nord span.cm-property, .cm-s-nord span.cm-attribute { color: #8FBCBB; } +.cm-s-nord span.cm-keyword { color: #81A1C1; } +.cm-s-nord span.cm-builtin { color: #81A1C1; } +.cm-s-nord span.cm-string { color: #A3BE8C; } + +.cm-s-nord span.cm-variable { color: #d8dee9; } +.cm-s-nord span.cm-variable-2 { color: #d8dee9; } +.cm-s-nord span.cm-variable-3, .cm-s-nord span.cm-type { color: #d8dee9; } +.cm-s-nord span.cm-def { color: #8FBCBB; } +.cm-s-nord span.cm-bracket { color: #81A1C1; } +.cm-s-nord span.cm-tag { color: #bf616a; } +.cm-s-nord span.cm-header { color: #b48ead; } +.cm-s-nord span.cm-link { color: #b48ead; } +.cm-s-nord span.cm-error { background: #bf616a; color: #f8f8f0; } + +.cm-s-nord .CodeMirror-activeline-background { background: #3b4252; } +.cm-s-nord .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css new file mode 100644 index 0000000000..f3d0d08acb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css @@ -0,0 +1,46 @@ +/* + + Name: oceanic-next + Author: Filype Pereira (https://github.com/fpereira1) + + Original oceanic-next color scheme by Dmitri Voronianski (https://github.com/voronianski/oceanic-next-color-scheme) + +*/ + +.cm-s-oceanic-next.CodeMirror { background: #304148; color: #f8f8f2; } +.cm-s-oceanic-next div.CodeMirror-selected { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::selection, .cm-s-oceanic-next .CodeMirror-line > span::selection, .cm-s-oceanic-next .CodeMirror-line > span > span::selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span > span::-moz-selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-gutters { background: #304148; border-right: 10px; } +.cm-s-oceanic-next .CodeMirror-guttermarker { color: white; } +.cm-s-oceanic-next .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } +.cm-s-oceanic-next.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-oceanic-next .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-oceanic-next span.cm-comment { color: #65737E; } +.cm-s-oceanic-next span.cm-atom { color: #C594C5; } +.cm-s-oceanic-next span.cm-number { color: #F99157; } + +.cm-s-oceanic-next span.cm-property { color: #99C794; } +.cm-s-oceanic-next span.cm-attribute, +.cm-s-oceanic-next span.cm-keyword { color: #C594C5; } +.cm-s-oceanic-next span.cm-builtin { color: #66d9ef; } +.cm-s-oceanic-next span.cm-string { color: #99C794; } + +.cm-s-oceanic-next span.cm-variable, +.cm-s-oceanic-next span.cm-variable-2, +.cm-s-oceanic-next span.cm-variable-3 { color: #f8f8f2; } +.cm-s-oceanic-next span.cm-def { color: #6699CC; } +.cm-s-oceanic-next span.cm-bracket { color: #5FB3B3; } +.cm-s-oceanic-next span.cm-tag { color: #C594C5; } +.cm-s-oceanic-next span.cm-header { color: #C594C5; } +.cm-s-oceanic-next span.cm-link { color: #C594C5; } +.cm-s-oceanic-next span.cm-error { background: #C594C5; color: #f8f8f0; } + +.cm-s-oceanic-next .CodeMirror-activeline-background { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css new file mode 100644 index 0000000000..de14e91124 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css @@ -0,0 +1,85 @@ +/* + Name: Panda Syntax + Author: Siamak Mokhtari (http://github.com/siamak/) + CodeMirror template by Siamak Mokhtari (https://github.com/siamak/atom-panda-syntax) +*/ +.cm-s-panda-syntax { + background: #292A2B; + color: #E6E6E6; + line-height: 1.5; + font-family: 'Operator Mono', 'Source Code Pro', Menlo, Monaco, Consolas, Courier New, monospace; +} +.cm-s-panda-syntax .CodeMirror-cursor { border-color: #ff2c6d; } +.cm-s-panda-syntax .CodeMirror-activeline-background { + background: rgba(99, 123, 156, 0.1); +} +.cm-s-panda-syntax .CodeMirror-selected { + background: #FFF; +} +.cm-s-panda-syntax .cm-comment { + font-style: italic; + color: #676B79; +} +.cm-s-panda-syntax .cm-operator { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-string { + color: #19F9D8; +} +.cm-s-panda-syntax .cm-string-2 { + color: #FFB86C; +} + +.cm-s-panda-syntax .cm-tag { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-meta { + color: #b084eb; +} + +.cm-s-panda-syntax .cm-number { + color: #FFB86C; +} +.cm-s-panda-syntax .cm-atom { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-keyword { + color: #FF75B5; +} +.cm-s-panda-syntax .cm-variable { + color: #ffb86c; +} +.cm-s-panda-syntax .cm-variable-2 { + color: #ff9ac1; +} +.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type { + color: #ff9ac1; +} + +.cm-s-panda-syntax .cm-def { + color: #e6e6e6; +} +.cm-s-panda-syntax .cm-property { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-unit { + color: #ffb86c; +} + +.cm-s-panda-syntax .cm-attribute { + color: #ffb86c; +} + +.cm-s-panda-syntax .CodeMirror-matchingbracket { + border-bottom: 1px dotted #19F9D8; + padding-bottom: 2px; + color: #e6e6e6; +} +.cm-s-panda-syntax .CodeMirror-gutters { + background: #292a2b; + border-right-color: rgba(255, 255, 255, 0.1); +} +.cm-s-panda-syntax .CodeMirror-linenumber { + color: #e6e6e6; + opacity: 0.6; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css new file mode 100644 index 0000000000..aa9d207e6d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Dark) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; } +.cm-s-paraiso-dark div.CodeMirror-selected { background: #41323f; } +.cm-s-paraiso-dark .CodeMirror-line::selection, .cm-s-paraiso-dark .CodeMirror-line > span::selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-line::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-gutters { background: #2f1e2e; border-right: 0px; } +.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } +.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-linenumber { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-cursor { border-left: 1px solid #8d8687; } + +.cm-s-paraiso-dark span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-dark span.cm-atom { color: #815ba4; } +.cm-s-paraiso-dark span.cm-number { color: #815ba4; } + +.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute { color: #48b685; } +.cm-s-paraiso-dark span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-dark span.cm-string { color: #fec418; } + +.cm-s-paraiso-dark span.cm-variable { color: #48b685; } +.cm-s-paraiso-dark span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-dark span.cm-def { color: #f99b15; } +.cm-s-paraiso-dark span.cm-bracket { color: #b9b6b0; } +.cm-s-paraiso-dark span.cm-tag { color: #ef6155; } +.cm-s-paraiso-dark span.cm-link { color: #815ba4; } +.cm-s-paraiso-dark span.cm-error { background: #ef6155; color: #8d8687; } + +.cm-s-paraiso-dark .CodeMirror-activeline-background { background: #4D344A; } +.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css new file mode 100644 index 0000000000..ae0c755f89 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Light) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-light.CodeMirror { background: #e7e9db; color: #41323f; } +.cm-s-paraiso-light div.CodeMirror-selected { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::selection, .cm-s-paraiso-light .CodeMirror-line > span::selection, .cm-s-paraiso-light .CodeMirror-line > span > span::selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span > span::-moz-selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-gutters { background: #e7e9db; border-right: 0px; } +.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } +.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-linenumber { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-cursor { border-left: 1px solid #776e71; } + +.cm-s-paraiso-light span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-light span.cm-atom { color: #815ba4; } +.cm-s-paraiso-light span.cm-number { color: #815ba4; } + +.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute { color: #48b685; } +.cm-s-paraiso-light span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-light span.cm-string { color: #fec418; } + +.cm-s-paraiso-light span.cm-variable { color: #48b685; } +.cm-s-paraiso-light span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-light span.cm-def { color: #f99b15; } +.cm-s-paraiso-light span.cm-bracket { color: #41323f; } +.cm-s-paraiso-light span.cm-tag { color: #ef6155; } +.cm-s-paraiso-light span.cm-link { color: #815ba4; } +.cm-s-paraiso-light span.cm-error { background: #ef6155; color: #776e71; } + +.cm-s-paraiso-light .CodeMirror-activeline-background { background: #CFD1C4; } +.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css new file mode 100644 index 0000000000..60435dd15e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css @@ -0,0 +1,52 @@ +/** + * Pastel On Dark theme ported from ACE editor + * @license MIT + * @copyright AtomicPages LLC 2014 + * @author Dennis Thompson, AtomicPages LLC + * @version 1.1 + * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme + */ + +.cm-s-pastel-on-dark.CodeMirror { + background: #2c2827; + color: #8F938F; + line-height: 1.5; +} +.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(221,240,255,0.2); } + +.cm-s-pastel-on-dark .CodeMirror-gutters { + background: #34302f; + border-right: 0px; + padding: 0 3px; +} +.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } +.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } +.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } +.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } +.cm-s-pastel-on-dark span.cm-property { color: #8F938F; } +.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } +.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-string { color: #66A968; } +.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } +.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-def { color: #757aD8; } +.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } +.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-error { + background: #757aD8; + color: #f8f8f0; +} +.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031); } +.cm-s-pastel-on-dark .CodeMirror-matchingbracket { + border: 1px solid rgba(255,255,255,0.25); + color: #8F938F !important; + margin: -1px -1px 0 -1px; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css new file mode 100644 index 0000000000..aeff0449d5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css @@ -0,0 +1,34 @@ +/* + + Name: Railscasts + Author: Ryan Bates (http://railscasts.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;} +.cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;} +.cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;} +.cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;} +.cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;} + +.cm-s-railscasts span.cm-comment {color: #bc9458;} +.cm-s-railscasts span.cm-atom {color: #b6b3eb;} +.cm-s-railscasts span.cm-number {color: #b6b3eb;} + +.cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;} +.cm-s-railscasts span.cm-keyword {color: #da4939;} +.cm-s-railscasts span.cm-string {color: #ffc66d;} + +.cm-s-railscasts span.cm-variable {color: #a5c261;} +.cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;} +.cm-s-railscasts span.cm-def {color: #cc7833;} +.cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;} +.cm-s-railscasts span.cm-bracket {color: #f4f1ed;} +.cm-s-railscasts span.cm-tag {color: #da4939;} +.cm-s-railscasts span.cm-link {color: #b6b3eb;} + +.cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-railscasts .CodeMirror-activeline-background { background: #303040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css new file mode 100644 index 0000000000..1f181b06ec --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css @@ -0,0 +1,25 @@ +.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } +.cm-s-rubyblue div.CodeMirror-selected { background: #38566F; } +.cm-s-rubyblue .CodeMirror-line::selection, .cm-s-rubyblue .CodeMirror-line > span::selection, .cm-s-rubyblue .CodeMirror-line > span > span::selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-line::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } +.cm-s-rubyblue .CodeMirror-guttermarker { color: white; } +.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } +.cm-s-rubyblue .CodeMirror-linenumber { color: white; } +.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } +.cm-s-rubyblue span.cm-atom { color: #F4C20B; } +.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } +.cm-s-rubyblue span.cm-keyword { color: #F0F; } +.cm-s-rubyblue span.cm-string { color: #F08047; } +.cm-s-rubyblue span.cm-meta { color: #F0F; } +.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } +.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; } +.cm-s-rubyblue span.cm-bracket { color: #F0F; } +.cm-s-rubyblue span.cm-link { color: #F4C20B; } +.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } +.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } +.cm-s-rubyblue span.cm-error { color: #AF2018; } + +.cm-s-rubyblue .CodeMirror-activeline-background { background: #173047; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css new file mode 100644 index 0000000000..814f76f7de --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css @@ -0,0 +1,44 @@ +/* + + Name: seti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original seti color scheme by Jesse Weed (https://github.com/jesseweed/seti-syntax) + +*/ + + +.cm-s-seti.CodeMirror { + background-color: #151718 !important; + color: #CFD2D1 !important; + border: none; +} +.cm-s-seti .CodeMirror-gutters { + color: #404b53; + background-color: #0E1112; + border: none; +} +.cm-s-seti .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-seti .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-seti.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::selection, .cm-s-seti .CodeMirror-line > span::selection, .cm-s-seti .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::-moz-selection, .cm-s-seti .CodeMirror-line > span::-moz-selection, .cm-s-seti .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti span.cm-comment { color: #41535b; } +.cm-s-seti span.cm-string, .cm-s-seti span.cm-string-2 { color: #55b5db; } +.cm-s-seti span.cm-number { color: #cd3f45; } +.cm-s-seti span.cm-variable { color: #55b5db; } +.cm-s-seti span.cm-variable-2 { color: #a074c4; } +.cm-s-seti span.cm-def { color: #55b5db; } +.cm-s-seti span.cm-keyword { color: #ff79c6; } +.cm-s-seti span.cm-operator { color: #9fca56; } +.cm-s-seti span.cm-keyword { color: #e6cd69; } +.cm-s-seti span.cm-atom { color: #cd3f45; } +.cm-s-seti span.cm-meta { color: #55b5db; } +.cm-s-seti span.cm-tag { color: #55b5db; } +.cm-s-seti span.cm-attribute { color: #9fca56; } +.cm-s-seti span.cm-qualifier { color: #9fca56; } +.cm-s-seti span.cm-property { color: #a074c4; } +.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; } +.cm-s-seti span.cm-builtin { color: #9fca56; } +.cm-s-seti .CodeMirror-activeline-background { background: #101213; } +.cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css new file mode 100644 index 0000000000..32d59b139a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css @@ -0,0 +1,52 @@ +/* + + Name: shadowfox + Author: overdodactyl (http://github.com/overdodactyl) + + Original shadowfox color scheme by Firefox + +*/ + +.cm-s-shadowfox.CodeMirror { background: #2a2a2e; color: #b1b1b3; } +.cm-s-shadowfox div.CodeMirror-selected { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::selection, .cm-s-shadowfox .CodeMirror-line > span::selection, .cm-s-shadowfox .CodeMirror-line > span > span::selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span > span::-moz-selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-gutters { background: #0c0c0d ; border-right: 1px solid #0c0c0d; } +.cm-s-shadowfox .CodeMirror-guttermarker { color: #555; } +.cm-s-shadowfox .CodeMirror-linenumber { color: #939393; } +.cm-s-shadowfox .CodeMirror-cursor { border-left: 1px solid #fff; } + +.cm-s-shadowfox span.cm-comment { color: #939393; } +.cm-s-shadowfox span.cm-atom { color: #FF7DE9; } +.cm-s-shadowfox span.cm-quote { color: #FF7DE9; } +.cm-s-shadowfox span.cm-builtin { color: #FF7DE9; } +.cm-s-shadowfox span.cm-attribute { color: #FF7DE9; } +.cm-s-shadowfox span.cm-keyword { color: #FF7DE9; } +.cm-s-shadowfox span.cm-error { color: #FF7DE9; } + +.cm-s-shadowfox span.cm-number { color: #6B89FF; } +.cm-s-shadowfox span.cm-string { color: #6B89FF; } +.cm-s-shadowfox span.cm-string-2 { color: #6B89FF; } + +.cm-s-shadowfox span.cm-meta { color: #939393; } +.cm-s-shadowfox span.cm-hr { color: #939393; } + +.cm-s-shadowfox span.cm-header { color: #75BFFF; } +.cm-s-shadowfox span.cm-qualifier { color: #75BFFF; } +.cm-s-shadowfox span.cm-variable-2 { color: #75BFFF; } + +.cm-s-shadowfox span.cm-property { color: #86DE74; } + +.cm-s-shadowfox span.cm-def { color: #75BFFF; } +.cm-s-shadowfox span.cm-bracket { color: #75BFFF; } +.cm-s-shadowfox span.cm-tag { color: #75BFFF; } +.cm-s-shadowfox span.cm-link:visited { color: #75BFFF; } + +.cm-s-shadowfox span.cm-variable { color: #B98EFF; } +.cm-s-shadowfox span.cm-variable-3 { color: #d7d7db; } +.cm-s-shadowfox span.cm-link { color: #737373; } +.cm-s-shadowfox span.cm-operator { color: #b1b1b3; } +.cm-s-shadowfox span.cm-special { color: #d7d7db; } + +.cm-s-shadowfox .CodeMirror-activeline-background { background: rgba(185, 215, 253, .15) } +.cm-s-shadowfox .CodeMirror-matchingbracket { outline: solid 1px rgba(255, 255, 255, .25); color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css new file mode 100644 index 0000000000..e978fec9b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css @@ -0,0 +1,165 @@ +/* +Solarized theme for code-mirror +http://ethanschoonover.com/solarized +*/ + +/* +Solarized color palette +http://ethanschoonover.com/solarized/img/solarized-palette.png +*/ + +.solarized.base03 { color: #002b36; } +.solarized.base02 { color: #073642; } +.solarized.base01 { color: #586e75; } +.solarized.base00 { color: #657b83; } +.solarized.base0 { color: #839496; } +.solarized.base1 { color: #93a1a1; } +.solarized.base2 { color: #eee8d5; } +.solarized.base3 { color: #fdf6e3; } +.solarized.solar-yellow { color: #b58900; } +.solarized.solar-orange { color: #cb4b16; } +.solarized.solar-red { color: #dc322f; } +.solarized.solar-magenta { color: #d33682; } +.solarized.solar-violet { color: #6c71c4; } +.solarized.solar-blue { color: #268bd2; } +.solarized.solar-cyan { color: #2aa198; } +.solarized.solar-green { color: #859900; } + +/* Color scheme for code-mirror */ + +.cm-s-solarized { + line-height: 1.45em; + color-profile: sRGB; + rendering-intent: auto; +} +.cm-s-solarized.cm-s-dark { + color: #839496; + background-color: #002b36; +} +.cm-s-solarized.cm-s-light { + background-color: #fdf6e3; + color: #657b83; +} + +.cm-s-solarized .CodeMirror-widget { + text-shadow: none; +} + +.cm-s-solarized .cm-header { color: #586e75; } +.cm-s-solarized .cm-quote { color: #93a1a1; } + +.cm-s-solarized .cm-keyword { color: #cb4b16; } +.cm-s-solarized .cm-atom { color: #d33682; } +.cm-s-solarized .cm-number { color: #d33682; } +.cm-s-solarized .cm-def { color: #2aa198; } + +.cm-s-solarized .cm-variable { color: #839496; } +.cm-s-solarized .cm-variable-2 { color: #b58900; } +.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; } + +.cm-s-solarized .cm-property { color: #2aa198; } +.cm-s-solarized .cm-operator { color: #6c71c4; } + +.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } + +.cm-s-solarized .cm-string { color: #859900; } +.cm-s-solarized .cm-string-2 { color: #b58900; } + +.cm-s-solarized .cm-meta { color: #859900; } +.cm-s-solarized .cm-qualifier { color: #b58900; } +.cm-s-solarized .cm-builtin { color: #d33682; } +.cm-s-solarized .cm-bracket { color: #cb4b16; } +.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } +.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-solarized .cm-tag { color: #93a1a1; } +.cm-s-solarized .cm-attribute { color: #2aa198; } +.cm-s-solarized .cm-hr { + color: transparent; + border-top: 1px solid #586e75; + display: block; +} +.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } +.cm-s-solarized .cm-special { color: #6c71c4; } +.cm-s-solarized .cm-em { + color: #999; + text-decoration: underline; + text-decoration-style: dotted; +} +.cm-s-solarized .cm-error, +.cm-s-solarized .cm-invalidchar { + color: #586e75; + border-bottom: 1px dotted #dc322f; +} + +.cm-s-solarized.cm-s-dark div.CodeMirror-selected { background: #073642; } +.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); } +.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection, .cm-s-dark .CodeMirror-line > span::-moz-selection, .cm-s-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(7, 54, 66, 0.99); } + +.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; } + +/* Editor styling */ + + + +/* Little shadow on the view-port of the buffer view */ +.cm-s-solarized.CodeMirror { + -moz-box-shadow: inset 7px 0 12px -6px #000; + -webkit-box-shadow: inset 7px 0 12px -6px #000; + box-shadow: inset 7px 0 12px -6px #000; +} + +/* Remove gutter border */ +.cm-s-solarized .CodeMirror-gutters { + border-right: 0; +} + +/* Gutter colors and line number styling based of color scheme (dark / light) */ + +/* Dark */ +.cm-s-solarized.cm-s-dark .CodeMirror-gutters { + background-color: #073642; +} + +.cm-s-solarized.cm-s-dark .CodeMirror-linenumber { + color: #586e75; +} + +/* Light */ +.cm-s-solarized.cm-s-light .CodeMirror-gutters { + background-color: #eee8d5; +} + +.cm-s-solarized.cm-s-light .CodeMirror-linenumber { + color: #839496; +} + +/* Common */ +.cm-s-solarized .CodeMirror-linenumber { + padding: 0 5px; +} +.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } +.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } +.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } + +.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { + color: #586e75; +} + +/* Cursor */ +.cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; } + +/* Fat cursor */ +.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; } +.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; } +.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; } +.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; } + +/* Active line */ +.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { + background: rgba(255, 255, 255, 0.06); +} +.cm-s-solarized.cm-s-light .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.06); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css new file mode 100644 index 0000000000..9494c14c20 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css @@ -0,0 +1,16 @@ +.cm-s-ssms span.cm-keyword { color: blue; } +.cm-s-ssms span.cm-comment { color: darkgreen; } +.cm-s-ssms span.cm-string { color: red; } +.cm-s-ssms span.cm-def { color: black; } +.cm-s-ssms span.cm-variable { color: black; } +.cm-s-ssms span.cm-variable-2 { color: black; } +.cm-s-ssms span.cm-atom { color: darkgray; } +.cm-s-ssms .CodeMirror-linenumber { color: teal; } +.cm-s-ssms .CodeMirror-activeline-background { background: #ffffff; } +.cm-s-ssms span.cm-string-2 { color: #FF00FF; } +.cm-s-ssms span.cm-operator, +.cm-s-ssms span.cm-bracket, +.cm-s-ssms span.cm-punctuation { color: darkgray; } +.cm-s-ssms .CodeMirror-gutters { border-right: 3px solid #ffee62; background-color: #ffffff; } +.cm-s-ssms div.CodeMirror-selected { background: #ADD6FF; } + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css new file mode 100644 index 0000000000..c4c93c11ea --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css @@ -0,0 +1,30 @@ +.cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } +.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-the-matrix .CodeMirror-line::selection, .cm-s-the-matrix .CodeMirror-line > span::selection, .cm-s-the-matrix .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-line::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } +.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } +.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } +.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-the-matrix span.cm-keyword { color: #008803; font-weight: bold; } +.cm-s-the-matrix span.cm-atom { color: #3FF; } +.cm-s-the-matrix span.cm-number { color: #FFB94F; } +.cm-s-the-matrix span.cm-def { color: #99C; } +.cm-s-the-matrix span.cm-variable { color: #F6C; } +.cm-s-the-matrix span.cm-variable-2 { color: #C6F; } +.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; } +.cm-s-the-matrix span.cm-property { color: #62FFA0; } +.cm-s-the-matrix span.cm-operator { color: #999; } +.cm-s-the-matrix span.cm-comment { color: #CCCCCC; } +.cm-s-the-matrix span.cm-string { color: #39C; } +.cm-s-the-matrix span.cm-meta { color: #C9F; } +.cm-s-the-matrix span.cm-qualifier { color: #FFF700; } +.cm-s-the-matrix span.cm-builtin { color: #30a; } +.cm-s-the-matrix span.cm-bracket { color: #cc7; } +.cm-s-the-matrix span.cm-tag { color: #FFBD40; } +.cm-s-the-matrix span.cm-attribute { color: #FFF700; } +.cm-s-the-matrix span.cm-error { color: #FF0000; } + +.cm-s-the-matrix .CodeMirror-activeline-background { background: #040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css new file mode 100644 index 0000000000..b6dd4a9278 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css @@ -0,0 +1,35 @@ +/* + + Name: Tomorrow Night - Bright + Author: Chris Kempson + + Port done by Gerard Braad + +*/ + +.cm-s-tomorrow-night-bright.CodeMirror { background: #000000; color: #eaeaea; } +.cm-s-tomorrow-night-bright div.CodeMirror-selected { background: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-bright .CodeMirror-linenumber { color: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-bright span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-bright span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-bright span.cm-keyword { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-string { color: #e7c547; } + +.cm-s-tomorrow-night-bright span.cm-variable { color: #b9ca4a; } +.cm-s-tomorrow-night-bright span.cm-variable-2 { color: #7aa6da; } +.cm-s-tomorrow-night-bright span.cm-def { color: #e78c45; } +.cm-s-tomorrow-night-bright span.cm-bracket { color: #eaeaea; } +.cm-s-tomorrow-night-bright span.cm-tag { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-error { background: #d54e53; color: #6A6A6A; } + +.cm-s-tomorrow-night-bright .CodeMirror-activeline-background { background: #2a2a2a; } +.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css new file mode 100644 index 0000000000..2a9debc327 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css @@ -0,0 +1,38 @@ +/* + + Name: Tomorrow Night - Eighties + Author: Chris Kempson + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-tomorrow-night-eighties.CodeMirror { background: #000000; color: #CCCCCC; } +.cm-s-tomorrow-night-eighties div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-tomorrow-night-eighties .CodeMirror-line::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-eighties .CodeMirror-linenumber { color: #515151; } +.cm-s-tomorrow-night-eighties .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-eighties span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-eighties span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-keyword { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-string { color: #ffcc66; } + +.cm-s-tomorrow-night-eighties span.cm-variable { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-variable-2 { color: #6699cc; } +.cm-s-tomorrow-night-eighties span.cm-def { color: #f99157; } +.cm-s-tomorrow-night-eighties span.cm-bracket { color: #CCCCCC; } +.cm-s-tomorrow-night-eighties span.cm-tag { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-error { background: #f2777a; color: #6A6A6A; } + +.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background { background: #343600; } +.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css new file mode 100644 index 0000000000..0b14ac35d6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css @@ -0,0 +1,64 @@ +.cm-s-ttcn .cm-quote { color: #090; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-header, .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-link { text-decoration: underline; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-header { color: #00f; font-weight: bold; } + +.cm-s-ttcn .cm-atom { color: #219; } +.cm-s-ttcn .cm-attribute { color: #00c; } +.cm-s-ttcn .cm-bracket { color: #997; } +.cm-s-ttcn .cm-comment { color: #333333; } +.cm-s-ttcn .cm-def { color: #00f; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-error { color: #f00; } +.cm-s-ttcn .cm-hr { color: #999; } +.cm-s-ttcn .cm-invalidchar { color: #f00; } +.cm-s-ttcn .cm-keyword { font-weight:bold; } +.cm-s-ttcn .cm-link { color: #00c; text-decoration: underline; } +.cm-s-ttcn .cm-meta { color: #555; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-qualifier { color: #555; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-string { color: #006400; } +.cm-s-ttcn .cm-string-2 { color: #f50; } +.cm-s-ttcn .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-tag { color: #170; } +.cm-s-ttcn .cm-variable { color: #8B2252; } +.cm-s-ttcn .cm-variable-2 { color: #05a; } +.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; } + +.cm-s-ttcn .cm-invalidchar { color: #f00; } + +/* ASN */ +.cm-s-ttcn .cm-accessTypes, +.cm-s-ttcn .cm-compareTypes { color: #27408B; } +.cm-s-ttcn .cm-cmipVerbs { color: #8B2252; } +.cm-s-ttcn .cm-modifier { color:#D2691E; } +.cm-s-ttcn .cm-status { color:#8B4545; } +.cm-s-ttcn .cm-storage { color:#A020F0; } +.cm-s-ttcn .cm-tags { color:#006400; } + +/* CFG */ +.cm-s-ttcn .cm-externalCommands { color: #8B4545; font-weight:bold; } +.cm-s-ttcn .cm-fileNCtrlMaskOptions, +.cm-s-ttcn .cm-sectionTitle { color: #2E8B57; font-weight:bold; } + +/* TTCN */ +.cm-s-ttcn .cm-booleanConsts, +.cm-s-ttcn .cm-otherConsts, +.cm-s-ttcn .cm-verdictConsts { color: #006400; } +.cm-s-ttcn .cm-configOps, +.cm-s-ttcn .cm-functionOps, +.cm-s-ttcn .cm-portOps, +.cm-s-ttcn .cm-sutOps, +.cm-s-ttcn .cm-timerOps, +.cm-s-ttcn .cm-verdictOps { color: #0000FF; } +.cm-s-ttcn .cm-preprocessor, +.cm-s-ttcn .cm-templateMatch, +.cm-s-ttcn .cm-ttcn3Macros { color: #27408B; } +.cm-s-ttcn .cm-types { color: #A52A2A; font-weight:bold; } +.cm-s-ttcn .cm-visibilityModifiers { font-weight:bold; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css new file mode 100644 index 0000000000..b2b1b2aa93 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css @@ -0,0 +1,32 @@ +.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ +.cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/ +.cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); } +.cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); } + +.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } +.cm-s-twilight .CodeMirror-guttermarker { color: white; } +.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } +.cm-s-twilight .CodeMirror-linenumber { color: #aaa; } +.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ +.cm-s-twilight .cm-atom { color: #FC0; } +.cm-s-twilight .cm-number { color: #ca7841; } /**/ +.cm-s-twilight .cm-def { color: #8DA6CE; } +.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ +.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/ +.cm-s-twilight .cm-operator { color: #cda869; } /**/ +.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ +.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ +.cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ +.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ +.cm-s-twilight .cm-tag { color: #997643; } /**/ +.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-twilight .cm-header { color: #FF6400; } +.cm-s-twilight .cm-hr { color: #AEAEAE; } +.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ +.cm-s-twilight .cm-error { border-bottom: 1px solid red; } + +.cm-s-twilight .CodeMirror-activeline-background { background: #27282E; } +.cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css new file mode 100644 index 0000000000..6358ad3655 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css @@ -0,0 +1,34 @@ +/* Taken from the popular Visual Studio Vibrant Ink Schema */ + +.cm-s-vibrant-ink.CodeMirror { background: black; color: white; } +.cm-s-vibrant-ink div.CodeMirror-selected { background: #35493c; } +.cm-s-vibrant-ink .CodeMirror-line::selection, .cm-s-vibrant-ink .CodeMirror-line > span::selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::selection { background: rgba(53, 73, 60, 0.99); } +.cm-s-vibrant-ink .CodeMirror-line::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::-moz-selection { background: rgba(53, 73, 60, 0.99); } + +.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } +.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-vibrant-ink .cm-keyword { color: #CC7832; } +.cm-s-vibrant-ink .cm-atom { color: #FC0; } +.cm-s-vibrant-ink .cm-number { color: #FFEE98; } +.cm-s-vibrant-ink .cm-def { color: #8DA6CE; } +.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; } +.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; } +.cm-s-vibrant-ink .cm-operator { color: #888; } +.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } +.cm-s-vibrant-ink .cm-string { color: #A5C25C; } +.cm-s-vibrant-ink .cm-string-2 { color: red; } +.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } +.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-header { color: #FF6400; } +.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } +.cm-s-vibrant-ink .cm-link { color: #5656F3; } +.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } + +.cm-s-vibrant-ink .CodeMirror-activeline-background { background: #27282E; } +.cm-s-vibrant-ink .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css new file mode 100644 index 0000000000..7da1a0f705 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css @@ -0,0 +1,53 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-xq-dark div.CodeMirror-selected { background: #27007A; } +.cm-s-xq-dark .CodeMirror-line::selection, .cm-s-xq-dark .CodeMirror-line > span::selection, .cm-s-xq-dark .CodeMirror-line > span > span::selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-line::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-xq-dark span.cm-keyword { color: #FFBD40; } +.cm-s-xq-dark span.cm-atom { color: #6C8CD5; } +.cm-s-xq-dark span.cm-number { color: #164; } +.cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; } +.cm-s-xq-dark span.cm-variable { color: #FFF; } +.cm-s-xq-dark span.cm-variable-2 { color: #EEE; } +.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; } +.cm-s-xq-dark span.cm-property {} +.cm-s-xq-dark span.cm-operator {} +.cm-s-xq-dark span.cm-comment { color: gray; } +.cm-s-xq-dark span.cm-string { color: #9FEE00; } +.cm-s-xq-dark span.cm-meta { color: yellow; } +.cm-s-xq-dark span.cm-qualifier { color: #FFF700; } +.cm-s-xq-dark span.cm-builtin { color: #30a; } +.cm-s-xq-dark span.cm-bracket { color: #cc7; } +.cm-s-xq-dark span.cm-tag { color: #FFBD40; } +.cm-s-xq-dark span.cm-attribute { color: #FFF700; } +.cm-s-xq-dark span.cm-error { color: #f00; } + +.cm-s-xq-dark .CodeMirror-activeline-background { background: #27282E; } +.cm-s-xq-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css new file mode 100644 index 0000000000..7b182ea997 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css @@ -0,0 +1,43 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-light span.cm-keyword { line-height: 1em; font-weight: bold; color: #5A5CAD; } +.cm-s-xq-light span.cm-atom { color: #6C8CD5; } +.cm-s-xq-light span.cm-number { color: #164; } +.cm-s-xq-light span.cm-def { text-decoration:underline; } +.cm-s-xq-light span.cm-variable { color: black; } +.cm-s-xq-light span.cm-variable-2 { color:black; } +.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; } +.cm-s-xq-light span.cm-property {} +.cm-s-xq-light span.cm-operator {} +.cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; } +.cm-s-xq-light span.cm-string { color: red; } +.cm-s-xq-light span.cm-meta { color: yellow; } +.cm-s-xq-light span.cm-qualifier { color: grey; } +.cm-s-xq-light span.cm-builtin { color: #7EA656; } +.cm-s-xq-light span.cm-bracket { color: #cc7; } +.cm-s-xq-light span.cm-tag { color: #3F7F7F; } +.cm-s-xq-light span.cm-attribute { color: #7F007F; } +.cm-s-xq-light span.cm-error { color: #f00; } + +.cm-s-xq-light .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-xq-light .CodeMirror-matchingbracket { outline:1px solid grey;color:black !important;background:yellow; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css new file mode 100644 index 0000000000..d085f72497 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css @@ -0,0 +1,44 @@ +/* + + Name: yeti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original yeti color scheme by Jesse Weed (https://github.com/jesseweed/yeti-syntax) + +*/ + + +.cm-s-yeti.CodeMirror { + background-color: #ECEAE8 !important; + color: #d1c9c0 !important; + border: none; +} + +.cm-s-yeti .CodeMirror-gutters { + color: #adaba6; + background-color: #E5E1DB; + border: none; +} +.cm-s-yeti .CodeMirror-cursor { border-left: solid thin #d1c9c0; } +.cm-s-yeti .CodeMirror-linenumber { color: #adaba6; } +.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::selection, .cm-s-yeti .CodeMirror-line > span::selection, .cm-s-yeti .CodeMirror-line > span > span::selection { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::-moz-selection, .cm-s-yeti .CodeMirror-line > span::-moz-selection, .cm-s-yeti .CodeMirror-line > span > span::-moz-selection { background: #DCD8D2; } +.cm-s-yeti span.cm-comment { color: #d4c8be; } +.cm-s-yeti span.cm-string, .cm-s-yeti span.cm-string-2 { color: #96c0d8; } +.cm-s-yeti span.cm-number { color: #a074c4; } +.cm-s-yeti span.cm-variable { color: #55b5db; } +.cm-s-yeti span.cm-variable-2 { color: #a074c4; } +.cm-s-yeti span.cm-def { color: #55b5db; } +.cm-s-yeti span.cm-operator { color: #9fb96e; } +.cm-s-yeti span.cm-keyword { color: #9fb96e; } +.cm-s-yeti span.cm-atom { color: #a074c4; } +.cm-s-yeti span.cm-meta { color: #96c0d8; } +.cm-s-yeti span.cm-tag { color: #96c0d8; } +.cm-s-yeti span.cm-attribute { color: #9fb96e; } +.cm-s-yeti span.cm-qualifier { color: #96c0d8; } +.cm-s-yeti span.cm-property { color: #a074c4; } +.cm-s-yeti span.cm-builtin { color: #a074c4; } +.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; } +.cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; } +.cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css new file mode 100644 index 0000000000..975f0788a2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css @@ -0,0 +1,59 @@ +/* + + Name: yoncé + Author: Thomas MacLean (http://github.com/thomasmaclean) + + Original yoncé color scheme by Mina Markham (https://github.com/minamarkham) + +*/ + +.cm-s-yonce.CodeMirror { background: #1C1C1C; color: #d4d4d4; } /**/ +.cm-s-yonce div.CodeMirror-selected { background: rgba(252, 69, 133, 0.478); } /**/ +.cm-s-yonce .CodeMirror-selectedtext, +.cm-s-yonce .CodeMirror-selected, +.cm-s-yonce .CodeMirror-line::selection, +.cm-s-yonce .CodeMirror-line > span::selection, +.cm-s-yonce .CodeMirror-line > span > span::selection, +.cm-s-yonce .CodeMirror-line::-moz-selection, +.cm-s-yonce .CodeMirror-line > span::-moz-selection, +.cm-s-yonce .CodeMirror-line > span > span::-moz-selection { background: rgba(252, 67, 132, 0.47); } + +.cm-s-yonce.CodeMirror pre { padding-left: 0px; } +.cm-s-yonce .CodeMirror-gutters {background: #1C1C1C; border-right: 0px;} +.cm-s-yonce .CodeMirror-linenumber {color: #777777; padding-right: 10px; } +.cm-s-yonce .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: #1C1C1C; color: #fc4384; } +.cm-s-yonce .CodeMirror-linenumber { color: #777; } +.cm-s-yonce .CodeMirror-cursor { border-left: 2px solid #FC4384; } +.cm-s-yonce .cm-searching { background: rgba(243, 155, 53, .3) !important; outline: 1px solid #F39B35; } +.cm-s-yonce .cm-searching.CodeMirror-selectedtext { background: rgba(243, 155, 53, .7) !important; color: white; } + +.cm-s-yonce .cm-keyword { color: #00A7AA; } /**/ +.cm-s-yonce .cm-atom { color: #F39B35; } +.cm-s-yonce .cm-number, .cm-s-yonce span.cm-type { color: #A06FCA; } /**/ +.cm-s-yonce .cm-def { color: #98E342; } +.cm-s-yonce .cm-property, +.cm-s-yonce span.cm-variable { color: #D4D4D4; font-style: italic; } +.cm-s-yonce span.cm-variable-2 { color: #da7dae; font-style: italic; } +.cm-s-yonce span.cm-variable-3 { color: #A06FCA; } +.cm-s-yonce .cm-type.cm-def { color: #FC4384; font-style: normal; text-decoration: underline; } +.cm-s-yonce .cm-property.cm-def { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-callee { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-operator { color: #FC4384; } /**/ +.cm-s-yonce .cm-qualifier, +.cm-s-yonce .cm-tag { color: #FC4384; } +.cm-s-yonce .cm-tag.cm-bracket { color: #D4D4D4; } +.cm-s-yonce .cm-attribute { color: #A06FCA; } +.cm-s-yonce .cm-comment { color:#696d70; font-style:italic; font-weight:normal; } /**/ +.cm-s-yonce .cm-comment.cm-tag { color: #FC4384 } +.cm-s-yonce .cm-comment.cm-attribute { color: #D4D4D4; } +.cm-s-yonce .cm-string { color:#E6DB74; } /**/ +.cm-s-yonce .cm-string-2 { color:#F39B35; } /*?*/ +.cm-s-yonce .cm-meta { color: #D4D4D4; background: inherit; } +.cm-s-yonce .cm-builtin { color: #FC4384; } /*?*/ +.cm-s-yonce .cm-header { color: #da7dae; } +.cm-s-yonce .cm-hr { color: #98E342; } +.cm-s-yonce .cm-link { color:#696d70; font-style:italic; text-decoration:none; } /**/ +.cm-s-yonce .cm-error { border-bottom: 1px solid #C42412; } + +.cm-s-yonce .CodeMirror-activeline-background { background: #272727; } +.cm-s-yonce .CodeMirror-matchingbracket { outline:1px solid grey; color:#D4D4D4 !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css new file mode 100644 index 0000000000..4eb4247c92 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css @@ -0,0 +1,37 @@ +/** + * " + * Using Zenburn color palette from the Emacs Zenburn Theme + * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el + * + * Also using parts of https://github.com/xavi/coderay-lighttable-theme + * " + * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css + */ + +.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } +.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } +.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-zenburn.CodeMirror { background-color: #3f3f3f; color: #dcdccc; } +.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } +.cm-s-zenburn span.cm-comment { color: #7f9f7f; } +.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } +.cm-s-zenburn span.cm-atom { color: #bfebbf; } +.cm-s-zenburn span.cm-def { color: #dcdccc; } +.cm-s-zenburn span.cm-variable { color: #dfaf8f; } +.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } +.cm-s-zenburn span.cm-string { color: #cc9393; } +.cm-s-zenburn span.cm-string-2 { color: #cc9393; } +.cm-s-zenburn span.cm-number { color: #dcdccc; } +.cm-s-zenburn span.cm-tag { color: #93e0e3; } +.cm-s-zenburn span.cm-property { color: #dfaf8f; } +.cm-s-zenburn span.cm-attribute { color: #dfaf8f; } +.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } +.cm-s-zenburn span.cm-meta { color: #f0dfaf; } +.cm-s-zenburn span.cm-header { color: #f0efd0; } +.cm-s-zenburn span.cm-operator { color: #f0efd0; } +.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } +.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } +.cm-s-zenburn .CodeMirror-activeline { background: #000000; } +.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } +.cm-s-zenburn div.CodeMirror-selected { background: #545454; } +.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected { background: #4f4f4f; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index cedf508cc2..92b8cbcfbd 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,234 +41,243 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/cms-kit.admin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.2.1.tgz#f685e8533366fa7a7db9641a61681f664af6d979" - integrity sha512-KkT3eJMR0XCzlIY3KXNId3KfN8rQmGuThTZIPo5cifGg0mpW/HdkCfI4Dmv6v2xkUnZ/o5dOf+cXkvFrt6zzfg== +"@abp/cms-kit.admin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.3.0-rc.1.tgz#741350a9669532d3bd8e703c2a8cde5e693b1b9d" + integrity sha512-xmdfrlAOBDB1Fi/aBjpkNEG5m4OBiSOo1xt88fG1KJiKxfDYsH84XB+V7rJ/3IWtlaQJDzdnYFrqoex/5h0S/A== dependencies: - "@abp/jstree" "~5.2.1" - "@abp/slugify" "~5.2.1" - "@abp/tui-editor" "~5.2.1" - "@abp/uppy" "~5.2.1" + "@abp/codemirror" "~5.3.0-rc.1" + "@abp/jstree" "~5.3.0-rc.1" + "@abp/slugify" "~5.3.0-rc.1" + "@abp/tui-editor" "~5.3.0-rc.1" + "@abp/uppy" "~5.3.0-rc.1" -"@abp/cms-kit.public@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.2.1.tgz#8f4860b17470f57fce3bbd732a7954031a244d14" - integrity sha512-dOhzJjWuXO74GFUg78JRhLOJCaUXjwOHuQMbzpWHnMyrj88nEJkEtHwYs1vxf9GWvyhhES6h7ZyusxJhy+Ybww== +"@abp/cms-kit.public@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.3.0-rc.1.tgz#4f0fe30a5c6f5450dfde265162d68239e00e2f9b" + integrity sha512-B9FX1bq9Ki9bouatcY9MJRbOo8/QLFmq24Ua3ASgmMhMwwSpUUu+GBUtxpUkRepWcpPze4m3rWIn5Ff8ZVnOEw== dependencies: - "@abp/highlight.js" "~5.2.1" - "@abp/star-rating-svg" "~5.2.1" + "@abp/highlight.js" "~5.3.0-rc.1" + "@abp/star-rating-svg" "~5.3.0-rc.1" -"@abp/cms-kit@5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.2.1.tgz#2cab9de4bb4e14ec39f8a2086b16fc38556af6bb" - integrity sha512-SuIJYj8LAdYeATYrpLxRGg7gMQ52Wq2gApriv7c7pC45mPQosi57wjEMvsI2MKAurEwQqTf7J38R3UJNRgmQbQ== +"@abp/cms-kit@5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.3.0-rc.1.tgz#da749badac6681d8049a4d6c522c172fdb72f02b" + integrity sha512-ACKZf69dGti9W8M0ZZWn0UiZA+LlGqQtEx9rkTnzrzma4uePsDvIFvbMGyK8UZLSVGHOVVhE2kN1OGTioeqgGw== dependencies: - "@abp/cms-kit.admin" "~5.2.1" - "@abp/cms-kit.public" "~5.2.1" + "@abp/cms-kit.admin" "~5.3.0-rc.1" + "@abp/cms-kit.public" "~5.3.0-rc.1" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/codemirror@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.3.0-rc.1.tgz#20386caeffa7f0a65030a635532935d669fc5295" + integrity sha512-46AeZEeHEvOKjA6KS/SkhiizoLqQUB9cRJfOgT7NKP18OKx5ra4+Cj2CGtoq2N+FjuA7hgdnbbjX8E1GkfHAPg== dependencies: - "@abp/utils" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" + codemirror "^5.65.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" + +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== + dependencies: + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.2.1.tgz#345e826047b2e87861d08b5ca2a9e5a313c22bda" - integrity sha512-Pi/pMWqdvdBr0E63UrhapuUtNNoY9Jt3R1Py52JQ0r90r53k5fmYOIaSwmaFlVZ8T/JApJt2D9i0Z4k8Tcn7Vg== +"@abp/highlight.js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.3.0-rc.1.tgz#a6dad18c759ff4c1488b6aef4898d88d55e0ce1a" + integrity sha512-z4vvoETKcciumaED4hnpgrUnjWhtRejG+nW/er+X1dxrUJk58oh6ReFs0/xb+xlrKc/ALOYTh0VY5LBU2KU5Qw== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/jstree@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.2.1.tgz#27f8c80053fbd7f5b242cc144b3ebdc33a668b9d" - integrity sha512-KYcdkjm33OEOBH/HHgOvIoVX8Bg/KlTJ4muyWYzPK0JK8T61rjrAw8cnlvMl5fqnuzdUUWFgfpuZq7HhgU30NQ== +"@abp/jstree@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.3.0-rc.1.tgz#e6c4a3ed1afe23ba3029674833c3135ac37dceda" + integrity sha512-MKJX2IXtTijjNfGNoy486/XdQ7nncIaoUSAZUcah0NXP1cyBC+PMl+zI9y1G/nJsAjX7zSpmWh8TXkbP20HZBQ== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jstree "^3.3.12" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/slugify@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.2.1.tgz#97c8b54fcfc271e7fb2f1697fafa3dff30ba6891" - integrity sha512-e/QxzbeOJYgKdYJQSCeP7QnnraLEafxB/AAzQDDJH2hKid9lNDeUxjggw/xCSiiRCG9Qz8OYuei6bNaYDHcxbQ== +"@abp/slugify@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.3.0-rc.1.tgz#dfebf924365d8627a6dae770394396ffa383a960" + integrity sha512-gPHLGVfrXSiuUMxEdPpZm6ie+ZkOVk2SXb9B2/+ndL+Wy8FYJiP6v2xn0SJ3ENqGL4nvuZdDOfAGKbrICpb/Pg== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.2.1.tgz#f8cd6a965079acfa3633731eacf653e142886c1e" - integrity sha512-QofOzA0kjpXEm80tkxBptKYTUZa4uolHRy4KNTzDFdcf8TyC6hT8I6kmUS9ym7F3HKLjLhDWfRsd1kKaDwxzQw== +"@abp/star-rating-svg@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.3.0-rc.1.tgz#1589d7407932c6113312a6dbc43be32363363314" + integrity sha512-o7fP05qMm7OP9A1TPf5ysSqnujC6WWMQEUceIqRdp2UWiLKd8c/3GrtLbA+NDDN7ddES8JPrU98ENdfRxqb6CA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/tui-editor@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.2.1.tgz#06be1a029de754868fa11ce3479be3fbc90ba103" - integrity sha512-Mi3preBkGEU1hrtSNCkOjeXPc9c74DFt8BL82sPIVDglYcVrVLXbnNTWE/CHP0spmKWh33ek4FoH1Pt0TePMuw== +"@abp/tui-editor@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.1.tgz#d5b6e46c922e9743216395bc055ed8208c2ead0b" + integrity sha512-wMEph23kwGJyAGweivKn2EDTRQQD0UG0X23qMd4Cv285qdu4AoYL2/shBDFKiXfhN0Q7EZ06mhOyTuhJmTnNUg== dependencies: - "@abp/jquery" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" -"@abp/uppy@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.2.1.tgz#560bbb363a0b0b493cc2f1c20f4f7b51e95cb331" - integrity sha512-cLqeGHrfwuOgPKjIBTq7H/l3P494sEgmrdH3UW9wVIjD5OAIbK/2AeZ2xTIIg0Mn+ALm+rqfsw0+qBoBug1WHQ== +"@abp/uppy@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.3.0-rc.1.tgz#19f2e09eb6a34e70e08f7d79189624012ab265dd" + integrity sha512-a4V1MzvLdCfI4va8U7nxvUfsh/+h4UG+Utu/HFJ2iHPpH/cj/xIBbCWljDt4uToHUIiZ2kXVCE+0TfWiYV+JJQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" uppy "^1.16.1" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" @@ -999,6 +1008,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@^5.65.1: + version "5.65.3" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.3.tgz#2d029930d5a293bc5fb96ceea64654803c0d4ac7" + integrity sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ== + collection-map@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 2ec4d524e2..bfd84f86a8 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/docs": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/docs": "^5.3.0-rc.1" } } diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md index 6329ab4686..2d792fe64d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md @@ -1,40 +1,129 @@ # Prism Changelog +## 1.28.0 (2022-04-17) + +### New components + +* __Ado__ & __Mata__ (Stata) ([#3383](https://github.com/PrismJS/prism/issues/3383)) [`63806d57`](https://github.com/PrismJS/prism/commit/63806d57) +* __ARM Assembly__ ([#3376](https://github.com/PrismJS/prism/issues/3376)) [`554ff324`](https://github.com/PrismJS/prism/commit/554ff324) +* __Arturo__ ([#3403](https://github.com/PrismJS/prism/issues/3403)) [`e2fe1f79`](https://github.com/PrismJS/prism/commit/e2fe1f79) +* __AWK__ & __GAWK__ ([#3374](https://github.com/PrismJS/prism/issues/3374)) [`ea8a0f40`](https://github.com/PrismJS/prism/commit/ea8a0f40) +* __Cooklang__ ([#3337](https://github.com/PrismJS/prism/issues/3337)) [`4eb928c3`](https://github.com/PrismJS/prism/commit/4eb928c3) +* __CUE__ ([#3375](https://github.com/PrismJS/prism/issues/3375)) [`a1340666`](https://github.com/PrismJS/prism/commit/a1340666) +* __gettext__ ([#3369](https://github.com/PrismJS/prism/issues/3369)) [`dfef9b61`](https://github.com/PrismJS/prism/commit/dfef9b61) +* __GNU Linker Script__ ([#3373](https://github.com/PrismJS/prism/issues/3373)) [`33f2cf95`](https://github.com/PrismJS/prism/commit/33f2cf95) +* __Odin__ ([#3424](https://github.com/PrismJS/prism/issues/3424)) [`8a3fef6d`](https://github.com/PrismJS/prism/commit/8a3fef6d) +* __PlantUML__ ([#3372](https://github.com/PrismJS/prism/issues/3372)) [`0d49553c`](https://github.com/PrismJS/prism/commit/0d49553c) +* __ReScript__ ([#3435](https://github.com/PrismJS/prism/issues/3435)) [`cbef9af7`](https://github.com/PrismJS/prism/commit/cbef9af7) +* __SuperCollider__ ([#3371](https://github.com/PrismJS/prism/issues/3371)) [`1b1d6731`](https://github.com/PrismJS/prism/commit/1b1d6731) + +### Updated components + +* __.properties__ + * Use `key`, `value` for token names; `attr-name`, `attr-value` as aliases ([#3377](https://github.com/PrismJS/prism/issues/3377)) [`b94a664d`](https://github.com/PrismJS/prism/commit/b94a664d) +* __ABAP__ + * Sorted keyword list ([#3368](https://github.com/PrismJS/prism/issues/3368)) [`7bda2bf1`](https://github.com/PrismJS/prism/commit/7bda2bf1) +* __Ada__ + * Changed `attr-name` to `attribute`; Use `attr-name` as alias ([#3381](https://github.com/PrismJS/prism/issues/3381)) [`cde0b5b2`](https://github.com/PrismJS/prism/commit/cde0b5b2) + * Added `or` keyword ([#3380](https://github.com/PrismJS/prism/issues/3380)) [`c30b736f`](https://github.com/PrismJS/prism/commit/c30b736f) +* __Atmel AVR Assembly__ + * Fixed `&=` and `|=` operators ([#3395](https://github.com/PrismJS/prism/issues/3395)) [`8c4ae5a5`](https://github.com/PrismJS/prism/commit/8c4ae5a5) +* __AutoHotkey__ + * Use standard tokens ([#3385](https://github.com/PrismJS/prism/issues/3385)) [`61c460e8`](https://github.com/PrismJS/prism/commit/61c460e8) + * Use general pattern instead of name list for directives ([#3384](https://github.com/PrismJS/prism/issues/3384)) [`7ac84dda`](https://github.com/PrismJS/prism/commit/7ac84dda) +* __CFScript__ + * Simplified operator regex ([#3396](https://github.com/PrismJS/prism/issues/3396)) [`6a215fe0`](https://github.com/PrismJS/prism/commit/6a215fe0) +* __CMake__ + * Simplified `variable` and `operator` regexes ([#3398](https://github.com/PrismJS/prism/issues/3398)) [`8e59744b`](https://github.com/PrismJS/prism/commit/8e59744b) +* __Erlang__ + * Added `begin` keyword ([#3387](https://github.com/PrismJS/prism/issues/3387)) [`cf38d059`](https://github.com/PrismJS/prism/commit/cf38d059) +* __Excel Formula__ + * Use more fitting aliases for `function-name`, `range`, and `cell` ([#3391](https://github.com/PrismJS/prism/issues/3391)) [`ef0ec02a`](https://github.com/PrismJS/prism/commit/ef0ec02a) +* __Flow__ + * Changed alias of `type` to `class-name` ([#3390](https://github.com/PrismJS/prism/issues/3390)) [`ce41434d`](https://github.com/PrismJS/prism/commit/ce41434d) + * Recognise `[Ss]ymbol` as a type ([#3388](https://github.com/PrismJS/prism/issues/3388)) [`3916883a`](https://github.com/PrismJS/prism/commit/3916883a) +* __GEDCOM__ + * Update `tag` to `record` ([#3386](https://github.com/PrismJS/prism/issues/3386)) [`f8f95340`](https://github.com/PrismJS/prism/commit/f8f95340) +* __Groovy__ + * Added string interpolation without hook ([#3366](https://github.com/PrismJS/prism/issues/3366)) [`5617765f`](https://github.com/PrismJS/prism/commit/5617765f) +* __Handlebars__ + * Added Mustache alias ([#3422](https://github.com/PrismJS/prism/issues/3422)) [`cb5229af`](https://github.com/PrismJS/prism/commit/cb5229af) +* __Java__ + * Improved class name detection ([#3351](https://github.com/PrismJS/prism/issues/3351)) [`4cb3d038`](https://github.com/PrismJS/prism/commit/4cb3d038) + * Fixed `record` false positives ([#3348](https://github.com/PrismJS/prism/issues/3348)) [`3bd8fdb1`](https://github.com/PrismJS/prism/commit/3bd8fdb1) +* __JavaScript__ + * Added support for new regex syntax ([#3399](https://github.com/PrismJS/prism/issues/3399)) [`ca78cde6`](https://github.com/PrismJS/prism/commit/ca78cde6) +* __Keyman__ + * Added new keywords ([#3401](https://github.com/PrismJS/prism/issues/3401)) [`bac36827`](https://github.com/PrismJS/prism/commit/bac36827) +* __MEL__ + * Improved functions, code, and comments ([#3393](https://github.com/PrismJS/prism/issues/3393)) [`8e648dab`](https://github.com/PrismJS/prism/commit/8e648dab) +* __NEON__ + * Change alias of `key` to `property` ([#3394](https://github.com/PrismJS/prism/issues/3394)) [`1c533f4a`](https://github.com/PrismJS/prism/commit/1c533f4a) +* __PHP__ + * Added `never` return type + minor fix of named arguments ([#3421](https://github.com/PrismJS/prism/issues/3421)) [`4ffab525`](https://github.com/PrismJS/prism/commit/4ffab525) + * Added `readonly` keyword ([#3349](https://github.com/PrismJS/prism/issues/3349)) [`4c3f1969`](https://github.com/PrismJS/prism/commit/4c3f1969) +* __PureBasic__ + * Added support for pointer to string operator ([#3362](https://github.com/PrismJS/prism/issues/3362)) [`499b1fa0`](https://github.com/PrismJS/prism/commit/499b1fa0) +* __Razor C#__ + * Added support for `@helper` and inline C# inside attribute values ([#3355](https://github.com/PrismJS/prism/issues/3355)) [`31a38d0c`](https://github.com/PrismJS/prism/commit/31a38d0c) +* __VHDL__ + * Add `private`, `view` keywords; Distinguish `attribute` from `keyword` ([#3389](https://github.com/PrismJS/prism/issues/3389)) [`d1a5ce30`](https://github.com/PrismJS/prism/commit/d1a5ce30) +* __Wolfram language__ + * Simplified `operator` regex ([#3397](https://github.com/PrismJS/prism/issues/3397)) [`10ae6da3`](https://github.com/PrismJS/prism/commit/10ae6da3) + +### Updated plugins + +* __Autolinker__ + * Fixed URL regex to match more valid URLs ([#3358](https://github.com/PrismJS/prism/issues/3358)) [`17ed9160`](https://github.com/PrismJS/prism/commit/17ed9160) +* __Command Line__ + * Add support for command continuation prefix ([#3344](https://github.com/PrismJS/prism/issues/3344)) [`b53832cd`](https://github.com/PrismJS/prism/commit/b53832cd) + * Increased prompt opacity ([#3352](https://github.com/PrismJS/prism/issues/3352)) [`f95dd190`](https://github.com/PrismJS/prism/commit/f95dd190) +* __Keep Markup__ + * Use original nodes instead of clones ([#3365](https://github.com/PrismJS/prism/issues/3365)) [`8a843a17`](https://github.com/PrismJS/prism/commit/8a843a17) + +### Other + +* __Infrastructure__ + * Use terser ([#3407](https://github.com/PrismJS/prism/issues/3407)) [`11c54624`](https://github.com/PrismJS/prism/commit/11c54624) + * Tests: Cache results for exp backtracking check ([#3356](https://github.com/PrismJS/prism/issues/3356)) [`ead22e1e`](https://github.com/PrismJS/prism/commit/ead22e1e) +* __Website__ + * More documentation for language definitons ([#3427](https://github.com/PrismJS/prism/issues/3427)) [`333bd590`](https://github.com/PrismJS/prism/commit/333bd590) + ## 1.27.0 (2022-02-17) ### New components -* __UO Razor Script__ (#3309) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0) +* __UO Razor Script__ ([#3309](https://github.com/PrismJS/prism/issues/3309)) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0) ### Updated components * __AutoIt__ - * Allow hyphen in directive (#3308) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8) + * Allow hyphen in directive ([#3308](https://github.com/PrismJS/prism/issues/3308)) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8) * __EditorConfig__ - * Change alias of `section` from `keyword` to `selector` (#3305) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9) + * Change alias of `section` from `keyword` to `selector` ([#3305](https://github.com/PrismJS/prism/issues/3305)) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9) * __Ini__ - * Swap out `header` for `section` (#3304) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f) + * Swap out `header` for `section` ([#3304](https://github.com/PrismJS/prism/issues/3304)) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f) * __MongoDB__ - * Added v5 support (#3297) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f) + * Added v5 support ([#3297](https://github.com/PrismJS/prism/issues/3297)) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f) * __PureBasic__ - * Added missing keyword and fixed constants ending with `$` (#3320) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726) + * Added missing keyword and fixed constants ending with `$` ([#3320](https://github.com/PrismJS/prism/issues/3320)) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726) * __Scala__ - * Added support for interpolated strings (#3293) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422) + * Added support for interpolated strings ([#3293](https://github.com/PrismJS/prism/issues/3293)) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422) * __Systemd configuration file__ - * Swap out `operator` for `punctuation` (#3306) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15) + * Swap out `operator` for `punctuation` ([#3306](https://github.com/PrismJS/prism/issues/3306)) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15) ### Updated plugins * __Command Line__ - * Escape markup in command line output (#3341) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c) - * Add support for line continuation and improved colors (#3326) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175) - * Added span around command and output (#3312) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15) + * Escape markup in command line output ([#3341](https://github.com/PrismJS/prism/issues/3341)) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c) + * Add support for line continuation and improved colors ([#3326](https://github.com/PrismJS/prism/issues/3326)) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175) + * Added span around command and output ([#3312](https://github.com/PrismJS/prism/issues/3312)) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15) ### Other * __Core__ - * Added better error message for missing grammars (#3311) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b) + * Added better error message for missing grammars ([#3311](https://github.com/PrismJS/prism/issues/3311)) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b) ## 1.26.0 (2022-01-06) diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js index 6d3c1562e0..d58ff9037b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js @@ -1,2 +1,2 @@ -var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","alias":"ino","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"asmatmel":{"title":"Atmel AVR Assembly","owner":"cerkit"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"go-module":{"title":"Go module","alias":"go-mod","owner":"RunDevelopment"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":"hbs","owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","optional":"regex","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["csp","css","hpkp","hsts","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keepalived":{"title":"Keepalived Configure","owner":"dev-itsheng"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"kusto":{"title":"Kusto","owner":"RunDevelopment"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"matlab":{"title":"MATLAB","owner":"Golmote"},"maxscript":{"title":"MAXScript","owner":"RunDevelopment"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"cshtml":{"title":"Razor C#","alias":"razor","require":["markup","csharp"],"optional":["css","css-extras","javascript","js-extras"],"owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","optional":"php","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"tremor":{"title":"Tremor","alias":["trickle","troy"],"owner":"darach","aliasTitles":{"trickle":"trickle","troy":"troy"}},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup-templating","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uorazor":{"title":"UO Razor Script","owner":"jaseowns"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"web-idl":{"title":"Web IDL","alias":"webidl","owner":"RunDevelopment"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"wren":{"title":"Wren","owner":"clsource"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to WebPlatform.org documentation. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}}; +var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","alias":"ino","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"armasm":{"title":"ARM Assembly","alias":"arm-asm","owner":"RunDevelopment"},"arturo":{"title":"Arturo","alias":"art","optional":["bash","css","javascript","markup","markdown","sql"],"owner":"drkameleon"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"asmatmel":{"title":"Atmel AVR Assembly","owner":"cerkit"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"awk":{"title":"AWK","alias":"gawk","aliasTitles":{"gawk":"GAWK"},"owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"cooklang":{"title":"Cooklang","owner":"ahue"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cue":{"title":"CUE","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gettext":{"title":"gettext","alias":"po","owner":"RunDevelopment"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"linker-script":{"title":"GNU Linker Script","alias":"ld","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"go-module":{"title":"Go module","alias":"go-mod","owner":"RunDevelopment"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":["hbs","mustache"],"aliasTitles":{"mustache":"Mustache"},"owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","optional":"regex","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["csp","css","hpkp","hsts","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keepalived":{"title":"Keepalived Configure","owner":"dev-itsheng"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"kusto":{"title":"Kusto","owner":"RunDevelopment"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"mata":{"title":"Mata","owner":"RunDevelopment"},"matlab":{"title":"MATLAB","owner":"Golmote"},"maxscript":{"title":"MAXScript","owner":"RunDevelopment"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"odin":{"title":"Odin","owner":"edukisto"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plant-uml":{"title":"PlantUML","alias":"plantuml","owner":"RunDevelopment"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"cshtml":{"title":"Razor C#","alias":"razor","require":["markup","csharp"],"optional":["css","css-extras","javascript","js-extras"],"owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rescript":{"title":"ReScript","alias":"res","owner":"vmarcosp"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","optional":"php","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"stata":{"title":"Stata Ado","require":["mata","java","python"],"owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"supercollider":{"title":"SuperCollider","alias":"sclang","owner":"RunDevelopment"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"tremor":{"title":"Tremor","alias":["trickle","troy"],"owner":"darach","aliasTitles":{"trickle":"trickle","troy":"troy"}},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup-templating","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uorazor":{"title":"UO Razor Script","owner":"jaseowns"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"web-idl":{"title":"Web IDL","alias":"webidl","owner":"RunDevelopment"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"wren":{"title":"Wren","owner":"clsource"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to WebPlatform.org documentation. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}}; if (typeof module !== 'undefined' && module.exports) { module.exports = components; } \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json index 903e4cfbc1..9c58e568ba 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json @@ -139,6 +139,24 @@ "title": "ARFF", "owner": "Golmote" }, + "armasm": { + "title": "ARM Assembly", + "alias": "arm-asm", + "owner": "RunDevelopment" + }, + "arturo": { + "title": "Arturo", + "alias": "art", + "optional": [ + "bash", + "css", + "javascript", + "markup", + "markdown", + "sql" + ], + "owner": "drkameleon" + }, "asciidoc": { "alias": "adoc", "title": "AsciiDoc", @@ -175,6 +193,14 @@ "alias": "avdl", "owner": "RunDevelopment" }, + "awk": { + "title": "AWK", + "alias": "gawk", + "aliasTitles": { + "gawk": "GAWK" + }, + "owner": "RunDevelopment" + }, "bash": { "title": "Bash", "alias": "shell", @@ -299,6 +325,10 @@ "title": "Content-Security-Policy", "owner": "ScottHelme" }, + "cooklang": { + "title": "Cooklang", + "owner": "ahue" + }, "coq": { "title": "Coq", "owner": "RunDevelopment" @@ -318,6 +348,10 @@ "title": "CSV", "owner": "RunDevelopment" }, + "cue": { + "title": "CUE", + "owner": "RunDevelopment" + }, "cypher": { "title": "Cypher", "owner": "RunDevelopment" @@ -472,6 +506,11 @@ "title": "GEDCOM", "owner": "Golmote" }, + "gettext": { + "title": "gettext", + "alias": "po", + "owner": "RunDevelopment" + }, "gherkin": { "title": "Gherkin", "owner": "hason" @@ -490,6 +529,11 @@ "alias": "gni", "owner": "RunDevelopment" }, + "linker-script": { + "title": "GNU Linker Script", + "alias": "ld", + "owner": "RunDevelopment" + }, "go": { "title": "Go", "require": "clike", @@ -529,7 +573,10 @@ "handlebars": { "title": "Handlebars", "require": "markup-templating", - "alias": "hbs", + "alias": ["hbs", "mustache"], + "aliasTitles": { + "mustache": "Mustache" + }, "owner": "Golmote" }, "haskell": { @@ -830,6 +877,10 @@ "require": "markup", "owner": "Golmote" }, + "mata": { + "title": "Mata", + "owner": "RunDevelopment" + }, "matlab": { "title": "MATLAB", "owner": "Golmote" @@ -922,6 +973,10 @@ "title": "OCaml", "owner": "Golmote" }, + "odin": { + "title": "Odin", + "owner": "edukisto" + }, "opencl": { "title": "OpenCL", "require": "c", @@ -996,6 +1051,11 @@ "modify": "php", "owner": "milesj" }, + "plant-uml": { + "title": "PlantUML", + "alias": "plantuml", + "owner": "RunDevelopment" + }, "plsql": { "title": "PL/SQL", "require": "sql", @@ -1152,6 +1212,11 @@ "alias": "rpy", "owner": "HyuchiaDiego" }, + "rescript": { + "title": "ReScript", + "alias": "res", + "owner": "vmarcosp" + }, "rest": { "title": "reST (reStructuredText)", "owner": "Golmote" @@ -1277,6 +1342,11 @@ "title": "Stan", "owner": "RunDevelopment" }, + "stata": { + "title": "Stata Ado", + "require": ["mata", "java", "python"], + "owner": "RunDevelopment" + }, "iecst": { "title": "Structured Text (IEC 61131-3)", "owner": "serhioromano" @@ -1285,6 +1355,11 @@ "title": "Stylus", "owner": "vkbansal" }, + "supercollider": { + "title": "SuperCollider", + "alias": "sclang", + "owner": "RunDevelopment" + }, "swift": { "title": "Swift", "owner": "chrischares" diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js index ba7c4acbbe..f086acd788 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js @@ -16,7 +16,7 @@ Prism.languages.abap = { alias: 'comment' }, 'keyword': { - pattern: /(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i, + pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i, lookbehind: true }, /* Numbers can be only integers. Decimal or Hex appear only as strings */ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js index dd3bf65eea..d803a51ba0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js @@ -1 +1 @@ -Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; \ No newline at end of file +Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js index bc021e1f49..a57731024c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js @@ -1 +1 @@ -!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";Prism.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(); \ No newline at end of file +!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js index 21226f63a2..a537f39b0a 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js @@ -9,8 +9,11 @@ Prism.languages.ada = { pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i } ], - 'attr-name': /\b'\w+/, - 'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i, + 'attribute': { + pattern: /\b'\w+/, + alias: 'attr-name' + }, + 'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i, 'boolean': /\b(?:false|true)\b/i, 'operator': /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/, 'punctuation': /\.\.?|[,;():]/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js index f58b0ea9f3..57de170363 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js @@ -1 +1 @@ -Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; \ No newline at end of file +Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js index a31d259c3a..62f8d1ca23 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js @@ -1 +1 @@ -Prism.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}; \ No newline at end of file +!function(t){t.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js index ba2cdfabea..3cb0f96bec 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,function(){return t.source});function i(e){return RegExp(e.replace(//g,function(){return n}),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); \ No newline at end of file +!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,(function(){return t.source}));function i(e){return RegExp(e.replace(//g,(function(){return n})),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js new file mode 100644 index 0000000000..07e93221d4 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js @@ -0,0 +1,49 @@ +Prism.languages.armasm = { + 'comment': { + pattern: /;.*/, + greedy: true + }, + 'string': { + pattern: /"(?:[^"\r\n]|"")*"/, + greedy: true, + inside: { + 'variable': { + pattern: /((?:^|[^$])(?:\${2})*)\$\w+/, + lookbehind: true + } + } + }, + 'char': { + pattern: /'(?:[^'\r\n]{0,4}|'')'/, + greedy: true + }, + 'version-symbol': { + pattern: /\|[\w@]+\|/, + greedy: true, + alias: 'property' + }, + + 'boolean': /\b(?:FALSE|TRUE)\b/, + 'directive': { + pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/, + alias: 'property' + }, + 'instruction': { + pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/, + lookbehind: true, + alias: 'keyword' + }, + 'variable': /\$\w+/, + + 'number': /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i, + + 'register': { + pattern: /\b(?:r\d|lr)\b/, + alias: 'symbol' + }, + + 'operator': /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/, + 'punctuation': /[()[\],]/ +}; + +Prism.languages['arm-asm'] = Prism.languages.armasm; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js new file mode 100644 index 0000000000..620549bd32 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js @@ -0,0 +1 @@ +Prism.languages.armasm={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"/,greedy:!0,inside:{variable:{pattern:/((?:^|[^$])(?:\${2})*)\$\w+/,lookbehind:!0}}},char:{pattern:/'(?:[^'\r\n]{0,4}|'')'/,greedy:!0},"version-symbol":{pattern:/\|[\w@]+\|/,greedy:!0,alias:"property"},boolean:/\b(?:FALSE|TRUE)\b/,directive:{pattern:/\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,alias:"property"},instruction:{pattern:/((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,lookbehind:!0,alias:"keyword"},variable:/\$\w+/,number:/(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,register:{pattern:/\b(?:r\d|lr)\b/,alias:"symbol"},operator:/<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,punctuation:/[()[\],]/},Prism.languages["arm-asm"]=Prism.languages.armasm; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js new file mode 100644 index 0000000000..d09b5e27ef --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js @@ -0,0 +1,105 @@ +(function (Prism) { + /** + * @param {string} lang + * @param {string} pattern + */ + var createLanguageString = function (lang, pattern) { + return { + pattern: RegExp(/\{!/.source + '(?:' + (pattern || lang) + ')' + /$[\s\S]*\}/.source, 'm'), + greedy: true, + inside: { + 'embedded': { + pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/, + lookbehind: true, + alias: 'language-' + lang, + inside: Prism.languages[lang] + }, + 'string': /[\s\S]+/ + } + }; + }; + + Prism.languages.arturo = { + 'comment': { + pattern: /;.*/, + greedy: true + }, + + 'character': { + pattern: /`.`/, + alias: 'char', + greedy: true + }, + + 'number': { + pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/, + }, + + 'string': { + pattern: /"(?:[^"\\\r\n]|\\.)*"/, + greedy: true + }, + + 'regex': { + pattern: /\{\/.*?\/\}/, + greedy: true + }, + + 'html-string': createLanguageString('html'), + 'css-string': createLanguageString('css'), + 'js-string': createLanguageString('js'), + 'md-string': createLanguageString('md'), + 'sql-string': createLanguageString('sql'), + 'sh-string': createLanguageString('shell', 'sh'), + + 'multistring': { + pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m, + alias: 'string', + greedy: true + }, + + 'label': { + pattern: /\w+\b\??:/, + alias: 'property' + }, + + 'literal': { + pattern: /'(?:\w+\b\??:?)/, + alias: 'constant' + }, + + 'type': { + pattern: /:(?:\w+\b\??:?)/, + alias: 'class-name' + }, + + 'color': /#\w+/, + + 'predicate': { + pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/, + alias: 'keyword' + }, + + 'builtin-function': { + pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/, + alias: 'keyword' + }, + + 'sugar': { + pattern: /->|=>|\||::/, + alias: 'operator' + }, + + 'punctuation': /[()[\],]/, + + 'symbol': { + pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/ + }, + + 'boolean': { + pattern: /\b(?:false|maybe|true)\b/ + } + }; + + Prism.languages.art = Prism.languages['arturo']; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js new file mode 100644 index 0000000000..f17b130a17 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js @@ -0,0 +1 @@ +!function(e){var a=function(a,t){return{pattern:RegExp("\\{!(?:"+(t||a)+")$[^]*\\}","m"),greedy:!0,inside:{embedded:{pattern:/(^\{!\w+\b)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-"+a,inside:e.languages[a]},string:/[\s\S]+/}}};e.languages.arturo={comment:{pattern:/;.*/,greedy:!0},character:{pattern:/`.`/,alias:"char",greedy:!0},number:{pattern:/\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/},string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},regex:{pattern:/\{\/.*?\/\}/,greedy:!0},"html-string":a("html"),"css-string":a("css"),"js-string":a("js"),"md-string":a("md"),"sql-string":a("sql"),"sh-string":a("shell","sh"),multistring:{pattern:/».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,alias:"string",greedy:!0},label:{pattern:/\w+\b\??:/,alias:"property"},literal:{pattern:/'(?:\w+\b\??:?)/,alias:"constant"},type:{pattern:/:(?:\w+\b\??:?)/,alias:"class-name"},color:/#\w+/,predicate:{pattern:/\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,alias:"keyword"},"builtin-function":{pattern:/\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,alias:"keyword"},sugar:{pattern:/->|=>|\||::/,alias:"operator"},punctuation:/[()[\],]/,symbol:{pattern:/<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/},boolean:{pattern:/\b(?:false|maybe|true)\b/}},e.languages.art=e.languages.arturo}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js index ed45a7a251..e1badd1aac 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js @@ -1 +1 @@ -!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function i(t){for(var n={},i=0,e=(t=t.split(" ")).length;i](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/, + 'operator': />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/, 'punctuation': /[(),:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js index 6e6f8c6912..8c021f9ead 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js @@ -1 +1 @@ -Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/,punctuation:/[(),:]/}; \ No newline at end of file +Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,punctuation:/[(),:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js index dbd0751c94..eb68d154d2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js @@ -22,7 +22,10 @@ Prism.languages.autohotkey = { 'operator': /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/, 'boolean': /\b(?:false|true)\b/, - 'selector': /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i, + 'command': { + pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i, + alias: 'selector' + }, 'constant': /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i, @@ -30,7 +33,10 @@ Prism.languages.autohotkey = { 'symbol': /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i, - 'important': /#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i, + 'directive': { + pattern: /#[a-z]+\b/i, + alias: 'important' + }, 'keyword': /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i, 'function': /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js index d7e1894410..79e06a1a4f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js @@ -1 +1 @@ -Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; \ No newline at end of file +Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js index 14a8b68e99..851807cf74 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js @@ -1 +1 @@ -!function(e){function a(e,a,r){return RegExp(function(e,r){return e.replace(/<<(\d+)>>/g,function(e,a){return r[+a]})}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); \ No newline at end of file +!function(e){function a(e,a,r){return RegExp(function(e,a){return e.replace(/<<(\d+)>>/g,(function(e,r){return a[+r]}))}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js new file mode 100644 index 0000000000..64cf2c0400 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js @@ -0,0 +1,32 @@ +Prism.languages.awk = { + 'hashbang': { + pattern: /^#!.*/, + greedy: true, + alias: 'comment' + }, + 'comment': { + pattern: /#.*/, + greedy: true + }, + 'string': { + pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/, + lookbehind: true, + greedy: true + }, + 'regex': { + pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//, + lookbehind: true, + greedy: true + }, + + 'variable': /\$\w+/, + 'keyword': /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/, + + 'function': /\b[a-z_]\w*(?=\s*\()/i, + 'number': /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/, + + 'operator': /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/, + 'punctuation': /[()[\]{},;]/ +}; + +Prism.languages.gawk = Prism.languages.awk; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js new file mode 100644 index 0000000000..c48925cdf3 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js @@ -0,0 +1 @@ +Prism.languages.awk={hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},regex:{pattern:/((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,lookbehind:!0,greedy:!0},variable:/\$\w+/,keyword:/\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,operator:/--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,punctuation:/[()[\]{},;]/},Prism.languages.gawk=Prism.languages.awk; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js index f49a688dc4..886f10c7a2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js @@ -1 +1 @@ -!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;Prism.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(); \ No newline at end of file +!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js index e9fd550ec3..7f0cd97437 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js @@ -19,7 +19,7 @@ Prism.languages.cfscript = Prism.languages.extend('clike', { ], 'keyword': /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/, 'operator': [ - /\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/, + /\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/, /\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/ ], 'scope': { diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js index fcd8b79c7b..49dc2d0fef 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js @@ -1 +1 @@ -Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; \ No newline at end of file +Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js index 464705bba7..4b71c84766 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js @@ -13,8 +13,8 @@ Prism.languages.cmake = { } } }, - 'variable': /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/, - 'property': /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/, + 'variable': /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/, + 'property': /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/, 'keyword': /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/, 'boolean': /\b(?:FALSE|OFF|ON|TRUE)\b/, 'namespace': /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js index 8455f5ccbf..a223df57be 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js @@ -1 +1 @@ -Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; \ No newline at end of file +Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js new file mode 100644 index 0000000000..cb49ed1260 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js @@ -0,0 +1,146 @@ +(function (Prism) { + + // see https://github.com/cooklang/spec/blob/main/EBNF.md + + var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source; + var multi_token_infix = /[^{}@#]+/.source; + var multi_token_suffix = /\{[^}#@]*\}/.source; + + var multi_token = multi_token_infix + multi_token_suffix; + + var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source; + + var amount_group_impl = { + pattern: /\{[^{}]*\}/, + inside: { + 'amount': { + pattern: /([\{|])[^{}|*%]+/, + lookbehind: true, + alias: 'number', + }, + 'unit': { + pattern: /(%)[^}]+/, + lookbehind: true, + alias: 'symbol', + }, + 'servings-scaler': { + pattern: /\*/, + alias: 'operator', + }, + 'servings-alternative-separator': { + pattern: /\|/, + alias: 'operator', + }, + 'unit-separator': { + pattern: /(?:%|(\*)%)/, + lookbehind: true, + alias: 'operator', + }, + 'punctuation': /[{}]/, + } + }; + + + Prism.languages.cooklang = { + 'comment': { + // [- comment -] + // -- comment + pattern: /\[-[\s\S]*?-\]|--.*/, + greedy: true, + }, + 'meta': { // >> key: value + pattern: />>.*:.*/, + inside: { + 'property': { // key: + pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/, + lookbehind: true, + } + } + }, + 'cookware-group': { // #...{...}, #... + pattern: new RegExp('#(?:' + + multi_token + + '|' + + single_token_suffix + + ')' + ), + inside: { + 'cookware': { + pattern: new RegExp('(^#)(?:' + + multi_token_infix + + ')' + ), + lookbehind: true, + alias: 'variable', + }, + 'cookware-keyword': { + pattern: /^#/, + alias: 'keyword', + }, + 'quantity-group': { + pattern: new RegExp(/\{[^{}@#]*\}/), + inside: { + 'quantity': { + pattern: new RegExp(/(^\{)/.source + multi_token_infix), + lookbehind: true, + alias: 'number', + }, + 'punctuation': /[{}]/, + } + } + }, + }, + 'ingredient-group': { // @...{...}, @... + pattern: new RegExp('@(?:' + + multi_token + + '|' + + single_token_suffix + + ')'), + inside: { + 'ingredient': { + pattern: new RegExp('(^@)(?:' + + multi_token_infix + + ')'), + lookbehind: true, + alias: 'variable', + }, + 'ingredient-keyword': { + pattern: /^@/, + alias: 'keyword', + }, + 'amount-group': amount_group_impl, + } + }, + 'timer-group': { // ~timer{...} + // eslint-disable-next-line regexp/sort-alternatives + pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/, + inside: { + 'timer': { + pattern: /(^~)[^{]+/, + lookbehind: true, + alias: 'variable', + }, + 'duration-group': { // {...} + pattern: /\{[^{}]*\}/, + inside: { + 'punctuation': /[{}]/, + 'unit': { + pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source), + lookbehind: true, + alias: 'symbol', + }, + 'operator': /%/, + 'duration': { + pattern: /\d+/, + alias: 'number', + }, + } + }, + 'timer-keyword': { + pattern: /^~/, + alias: 'keyword', + }, + } + } + }; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js new file mode 100644 index 0000000000..126fd8bfb1 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js @@ -0,0 +1 @@ +!function(e){var a="(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+",t="[^{}@#]+\\{[^}#@]*\\}";e.languages.cooklang={comment:{pattern:/\[-[\s\S]*?-\]|--.*/,greedy:!0},meta:{pattern:/>>.*:.*/,inside:{property:{pattern:/(>>\s*)[^\s:](?:[^:]*[^\s:])?/,lookbehind:!0}}},"cookware-group":{pattern:new RegExp("#(?:"+t+"|"+a+")"),inside:{cookware:{pattern:new RegExp("(^#)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"cookware-keyword":{pattern:/^#/,alias:"keyword"},"quantity-group":{pattern:new RegExp(/\{[^{}@#]*\}/),inside:{quantity:{pattern:new RegExp("(^\\{)[^{}@#]+"),lookbehind:!0,alias:"number"},punctuation:/[{}]/}}}},"ingredient-group":{pattern:new RegExp("@(?:"+t+"|"+a+")"),inside:{ingredient:{pattern:new RegExp("(^@)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"ingredient-keyword":{pattern:/^@/,alias:"keyword"},"amount-group":{pattern:/\{[^{}]*\}/,inside:{amount:{pattern:/([\{|])[^{}|*%]+/,lookbehind:!0,alias:"number"},unit:{pattern:/(%)[^}]+/,lookbehind:!0,alias:"symbol"},"servings-scaler":{pattern:/\*/,alias:"operator"},"servings-alternative-separator":{pattern:/\|/,alias:"operator"},"unit-separator":{pattern:/(?:%|(\*)%)/,lookbehind:!0,alias:"operator"},punctuation:/[{}]/}}}},"timer-group":{pattern:/~(?!\s)[^@#~{}]*\{[^{}]*\}/,inside:{timer:{pattern:/(^~)[^{]+/,lookbehind:!0,alias:"variable"},"duration-group":{pattern:/\{[^{}]*\}/,inside:{punctuation:/[{}]/,unit:{pattern:new RegExp("(%\\s*)(?:h|hours|hrs|m|min|minutes)\\b"),lookbehind:!0,alias:"symbol"},operator:/%/,duration:{pattern:/\d+/,alias:"number"}}},"timer-keyword":{pattern:/^~/,alias:"keyword"}}}}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js index 8b297f5f07..c14f0027ab 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js @@ -1 +1 @@ -!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,function(){return t});t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,function(){return t})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); \ No newline at end of file +!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,(function(){return t}))),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js index eedbcf6e25..2e3ac2eefe 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js @@ -1 +1 @@ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,E=y;for(E+=m.value.length;E<=w;)m=m.next,E+=m.value.length;if(E-=m.value.length,y=E,m.value instanceof W)continue;for(var P=m;P!==t.tail&&(El.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),T(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function T(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js index 128911e6f3..a7df36a603 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); \ No newline at end of file +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js index bd9e804084..45bb0da898 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js @@ -1 +1 @@ -!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",z=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var S=":[^}\r\n]+",j=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),A=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[j,S]),F=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),P=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,S]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,S]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[A]),lookbehind:!0,greedy:!0,inside:U(A,j)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[P]),lookbehind:!0,greedy:!0,inside:U(P,F)}],char:{pattern:RegExp(x),greedy:!0}}),s.languages.dotnet=s.languages.cs=s.languages.csharp}(Prism); \ No newline at end of file +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js index a917626aa0..4643710d3d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js @@ -28,9 +28,15 @@ } var round = nested(/\((?:[^()'"@/]|||)*\)/.source, 2); - var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 2); + var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 1); var curly = nested(/\{(?:[^{}'"@/]|||)*\}/.source, 2); - var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 2); + var angle = nested(/<(?:[^<>'"@/]||)*>/.source, 1); + + var inlineCs = /@/.source + + /(?:await\b\s*)?/.source + + '(?:' + /(?!await\b)\w+\b/.source + '|' + round + ')' + + '(?:' + /[?!]?\.\w+\b/.source + '|' + '(?:' + angle + ')?' + round + '|' + square + ')*' + + /(?![?!\.(\[]|<(?!\/))/.source; // Note about the above bracket patterns: // They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and @@ -44,7 +50,14 @@ // To somewhat alleviate the problem a bit, the patterns for characters (e.g. 'a') is very permissive, it also // allows invalid characters to support HTML expressions like this:

    That's it!

    . - var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source; + var tagAttrInlineCs = /@(?![\w()])/.source + '|' + inlineCs; + var tagAttrValue = '(?:' + + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + + '|' + + '["\'][^"\'@]*(?:(?:' + tagAttrInlineCs + ')[^"\'@]*)+["\']' + + ')'; + + var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*|(?=[\s/>])))+)?/.source.replace(//, tagAttrValue); var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source; var tagRegion = /\B@?/.source + @@ -110,6 +123,21 @@ inside: csharpWithHtml }; + var inlineValue = { + pattern: RegExp(/(^|[^@])/.source + inlineCs), + lookbehind: true, + greedy: true, + alias: 'variable', + inside: { + 'keyword': /^@/, + 'csharp': cs + } + }; + + Prism.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent); + Prism.languages.cshtml.tag.inside['attr-value'].pattern = RegExp(/=\s*/.source + tagAttrValue); + Prism.languages.insertBefore('inside', 'punctuation', { 'value': inlineValue }, Prism.languages.cshtml.tag.inside['attr-value']); + Prism.languages.insertBefore('cshtml', 'prolog', { 'razor-comment': { pattern: /@\*[\s\S]*?\*@/, @@ -134,6 +162,8 @@ /try\s*/.source + curly + /\s*catch\s*/.source + round + /\s*/.source + curly + /\s*finally\s*/.source + curly, // @if (...) {...} else if (...) {...} else {...} /if\s*/.source + round + /\s*/.source + curly + '(?:' + /\s*else/.source + '(?:' + /\s+if\s*/.source + round + ')?' + /\s*/.source + curly + ')*', + // @helper Ident(params) { ... } + /helper\s+\w+\s*/.source + round + /\s*/.source + curly, ].join('|') + ')' ), @@ -155,21 +185,7 @@ } }, - 'value': { - pattern: RegExp( - /(^|[^@])@/.source + - /(?:await\b\s*)?/.source + - '(?:' + /\w+\b/.source + '|' + round + ')' + - '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*' - ), - lookbehind: true, - greedy: true, - alias: 'variable', - inside: { - 'keyword': /^@/, - 'csharp': cs - } - }, + 'value': inlineValue, 'delegate-operator': { pattern: /(^|[^@])@(?=<)/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js index 537152a87f..bc2e9b809c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),r=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),t=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n=s("<(?:[^<>'\"@/]|||)*>",2),l="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?",i="(?!\\d)[^\\s>/=$<%]+"+l+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+l+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+i+")";e.languages.cshtml=e.languages.extend("markup",{});var g={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})};e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[t,"(?:code|functions)\\s*"+t,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+t,"do\\s*"+t+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+t+"\\s*catch\\s*"+a+"\\s*"+t+"\\s*finally\\s*"+t,"if\\s*"+a+"\\s*"+t+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+t+")*"].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:g}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:g}},value:{pattern:RegExp("(^|[^@])@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+r+"|"+n+a+")*"),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:g}},"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism); \ No newline at end of file +!function(e){function s(e,s){for(var a=0;a/g,(function(){return"(?:"+e+")"}));return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|\'(?:(?:[^\r\n\'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})\'|(?=[^\\\\](?!\'))))').replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:@(?![\\w()])|"+n+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp(")*"""/.source + + // eslint-disable-next-line regexp/strict + '|' + /'''(?:[^\\']|'(?!''\2)|)*'''/.source + + // eslint-disable-next-line regexp/strict + '|' + /"(?:[^\\\r\n"]|"(?!\2)|)*"/.source + + // eslint-disable-next-line regexp/strict + '|' + /'(?:[^\\\r\n']|'(?!\2)|)*'/.source; + var stringLiteral = '(?:' + stringTypes.replace(//g, stringEscape) + ')'; + + Prism.languages.cue = { + 'comment': { + pattern: /\/\/.*/, + greedy: true + }, + 'string-literal': { + // eslint-disable-next-line regexp/strict + pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source), + lookbehind: true, + greedy: true, + inside: { + // I'm using dirty hack here. We have to know the number hashes at the start of the string somehow, + // but we can't look back. So instead, we will use a lookahead, go to the end of the string, and + // capture the hashes at the end of the string. + 'escape': { + pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/, + greedy: true, + alias: 'string' + }, + 'interpolation': { + pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/, + greedy: true, + inside: { + 'punctuation': /^\\#*\(|\)$/, + 'expression': { + pattern: /[\s\S]+/, + inside: null + } + } + }, + 'string': /[\s\S]+/ + } + }, + + 'keyword': { + pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/, + lookbehind: true + }, + 'boolean': { + pattern: /(^|[^\w$])(?:false|true)(?![\w$])/, + lookbehind: true + }, + 'builtin': { + pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/, + lookbehind: true + }, + + 'attribute': { + pattern: /@[\w$]+(?=\s*\()/, + alias: 'function' + }, + 'function': { + pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i, + lookbehind: true + }, + + 'number': { + pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/, + lookbehind: true + }, + + 'operator': /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/, + 'punctuation': /[()[\]{},.:]/ + }; + + Prism.languages.cue['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.cue; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js new file mode 100644 index 0000000000..e88bcf519c --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:"+"\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|)*\"\"\"|'''(?:[^\\\\']|'(?!''\\2)|)*'''|\"(?:[^\\\\\r\n\"]|\"(?!\\2)|)*\"|'(?:[^\\\\\r\n']|'(?!\\2)|)*'".replace(//g,"\\\\(?:(?!\\2)|\\2(?:[^()\r\n]|\\([^()]*\\)))")+")";e.languages.cue={comment:{pattern:/\/\/.*/,greedy:!0},"string-literal":{pattern:RegExp("(^|[^#\"'\\\\])(#*)"+n+"(?![\"'])\\2"),lookbehind:!0,greedy:!0,inside:{escape:{pattern:/(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,greedy:!0,alias:"string"},interpolation:{pattern:/(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,greedy:!0,inside:{punctuation:/^\\#*\(|\)$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:{pattern:/(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,lookbehind:!0},boolean:{pattern:/(^|[^\w$])(?:false|true)(?![\w$])/,lookbehind:!0},builtin:{pattern:/(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,lookbehind:!0},attribute:{pattern:/@[\w$]+(?=\s*\()/,alias:"function"},function:{pattern:/(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,lookbehind:!0},number:{pattern:/(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,lookbehind:!0},operator:/\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,punctuation:/[()[\]{},.:]/},e.languages.cue["string-literal"].inside.interpolation.inside.expression.inside=e.languages.cue}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js index ef2b7f9b76..98c8d86867 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js @@ -1 +1 @@ -Prism.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}; \ No newline at end of file +!function(e){e.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js index 099e998172..16d9fe0a03 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js @@ -1 +1 @@ -!function(i){i.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(e){var n=r[e],a=[];/^\w+$/.test(e)||a.push(/\w+/.exec(e)[0]),"diff"===e&&a.push("bold"),i.languages.diff[e]={pattern:RegExp("^(?:["+n+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(e)[0]}}}}),Object.defineProperty(i.languages.diff,"PREFIXES",{value:r})}(Prism); \ No newline at end of file +!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js index 91bbaa7fc3..24879e50d5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js @@ -1 +1 @@ -!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"django",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"django")}),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"jinja2",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"jinja2")})}(Prism); \ No newline at end of file +!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js index 3d23e8a719..dd5622a1c4 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js @@ -1 +1 @@ -!function(e){var r="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"}),n="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,function(){return n}),o={pattern:RegExp(n),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,n){return e=e.replace(//g,function(){return t}).replace(//g,function(){return r}),RegExp(e,n)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); \ No newline at end of file +!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js index 457ed17e2c..6af79d24ec 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js @@ -1 +1 @@ -!function(e){var n="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,a){return RegExp(e.replace(//g,function(){return n}),a)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); \ No newline at end of file +!function(e){var a="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(//g,(function(){return a})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js index 1a07bdb8f1..84affeef07 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js @@ -1 +1 @@ -!function(e){e.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:e.languages.javascript}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"ejs",/<%(?!%)[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),e.languages.eta=e.languages.ejs}(Prism); \ No newline at end of file +!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js index ec0d974d78..e885b9f134 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js index 9e38fee156..4b9da608d8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js @@ -1 +1 @@ -!function(n){n.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:n.languages.ruby}},n.hooks.add("before-tokenize",function(e){n.languages["markup-templating"].buildPlaceholders(e,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"erb")})}(Prism); \ No newline at end of file +!function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js index fba6254b2c..ccb92a1f12 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js @@ -13,7 +13,7 @@ Prism.languages.erlang = { alias: 'atom' }, 'boolean': /\b(?:false|true)\b/, - 'keyword': /\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/, + 'keyword': /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/, 'number': [ /\$\\?./, /\b\d+#[a-z0-9]+/i, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js index 7d041ab6f2..806d0b16ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js @@ -1 +1 @@ -Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; \ No newline at end of file +Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js index 635bae5929..431aa61aff 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js @@ -1 +1 @@ -!function(e){e.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:e.languages.lua}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"etlua",/<%[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"etlua")})}(Prism); \ No newline at end of file +!function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js index 5b298ac0e1..b2a7e8b5b0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js @@ -39,11 +39,11 @@ Prism.languages['excel-formula'] = { }, 'function-name': { pattern: /\b[A-Z]\w*(?=\()/i, - alias: 'keyword' + alias: 'builtin' }, 'range': { pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i, - alias: 'property', + alias: 'selector', inside: { 'operator': /:/, 'cell': /\$?[A-Z]+\$?\d+/i, @@ -55,7 +55,7 @@ Prism.languages['excel-formula'] = { // Excel is case insensitive, so the string "foo1" could be either a variable or a cell. // To combat this, we match cells case insensitive, if the contain at least one "$", and case sensitive otherwise. pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/, - alias: 'property' + alias: 'selector' }, 'number': /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i, 'boolean': /\b(?:FALSE|TRUE)\b/i, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js index 1f012d96f3..bdf842f32d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js @@ -1 +1 @@ -Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; \ No newline at end of file +Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"builtin"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"selector",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"selector"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js index 58a01e35ba..37b8a6395e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js @@ -1 +1 @@ -!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach(function(e){i[e].pattern=r(a[e])});i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); \ No newline at end of file +!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach((function(e){i[e].pattern=r(a[e])})),i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js index 3565417201..bd533dcf04 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js @@ -1 +1 @@ -Prism.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); \ No newline at end of file +!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js index ce9b3b69b5..2b2a431a96 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js @@ -1 +1 @@ -!function(n){for(var i="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",e=0;e<2;e++)i=i.replace(//g,function(){return i});i=i.replace(//g,"[^\\s\\S]");var t={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,function(){return i})),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,function(){return i})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};t.string[1].inside.interpolation.inside.rest=t,n.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}}},n.hooks.add("before-tokenize",function(e){var t=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,function(){return i}),"gi");n.languages["markup-templating"].buildPlaceholders(e,"ftl",t)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"ftl")})}(Prism); \ No newline at end of file +!function(e){for(var t="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js index 7fbbc3ddc5..b3ac0d67a2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js @@ -10,11 +10,11 @@ Prism.languages.gedcom = { } } }, - 'tag': { + 'record': { // Preceded by level and optional pointer pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m, lookbehind: true, - alias: 'string' + alias: 'tag' }, 'level': { pattern: /(^[\t ]*)\d+/m, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js index 9b199672c2..c16feee9a1 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js @@ -1 +1 @@ -Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; \ No newline at end of file +Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js new file mode 100644 index 0000000000..c8cf59d948 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js @@ -0,0 +1,43 @@ +Prism.languages.gettext = { + 'comment': [ + { + pattern: /# .*/, + greedy: true, + alias: 'translator-comment' + }, + { + pattern: /#\..*/, + greedy: true, + alias: 'extracted-comment' + }, + { + pattern: /#:.*/, + greedy: true, + alias: 'reference-comment' + }, + { + pattern: /#,.*/, + greedy: true, + alias: 'flag-comment' + }, + { + pattern: /#\|.*/, + greedy: true, + alias: 'previously-untranslated-comment' + }, + { + pattern: /#.*/, + greedy: true + }, + ], + 'string': { + pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/, + lookbehind: true, + greedy: true + }, + 'keyword': /^msg(?:ctxt|id|id_plural|str)\b/m, + 'number': /\b\d+\b/, + 'punctuation': /[\[\]]/ +}; + +Prism.languages.po = Prism.languages.gettext; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js new file mode 100644 index 0000000000..f542a249c5 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js @@ -0,0 +1 @@ +Prism.languages.gettext={comment:[{pattern:/# .*/,greedy:!0,alias:"translator-comment"},{pattern:/#\..*/,greedy:!0,alias:"extracted-comment"},{pattern:/#:.*/,greedy:!0,alias:"reference-comment"},{pattern:/#,.*/,greedy:!0,alias:"flag-comment"},{pattern:/#\|.*/,greedy:!0,alias:"previously-untranslated-comment"},{pattern:/#.*/,greedy:!0}],string:{pattern:/(^|[^\\])"(?:[^"\\]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/^msg(?:ctxt|id|id_plural|str)\b/m,number:/\b\d+\b/,punctuation:/[\[\]]/},Prism.languages.po=Prism.languages.gettext; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js index 3a702b6db1..183dac72dd 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js @@ -1 +1 @@ -!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";Prism.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(); \ No newline at end of file +!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js index b60589c308..3a5133fc1b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js @@ -1 +1 @@ -Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",function(n){if("graphql"===n.language)for(var o=n.tokens.filter(function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type}),s=0;s0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/, + lookbehind: true + }, + 'punctuation': /\.+|[{}[\];(),:$]/ + }); + + Prism.languages.insertBefore('groovy', 'string', { + 'shebang': { + pattern: /#!.+/, + alias: 'comment', + greedy: true + }, + 'interpolation-string': { // TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with // simple division (see JS regex), so find a fix maybe? - pattern: /(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/, - greedy: true + pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/, + greedy: true, + inside: { + 'interpolation': interpolation, + 'string': /[\s\S]+/ + } } - ], - 'keyword': /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/, - 'number': /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i, - 'operator': { - pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/, - lookbehind: true - }, - 'punctuation': /\.+|[{}[\];(),:$]/ -}); - -Prism.languages.insertBefore('groovy', 'string', { - 'shebang': { - pattern: /#!.+/, - alias: 'comment' - } -}); - -Prism.languages.insertBefore('groovy', 'punctuation', { - 'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/ -}); - -Prism.languages.insertBefore('groovy', 'function', { - 'annotation': { - pattern: /(^|[^.])@\w+/, - lookbehind: true, - alias: 'punctuation' - } -}); + }); -// Handle string interpolation -Prism.hooks.add('wrap', function (env) { - if (env.language === 'groovy' && env.type === 'string') { - var delimiter = env.content[0]; + Prism.languages.insertBefore('groovy', 'punctuation', { + 'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/ + }); - if (delimiter != "'") { - var pattern = /([^\\])(?:\$(?:\{.*?\}|[\w.]+))/; - if (delimiter === '$') { - pattern = /([^\$])(?:\$(?:\{.*?\}|[\w.]+))/; - } - - // To prevent double HTML-encoding we have to decode env.content first - env.content = env.content.replace(/</g, '<').replace(/&/g, '&'); + Prism.languages.insertBefore('groovy', 'function', { + 'annotation': { + pattern: /(^|[^.])@\w+/, + lookbehind: true, + alias: 'punctuation' + } + }); - env.content = Prism.highlight(env.content, { - 'expression': { - pattern: pattern, - lookbehind: true, - inside: Prism.languages.groovy - } - }); + interpolation.inside.expression.inside = Prism.languages.groovy; - env.classes.push(delimiter === '/' ? 'regex' : 'gstring'); - } - } -}); +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js index fa3203b359..2242f9f61c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js @@ -1 +1 @@ -Prism.languages.groovy=Prism.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),Prism.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),Prism.hooks.add("wrap",function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;"$"===t&&(n=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),e.content=e.content.replace(/</g,"<").replace(/&/g,"&"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring")}}}); \ No newline at end of file +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js index db9c658fa5..7b81c0ca70 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js @@ -1 +1 @@ -!function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),e.languages.hbs=e.languages.handlebars}(Prism); \ No newline at end of file +!function(a){a.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js index 91df7ec8e4..94a7f07b71 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js @@ -1 +1 @@ -!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n,s,i=t.languages,p={"application/javascript":i.javascript,"application/json":i.json||i.javascript,"application/xml":i.xml,"text/xml":i.xml,"text/html":i.html,"text/css":i.css,"text/plain":i.plain},r={"application/json":!0,"application/xml":!0};for(var l in p)if(p[l]){e=e||{};var o=r[l]?(void 0,s=(n=l).replace(/^[a-z]+\//,""),"(?:"+n+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):l;e[l.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:p[l]}}e&&t.languages.insertBefore("http","header",e)}(Prism); \ No newline at end of file +!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js index 7849a573ff..412677d1ad 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js @@ -1 +1 @@ -!function(e){function s(e,t){return t<=0?"[]":e.replace(//g,function(){return s(e,t-1)})}var t=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:t,greedy:!0,inside:{escape:n}},a=s("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,function(){return t.source}),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+s("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); \ No newline at end of file +!function(e){function t(e,s){return s<=0?"[]":e.replace(//g,(function(){return t(e,s-1)}))}var s=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:s,greedy:!0,inside:{escape:n}},a=t("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,(function(){return s.source})),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+t("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js index 9fe9f695f9..9d10f2fe62 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js @@ -1,13 +1,13 @@ (function (Prism) { - var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; // full package (optional) + parent classes (optional) - var classNamePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; + var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; // based on the java naming conventions var className = { - pattern: RegExp(classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), lookbehind: true, inside: { 'namespace': { @@ -29,9 +29,16 @@ 'class-name': [ className, { - // variables and parameters + // variables, parameters, and constructor references // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) - pattern: RegExp(classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source), + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source), + lookbehind: true, + inside: className.inside + }, + { + // class names based on keyword + // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) + pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source), lookbehind: true, inside: className.inside } @@ -79,6 +86,30 @@ 'operator': /[?&|]/ } }, + 'import': [ + { + pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source), + lookbehind: true, + inside: { + 'namespace': className.inside.namespace, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } + }, + { + pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source), + lookbehind: true, + alias: 'static', + inside: { + 'namespace': className.inside.namespace, + 'static': /\b\w+$/, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } + } + ], 'namespace': { pattern: RegExp( /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js index 897da4e88c..d240e5076e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js index 5cdc8bfcb3..d7f0f13f29 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js @@ -1 +1 @@ -!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*)?|".replace(//g,function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); \ No newline at end of file +!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*)?|".replace(//g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js index 52e19ba937..429dd491ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js @@ -1 +1 @@ -!function(p){var a=p.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(a,e){"string"==typeof a&&(a=[a]),a.forEach(function(a){!function(a,e){var n="doc-comment",t=p.languages[a];if(t){var r=t[n];if(!r){var o={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};r=(t=p.languages.insertBefore(a,"comment",o))[n]}if(r instanceof RegExp&&(r=t[n]={pattern:r}),Array.isArray(r))for(var i=0,s=r.length;i|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; \ No newline at end of file +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js index e96a55f710..c9c5eeb3ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js @@ -1 +1 @@ -!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,function(){return n})),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); \ No newline at end of file +!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js index 390d8edd4f..8d8cba12f4 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js @@ -1 +1 @@ -!function(a){function e(a,e){return RegExp(a.replace(//g,function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"}),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r/g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r=v.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=v[f],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++f;var o=i.substring(0,s),p=d(y[a]),l=i.substring(s+a.length),g=[];if(o&&g.push(o),g.push(p),l){var u=[l];e(u),g.push.apply(g,u)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var c=r.content;Array.isArray(c)?e(c):e([c])}}}(n),new u.Token(i,n,"language-"+i,a)}u.languages.javascript["template-string"]=[t("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),t("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),t("svg","\\bsvg"),t("markdown","\\b(?:markdown|md)"),t("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),t("sql","\\bsql"),e].filter(Boolean);var o={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}u.hooks.add("after-tokenize",function(e){e.language in o&&!function e(t){for(var n=0,r=t.length;n=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,function(){return n})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); \ No newline at end of file +!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js index 0534a54e86..8aa6362fa3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js @@ -1 +1 @@ -!function(o){var t=o.util.clone(o.languages.javascript),e="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function n(t,n){return t=t.replace(//g,function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"}).replace(//g,function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"}).replace(//g,function(){return e}),RegExp(t,n)}e=n(e).source,o.languages.jsx=o.languages.extend("markup",t),o.languages.jsx.tag.pattern=n("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),o.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,o.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,o.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,o.languages.jsx.tag.inside.comment=t.comment,o.languages.insertBefore("inside","attr-name",{spread:{pattern:n(""),inside:o.languages.jsx}},o.languages.jsx.tag),o.languages.insertBefore("inside","special-attr",{script:{pattern:n("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:o.languages.jsx}}},o.languages.jsx.tag);var i=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(i).join(""):""},r=function(t){for(var n=[],e=0;e"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):0*\\.{3}(?:[^{}]|)*\\})";function a(t,n){return t=t.replace(//g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(//g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(//g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a(""),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js index e5eb79b5f3..8a82b4ca48 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js @@ -1 +1 @@ -Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"}),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; \ No newline at end of file +Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,(function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"})),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js index 55f76c96e9..18f6bded2e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js @@ -28,7 +28,7 @@ Prism.languages.keyman = { alias: 'keyword' }, 'structural-keyword': { - pattern: /\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i, + pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i, alias: 'keyword' }, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js index 749507f544..f24968c0a9 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js @@ -1 +1 @@ -Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; \ No newline at end of file +Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js index 5f19298508..3d86f031f0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js @@ -1 +1 @@ -!function(t){t.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:t.languages.php}};var e=t.languages.extend("markup",{});t.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:t.languages.php}}}}}},e.tag),t.hooks.add("before-tokenize",function(a){if("latte"===a.language){t.languages["markup-templating"].buildPlaceholders(a,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),a.grammar=e}}),t.hooks.add("after-tokenize",function(a){t.languages["markup-templating"].tokenizePlaceholders(a,"latte")})}(Prism); \ No newline at end of file +!function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js index 49ce96e9a4..0ca11e5b64 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js @@ -1 +1 @@ -!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,function(){return n});n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,function(){return n}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); \ No newline at end of file +!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,(function(){return n}));n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js new file mode 100644 index 0000000000..7a0b5619c3 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js @@ -0,0 +1,30 @@ +Prism.languages['linker-script'] = { + 'comment': { + pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/, + lookbehind: true, + greedy: true + }, + 'identifier': { + pattern: /"[^"\r\n]*"/, + greedy: true + }, + + 'location-counter': { + pattern: /\B\.\B/, + alias: 'important' + }, + + 'section': { + pattern: /(^|[^\w*])\.\w+\b/, + lookbehind: true, + alias: 'keyword' + }, + 'function': /\b[A-Z][A-Z_]*(?=\s*\()/, + + 'number': /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/, + + 'operator': />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/, + 'punctuation': /[(){},;]/ +}; + +Prism.languages['ld'] = Prism.languages['linker-script']; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js new file mode 100644 index 0000000000..1cf2981243 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js @@ -0,0 +1 @@ +Prism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"]; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js index a405414fac..9829caedf7 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js @@ -1 +1 @@ -Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",function(e){var i=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,function(e){var t=/^\{%-?\s*(\w+)/.exec(e);if(t){var n=t[1];if("raw"===n&&!i)return i=!0;if("endraw"===n)return!(i=!1)}return!i})}),Prism.hooks.add("after-tokenize",function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")}); \ No newline at end of file +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js index 4ee5290b13..66f74bdce3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js @@ -1 +1 @@ -!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?=\\s)",s="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",l={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp(r+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+i),lookbehind:!0},{pattern:RegExp(r+"(?:append|by|collect|concat|do|finally|for|in|return)"+i),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp(r+"def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp(r+"(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+s+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(r+"lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},o={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+s+"\\)"),inside:l},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:l},p="\\S+(?:\\s+\\S+)*",d={pattern:RegExp(r+s+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+p),inside:o},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+p),inside:o},keys:{pattern:RegExp("&key\\s+"+p+"(?:\\s+&allow-other-keys)?"),inside:o},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};l.lambda.inside.arguments=d,l.defun.inside.arguments=e.util.clone(d),l.defun.inside.arguments.inside.sublist=d,e.languages.lisp=l,e.languages.elisp=l,e.languages.emacs=l,e.languages["emacs-lisp"]=l}(Prism); \ No newline at end of file +!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js index 7e178801b5..9088cbd53c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js @@ -1 +1 @@ -Prism.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}; \ No newline at end of file +!function(a){a.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js index cc9f7b28da..2b16ba515f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js @@ -1 +1 @@ -!function(s){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";s.languages.markdown=s.languages.extend("markup",{}),s.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:s.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:s.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:s.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike","code-snippet"].forEach(function(n){e!==n&&(s.languages.markdown[e].inside.content.inside[n]=s.languages.markdown[n])})}),s.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},u=String.fromCodePoint||String.fromCharCode;s.languages.md=s.languages.markdown}(Prism); \ No newline at end of file +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js index eaf10acfa7..3a171d0431 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js @@ -1 +1 @@ -!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js index 738b2decd8..ee4b23ac66 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js @@ -1 +1 @@ -Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; \ No newline at end of file +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js new file mode 100644 index 0000000000..6a38e1728c --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js @@ -0,0 +1,50 @@ +// https://www.stata.com/manuals/m.pdf + +(function (Prism) { + + var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source; + var type = /\bvoid\b||\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*)?/.source + .replace(//g, orgType); + + Prism.languages.mata = { + 'comment': { + pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//, + greedy: true + }, + 'string': { + pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/, + greedy: true + }, + + 'class-name': { + pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/, + lookbehind: true + }, + 'type': { + pattern: RegExp(type), + alias: 'class-name', + inside: { + 'punctuation': /[()]/, + 'keyword': /\b(?:class|function|struct|void)\b/ + } + }, + 'keyword': /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/, + 'constant': /\bNULL\b/, + + 'number': { + pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i, + lookbehind: true + }, + 'missing': { + pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/, + lookbehind: true, + alias: 'symbol' + }, + + 'function': /\b[a-z_]\w*(?=\s*\()/i, + + 'operator': /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/, + 'punctuation': /[()[\]{},;.]/ + }; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js new file mode 100644 index 0000000000..09fc0a7c67 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js @@ -0,0 +1 @@ +!function(t){var e="\\bvoid\\b||\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*)?".replace(//g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js index 910dcb0845..ea4b35af79 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js @@ -1 +1 @@ -!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;Prism.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(); \ No newline at end of file +!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;t.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js index 13a5947b00..d059266745 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js @@ -1,15 +1,21 @@ Prism.languages.mel = { - 'comment': /\/\/.*/, + 'comment': { + pattern: /\/\/.*|\/\*[\s\S]*?\*\//, + greedy: true + }, 'code': { - pattern: /`(?:\\.|[^\\`\r\n])*`/, + pattern: /`(?:\\.|[^\\`])*`/, greedy: true, alias: 'italic', inside: { 'delimiter': { pattern: /^`|`$/, alias: 'punctuation' + }, + 'statement': { + pattern: /[\s\S]+/, + inside: null // see below } - // See rest below } }, 'string': { @@ -23,21 +29,18 @@ Prism.languages.mel = { alias: 'operator' }, 'keyword': /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/, - 'function': /\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/, + 'function': { + pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im, + lookbehind: true, + greedy: true + }, - 'operator': [ - /\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/, - { - // We don't want to match << - pattern: /(^|[^<])<(?!<)/, - lookbehind: true - }, - { - // We don't want to match >> - pattern: /(^|[^>])>(?!>)/, - lookbehind: true - } - ], - 'punctuation': /<<|>>|[.,:;?\[\](){}]/ + 'tensor-punctuation': { + pattern: /<<|>>/, + alias: 'punctuation' + }, + 'operator': /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/, + 'punctuation': /[.,:;?\[\](){}]/ }; -Prism.languages.mel['code'].inside.rest = Prism.languages.mel; + +Prism.languages.mel['code'].inside['statement'].inside = Prism.languages.mel; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js index 0fda416934..a0866882dc 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js @@ -1 +1 @@ -Prism.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.rest=Prism.languages.mel; \ No newline at end of file +Prism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js index 52c6572b22..a71210d1ff 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js @@ -1 +1 @@ -!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map(function($){return $.replace("$","\\$")})).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); \ No newline at end of file +!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map((function($){return $.replace("$","\\$")}))).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js index 627c052acf..5df872e5f8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js @@ -1 +1 @@ -!function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",function(e){e.tokens.forEach(function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",(function(e){e.tokens.forEach((function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n/, + alias: 'punctuation' + }, + + 'operator': /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/, + + 'punctuation': /[(),.:;@\[\]{}]/ + }; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js new file mode 100644 index 0000000000..5abcdf70c8 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js @@ -0,0 +1 @@ +!function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:/'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,greedy:!0,inside:{symbol:t}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:/"(?:\\.|[^\n\r"\\])*"/,greedy:!0,inside:{symbol:t}}],directive:{pattern:/#\w+/,alias:"property"},number:/\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,discard:{pattern:/\b_\b/,alias:"keyword"},"procedure-definition":{pattern:/\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,alias:"function"},keyword:/\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},boolean:/\b(?:false|nil|true)\b/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},arrow:{pattern:/->/,alias:"punctuation"},operator:/\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/[(),.:;@\[\]{}]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js index fcc023dc58..d7ed6e9e4f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js @@ -1 +1 @@ -Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; \ No newline at end of file +Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js index fe17122272..85c18b3479 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js @@ -1 +1 @@ -!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"}),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,function(){return n}),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,function(){return n}),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,function(){return n})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(e,n){return e[n]=t[n],e},{});t["class-name"].forEach(function(e){e.inside=i})}(Prism); \ No newline at end of file +!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js index 1446c7285f..ab71b1da15 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js @@ -1 +1 @@ -!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";Prism.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(); \ No newline at end of file +!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js index 30ac2dc6af..79e8bd1cda 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js @@ -67,7 +67,7 @@ lookbehind: true }, { - pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i, + pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i, alias: 'return-type', greedy: true, lookbehind: true @@ -100,12 +100,12 @@ // // keywords cannot be preceded by "->" // the complex lookbehind means `(?|::)\s*)` - pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, + pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, lookbehind: true } ], 'argument-name': { - pattern: /([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i, + pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i, lookbehind: true }, 'class-name': [ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js index 75f1f18df3..974a4270a8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js @@ -1 +1 @@ -!function(a){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); \ No newline at end of file +!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js new file mode 100644 index 0000000000..70dd234507 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js @@ -0,0 +1,103 @@ +(function (Prism) { + var variable = /\$\w+|%[a-z]+%/; + + var arrowAttr = /\[[^[\]]*\]/.source; + var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source; + var arrowBody = '(?:-+' + arrowDirection + '-+|\\.+' + arrowDirection + '\\.+|-+(?:' + arrowAttr + '-*)?|' + arrowAttr + '-+|\\.+(?:' + arrowAttr + '\\.*)?|' + arrowAttr + '\\.+)'; + var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source; + var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source; + var arrowPrefix = /[[?]?[ox]?/.source; + var arrowSuffix = /[ox]?[\]?]?/.source; + var arrow = + arrowPrefix + + '(?:' + + arrowBody + arrowRight + + '|' + + arrowLeft + arrowBody + '(?:' + arrowRight + ')?' + + ')' + + arrowSuffix; + + Prism.languages['plant-uml'] = { + 'comment': { + pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m, + lookbehind: true, + greedy: true + }, + 'preprocessor': { + pattern: /(^[ \t]*)!.*/m, + lookbehind: true, + greedy: true, + alias: 'property', + inside: { + 'variable': variable + } + }, + 'delimiter': { + pattern: /(^[ \t]*)@(?:end|start)uml\b/m, + lookbehind: true, + greedy: true, + alias: 'punctuation' + }, + + 'arrow': { + pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow + /(?![-.<>?|\\\]ox])/.source), + lookbehind: true, + greedy: true, + alias: 'operator', + inside: { + 'expression': { + pattern: /(\[)[^[\]]+(?=\])/, + lookbehind: true, + inside: null // see below + }, + 'punctuation': /\[(?=$|\])|^\]/ + } + }, + + 'string': { + pattern: /"[^"]*"/, + greedy: true + }, + 'text': { + pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/, + lookbehind: true, + greedy: true, + alias: 'string' + }, + + 'keyword': [ + { + pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m, + lookbehind: true, + greedy: true + }, + /\b(?:elseif|equals|not|while)(?=\s*\()/, + /\b(?:as|is|then)\b/ + ], + + 'divider': { + pattern: /^==.+==$/m, + greedy: true, + alias: 'important' + }, + + 'time': { + pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i, + greedy: true, + alias: 'number' + }, + + 'color': { + pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/, + alias: 'symbol' + }, + 'variable': variable, + + 'punctuation': /[:,;()[\]{}]|\.{3}/ + }; + + Prism.languages['plant-uml'].arrow.inside.expression.inside = Prism.languages['plant-uml']; + + Prism.languages['plantuml'] = Prism.languages['plant-uml']; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js new file mode 100644 index 0000000000..078bc25e9a --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js @@ -0,0 +1 @@ +!function(e){var t=/\$\w+|%[a-z]+%/;e.languages["plant-uml"]={comment:{pattern:/(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,lookbehind:!0,greedy:!0},preprocessor:{pattern:/(^[ \t]*)!.*/m,lookbehind:!0,greedy:!0,alias:"property",inside:{variable:t}},delimiter:{pattern:/(^[ \t]*)@(?:end|start)uml\b/m,lookbehind:!0,greedy:!0,alias:"punctuation"},arrow:{pattern:RegExp("(^|[^-.<>?|\\\\[\\]ox])[[?]?[ox]?(?:(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])|(?:<{1,2}|/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo]))?)[ox]?[\\]?]?(?![-.<>?|\\\\\\]ox])"),lookbehind:!0,greedy:!0,alias:"operator",inside:{expression:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,inside:null},punctuation:/\[(?=$|\])|^\]/}},string:{pattern:/"[^"]*"/,greedy:!0},text:{pattern:/(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,lookbehind:!0,greedy:!0,alias:"string"},keyword:[{pattern:/^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,lookbehind:!0,greedy:!0},/\b(?:elseif|equals|not|while)(?=\s*\()/,/\b(?:as|is|then)\b/],divider:{pattern:/^==.+==$/m,greedy:!0,alias:"important"},time:{pattern:/@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,greedy:!0,alias:"number"},color:{pattern:/#(?:[a-z_]+|[a-fA-F0-9]+)\b/,alias:"symbol"},variable:t,punctuation:/[:,;()[\]{}]|\.{3}/},e.languages["plant-uml"].arrow.inside.expression.inside=e.languages["plant-uml"],e.languages.plantuml=e.languages["plant-uml"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js index 7e969c61f2..80442e7041 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js @@ -1 +1 @@ -!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(); \ No newline at end of file +!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js index e9e01ff1bf..a5834fc52b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js @@ -1,9 +1,13 @@ Prism.languages.properties = { 'comment': /^[ \t]*[#!].*$/m, - 'attr-value': { + 'value': { pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m, - lookbehind: true + lookbehind: true, + alias: 'attr-value' + }, + 'key': { + pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m, + alias: 'attr-name' }, - 'attr-name': /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m, 'punctuation': /[=:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js index d90930c9c1..5976d47656 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js @@ -1 +1 @@ -Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}; \ No newline at end of file +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js index 4f2d7781e9..265211a1d2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js @@ -1 +1 @@ -!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",function(){return r.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); \ No newline at end of file +!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js index d747cbfae6..dc8508220d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js @@ -1 +1 @@ -!function(r){r.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};["c",{lang:"c++",alias:"cpp"},"fortran"].forEach(function(e){var t=e;if("string"!=typeof e&&(t=e.alias,e=e.lang),r.languages[t]){var a={};a["inline-lang-"+t]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",e.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:r.util.clone(r.languages.pure["inline-lang"].inside)},a["inline-lang-"+t].inside.rest=r.util.clone(r.languages[t]),r.languages.insertBefore("pure","inline-lang",a)}}),r.languages.c&&(r.languages.pure["inline-lang"].inside.rest=r.util.clone(r.languages.c))}(Prism); \ No newline at end of file +!function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js index 0f04bb6d4b..2d49469b3f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js @@ -12,7 +12,7 @@ Prism.languages.purebasic = Prism.languages.extend('clike', { 'keyword': /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i, 'function': /\b\w+(?:\.\w+)?\s*(?=\()/, 'number': /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i, - 'operator': /(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/ + 'operator': /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/ }); Prism.languages.insertBefore('purebasic', 'keyword', { diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js index b8072a7afb..91cb9f8d69 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js @@ -1 +1 @@ -Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; \ No newline at end of file +Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js index 00cc616409..7181f66654 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js @@ -1 +1 @@ -!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"}).replace(//g,function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"}),t=0;t<2;t++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); \ No newline at end of file +!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(//g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(//g,(function(){return r}));r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js index 827bef2b19..3fa2597bd9 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js @@ -1 +1 @@ -!function(e){function a(e,r){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+r[+n]+")"})}function n(e,n,r){return RegExp(a(e,n),r||"")}var r=RegExp("\\b(?:"+("Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero"+" "+"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within").trim().replace(/ /g,"|")+")\\b"),t=a("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:r,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:n("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:n("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:r,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}(a('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]),2);e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:n('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:n("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; \ No newline at end of file +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,r){return"(?:"+n[+r]+")"}))}function r(e,r,a){return RegExp(n(e,r),a||"")}var a=RegExp("\\b(?:"+"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within".trim().replace(/ /g,"|")+")\\b"),t=n("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:a,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:r("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:r("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:r("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:a,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r<2;r++)e=e.replace(/<>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}(n('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]));e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:r('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:r("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js new file mode 100644 index 0000000000..9502a77d64 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js @@ -0,0 +1,60 @@ +Prism.languages.rescript = { + 'comment': { + pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + }, + 'char': { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true }, + 'string': { + pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/, + greedy: true + }, + 'class-name': /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/, + 'function': { + pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/, + lookbehind: true, + }, + 'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, + 'boolean': /\b(?:false|true)\b/, + 'attr-value': /[A-Za-z]\w*(?==)/, + 'constant': { + pattern: /(\btype\s+)[a-z]\w*/, + lookbehind: true + }, + 'tag': { + pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/, + lookbehind: true, + inside: { + 'operator': /<|>|\//, + }, + }, + 'keyword': /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/, + 'operator': /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/, + 'punctuation': /[(){}[\],;.]/ +}; + +Prism.languages.insertBefore('rescript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\$\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.rescript + } + }, + 'string': /[\s\S]+/ + } + }, +}); + +Prism.languages.res = Prism.languages.rescript; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js new file mode 100644 index 0000000000..5d00666f43 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js @@ -0,0 +1 @@ +Prism.languages.rescript={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},char:{pattern:/'(?:[^\r\n\\]|\\(?:.|\w+))'/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,function:{pattern:/[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,lookbehind:!0},number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,boolean:/\b(?:false|true)\b/,"attr-value":/[A-Za-z]\w*(?==)/,constant:{pattern:/(\btype\s+)[a-z]\w*/,lookbehind:!0},tag:{pattern:/(<)[a-z]\w*|(?:<\/)[a-z]\w*/,lookbehind:!0,inside:{operator:/<|>|\//}},keyword:/\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,operator:/\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,punctuation:/[(){}[\],;.]/},Prism.languages.insertBefore("rescript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"tag"},rest:Prism.languages.rescript}},string:/[\s\S]+/}}}),Prism.languages.res=Prism.languages.rescript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js index bfaec75744..a0397f51b5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js @@ -1 +1 @@ -!function(t){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},o={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function n(t,n){var e={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var a in n)e[a]=n[a];return e.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},e.variable=o,e.comment=r,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,function(){return t}),"im"),alias:"section",inside:e}}var e={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},a={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:o}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:o}};t.languages.robotframework={settings:n("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:n("Variables"),"test-cases":n("Test Cases",{"test-name":a,documentation:e,property:i}),keywords:n("Keywords",{"keyword-name":a,documentation:e,property:i}),tasks:n("Tasks",{"task-name":a,documentation:e,property:i}),comment:r},t.languages.robot=t.languages.robotframework}(Prism); \ No newline at end of file +!function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js index 52595ee387..d37ce8c574 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js @@ -1 +1 @@ -!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); \ No newline at end of file +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js index 698175d0ee..181589c39b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js @@ -1 +1 @@ -!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,function(){return k}),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,function(){return k}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,function(){return t}),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,function(){return t}),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); \ No newline at end of file +!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js index 980d04e6ad..2aa445193d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js @@ -1 +1 @@ -Prism.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(r){for(var e in r)r[e]=r[e].replace(/<[\w\s]+>/g,function(e){return"(?:"+r[e].trim()+")"});return r[e]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}; \ No newline at end of file +!function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js index 74810323c7..470c9ce03d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js @@ -1 +1 @@ -!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); \ No newline at end of file +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js index 4651214a8a..1e397744d3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js @@ -1 +1 @@ -!function(t){t.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:t.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},t.languages.smarty["embedded-php"].inside.smarty.inside=t.languages.smarty,t.languages.smarty.string[0].inside.interpolation.inside.expression.inside=t.languages.smarty;var e=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,a=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,function(){return e.source}),"g");t.hooks.add("before-tokenize",function(e){var n=!1;t.languages["markup-templating"].buildPlaceholders(e,"smarty",a,function(e){return"{/literal}"===e&&(n=!1),!n&&("{literal}"===e&&(n=!0),!0)})}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"smarty")})}(Prism); \ No newline at end of file +!function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js index d6a8e3d8e3..cb6152870c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js @@ -1 +1 @@ -!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,function(){return"\\s*(?:[*,]|->)"}).replace(//g,function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"}).replace(//g,function(){return"(?!)[a-z\\d_][\\w'.]*"}).replace(//g,function(){return n.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); \ No newline at end of file +!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,(function(){return"\\s*(?:[*,]|->)"})).replace(//g,(function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"})).replace(//g,(function(){return"(?!)[a-z\\d_][\\w'.]*"})).replace(//g,(function(){return n.source})),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js index 76c1ab6978..dd8071096e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js @@ -1 +1 @@ -!function(t){var e=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,a=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;t.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:e,greedy:!0},number:a,punctuation:/[\[\].?]/}},string:{pattern:e,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:a,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},t.hooks.add("before-tokenize",function(e){var a=!1;t.languages["markup-templating"].buildPlaceholders(e,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)})}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"soy")})}(Prism); \ No newline at end of file +!function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js new file mode 100644 index 0000000000..a385bfd957 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js @@ -0,0 +1,76 @@ +// https://www.stata.com/manuals/u.pdf +// https://www.stata.com/manuals/p.pdf + +Prism.languages.stata = { + 'comment': [ + { + pattern: /(^[ \t]*)\*.*/m, + lookbehind: true, + greedy: true + }, + { + pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//, + lookbehind: true, + greedy: true + } + ], + 'string-literal': { + pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/, + greedy: true, + inside: { + 'interpolation': { + pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/, + inside: { + 'punctuation': /^\$\{|\}$/, + 'expression': { + pattern: /[\s\S]+/, + inside: null // see below + } + } + }, + 'string': /[\s\S]+/ + } + }, + + 'mata': { + pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-mata', + inside: Prism.languages.mata + }, + 'java': { + pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-java', + inside: Prism.languages.java + }, + 'python': { + pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-python', + inside: Prism.languages.python + }, + + + 'command': { + pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m, + lookbehind: true, + greedy: true, + alias: 'keyword' + }, + 'variable': /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/, + 'keyword': /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/, + + + 'boolean': /\b(?:off|on)\b/, + 'number': /\b\d+(?:\.\d+)?\b|\B\.\d+/, + 'function': /\b[a-z_]\w*(?=\()/i, + + 'operator': /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/, + 'punctuation': /[(){}[\],:]/ +}; + +Prism.languages.stata['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.stata; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js new file mode 100644 index 0000000000..f6ccbfdf20 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js @@ -0,0 +1 @@ +Prism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js new file mode 100644 index 0000000000..ad4199d9f8 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js @@ -0,0 +1,36 @@ +Prism.languages.supercollider = { + 'comment': { + pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//, + greedy: true + }, + 'string': { + pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/, + lookbehind: true, + greedy: true + }, + 'char': { + pattern: /\$(?:[^\\\r\n]|\\.)/, + greedy: true + }, + 'symbol': { + pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/, + lookbehind: true, + greedy: true + }, + + 'keyword': /\b(?:_|arg|classvar|const|nil|var|while)\b/, + 'boolean': /\b(?:false|true)\b/, + + 'label': { + pattern: /\b[a-z_]\w*(?=\s*:)/, + alias: 'property' + }, + + 'number': /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/, + 'class-name': /\b[A-Z]\w*\b/, + + 'operator': /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/, + 'punctuation': /[{}()[\].:,;]|#[[{]/ +}; + +Prism.languages.sclang = Prism.languages.supercollider; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js new file mode 100644 index 0000000000..52376717c2 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js @@ -0,0 +1 @@ +Prism.languages.supercollider={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,lookbehind:!0,greedy:!0},char:{pattern:/\$(?:[^\\\r\n]|\\.)/,greedy:!0},symbol:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|arg|classvar|const|nil|var|while)\b/,boolean:/\b(?:false|true)\b/,label:{pattern:/\b[a-z_]\w*(?=\s*:)/,alias:"property"},number:/\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,"class-name":/\b[A-Z]\w*\b/,operator:/\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,punctuation:/[{}()[\].:,;]|#[[{]/},Prism.languages.sclang=Prism.languages.supercollider; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js index 39b41b7240..b4f87f4637 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js @@ -1 +1 @@ -Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=Prism.languages.swift}); \ No newline at end of file +Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js index 8c192ef7e2..25b98f672f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js @@ -1 +1 @@ -!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';Prism.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(); \ No newline at end of file +!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';e.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js index 80dcb0e201..365b8e8549 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js @@ -1 +1 @@ -!function(n){function i(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(e){var t=n.languages[e],a="language-"+e;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:i("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:i("=",t,a),"class-feature":i("\\+",t,a),standard:i("",t,a)}}}}})}(Prism); \ No newline at end of file +!function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js index 8bc917c954..a98dfd8b5e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js @@ -1 +1 @@ -!function(n){function e(n,e){return RegExp(n.replace(//g,function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"}).replace(//g,function(){return"(?:\\)|\\((?![^|()\n]+\\)))"}),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); \ No newline at end of file +!function(n){function e(n,e){return RegExp(n.replace(//g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(//g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js index 0bb75d16b3..0dec967cde 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js @@ -1 +1 @@ -!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); \ No newline at end of file +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js index ede4024761..dc4d64817b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js @@ -1 +1 @@ -!function(t){t.languages.tt2=t.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),t.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),t.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),t.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete t.languages.tt2.string,t.hooks.add("before-tokenize",function(e){t.languages["markup-templating"].buildPlaceholders(e,"tt2",/\[%[\s\S]+?%\]/g)}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"tt2")})}(Prism); \ No newline at end of file +!function(e){e.languages.tt2=e.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),e.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js index 75452fd53e..5ad764529b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js @@ -1 +1 @@ -Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",function(e){if("twig"===e.language){Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)}}),Prism.hooks.add("after-tokenize",function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")}); \ No newline at end of file +Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js index c898cc5412..7426fa2ce5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js @@ -11,9 +11,12 @@ Prism.languages.vhdl = { alias: 'function' }, 'string': /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/, - 'constant': /\b(?:library|use)\b/i, + 'attribute': { + pattern: /\b'\w+/, + alias: 'attr-name' + }, // support for predefined attributes included - 'keyword': /\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i, + 'keyword': /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i, 'boolean': /\b(?:false|true)\b/i, 'function': /\w+(?=\()/, // decimal, based, physical, and exponential numbers supported diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js index 01532288e9..17fd67df3d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js @@ -1 +1 @@ -Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:library|use)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file +Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js index fbd0716c57..0013cfcb8e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js @@ -20,7 +20,7 @@ Prism.languages.wolfram = { }, 'boolean': /\b(?:False|True)\b/, 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i, - 'operator': /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'operator': /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, 'punctuation': /[{}[\];(),.:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js index 03309bf0aa..57db919dd3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js @@ -1 +1 @@ -Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; \ No newline at end of file +Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js index 8a80d65342..85074eb378 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js @@ -1 +1 @@ -!function(n){function a(a,e){n.languages[a]&&n.languages.insertBefore(a,"comment",{"doc-comment":e})}var e=n.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:e}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:e}};a("csharp",t),a("fsharp",t),a("vbnet",g)}(Prism); \ No newline at end of file +!function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js index 14db8f8de4..f206e0c990 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js @@ -1 +1 @@ -!function(r){r.languages.xquery=r.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),r.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,r.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,r.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,r.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:r.languages.xquery,alias:"language-xquery"};var s=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join("")},l=function(e){for(var t=[],n=0;n"===a.content[a.content.length-1].content||t.push({tagName:s(a.content[0].content[1]),openedBraces:0}):!(0[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js index 344f4baa59..5cd16d3d7f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js @@ -1 +1 @@ -!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js index 298d9c3481..26316b4604 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js @@ -1 +1 @@ -!function(n){function e(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,e(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,e(a))+")+";n.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(e){null===e.inside&&(e.inside=n.languages.zig)})}(Prism); \ No newline at end of file +!function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json index 201c71bac1..1ea530334f 100755 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json @@ -1,6 +1,6 @@ { "name": "prismjs", - "version": "1.27.0", + "version": "1.28.0", "description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.", "main": "prism.js", "style": "themes/prism.css", @@ -46,7 +46,7 @@ "docdash": "^1.2.0", "eslint": "^7.22.0", "eslint-plugin-jsdoc": "^32.3.0", - "eslint-plugin-regexp": "^1.4.0", + "eslint-plugin-regexp": "^1.6.0", "gulp": "^4.0.2", "gulp-clean-css": "^4.3.0", "gulp-concat": "^2.3.4", @@ -54,12 +54,12 @@ "gulp-jsdoc3": "^3.0.0", "gulp-rename": "^1.2.0", "gulp-replace": "^1.0.0", - "gulp-uglify": "^3.0.1", + "gulp-terser": "^2.1.0", "gzip-size": "^5.1.1", "htmlparser2": "^4.0.0", "http-server": "^0.12.3", "jsdom": "^16.7.0", - "mocha": "^6.2.0", + "mocha": "^9.2.2", "node-fetch": "^3.1.1", "npm-run-all": "^4.1.5", "prettier": "^2.4.1", @@ -68,7 +68,7 @@ "regexp-ast-analysis": "^0.2.4", "regexpp": "^3.2.0", "scslre": "^0.1.6", - "simple-git": "^1.107.0", + "simple-git": "^3.3.0", "webfont": "^9.0.0", "yargs": "^13.2.2" }, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js index 7846dba519..532e11b5ad 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js @@ -4,7 +4,7 @@ return; } - var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/; + var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&!$'()*,;@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/; var email = /\b\S+@[\w.]+[a-z]{2}/; var linkMd = /\[([^\]]+)\]\(([^)]+)\)/; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js index 731c4a0c21..44aa79402a 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var e=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/,r=/\b\S+@[\w.]+[a-z]{2}/,a=/\[([^\]]+)\]\(([^)]+)\)/,l=["comment","url","attr-value","string"];Prism.plugins.autolinker={processGrammar:function(i){i&&!i["url-link"]&&(Prism.languages.DFS(i,function(i,n,t){-1-1&&!Array.isArray(a)&&(a.pattern||(a=this[r]={pattern:a}),a.inside=a.inside||{},"comment"==l&&(a.inside["md-link"]=t),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},a):a.inside["url-link"]=i,a.inside["email-link"]=n)})),r["url-link"]=i,r["email-link"]=n)}},Prism.hooks.add("before-highlight",(function(i){Prism.plugins.autolinker.processGrammar(i.grammar)})),Prism.hooks.add("wrap",(function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var e=i.content.match(t);n=e[2],i.content=e[1]}i.attributes.href=n;try{i.content=decodeURIComponent(i.content)}catch(i){}}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js index 69bfa53f29..91203ae444 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js @@ -139,6 +139,11 @@ "sparql": "turtle", "sqf": "clike", "squirrel": "clike", + "stata": [ + "mata", + "java", + "python" + ], "t4-cs": [ "t4-templating", "csharp" @@ -176,9 +181,12 @@ "js": "javascript", "g4": "antlr4", "ino": "arduino", + "arm-asm": "armasm", + "art": "arturo", "adoc": "asciidoc", "avs": "avisynth", "avdl": "avro-idl", + "gawk": "awk", "shell": "bash", "shortcode": "bbcode", "rbnf": "bnf", @@ -196,9 +204,12 @@ "xlsx": "excel-formula", "xls": "excel-formula", "gamemakerlanguage": "gml", + "po": "gettext", "gni": "gn", + "ld": "linker-script", "go-mod": "go-module", "hbs": "handlebars", + "mustache": "handlebars", "hs": "haskell", "idr": "idris", "gitignore": "ignore", @@ -223,6 +234,7 @@ "objectpascal": "pascal", "px": "pcaxis", "pcode": "peoplecode", + "plantuml": "plant-uml", "pq": "powerquery", "mscript": "powerquery", "pbfasm": "purebasic", @@ -232,6 +244,7 @@ "rkt": "racket", "razor": "cshtml", "rpy": "renpy", + "res": "rescript", "robot": "robotframework", "rb": "ruby", "sh-session": "shell-session", @@ -240,6 +253,7 @@ "sol": "solidity", "sln": "solution-file", "rq": "sparql", + "sclang": "supercollider", "t4": "t4-cs", "trickle": "tremor", "troy": "tremor", diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js index 812b2c97ac..f9a4c4a69d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var l={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike","t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",gni:"gn","go-mod":"go-module",hbs:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},p={},e="components/",a=Prism.util.currentScript();if(a){var r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,s=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,i=a.getAttribute("data-autoloader-path");if(null!=i)e=i.trim().replace(/\/?$/,"/");else{var t=a.src;r.test(t)?e=t.replace(r,"components/"):s.test(t)&&(e=t.replace(s,"$1components/"))}}var o=Prism.plugins.autoloader={languages_path:e,use_minified:!0,loadLanguages:u};Prism.hooks.add("complete",function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(m)||u(s,function(){Prism.highlightElement(a)})}})}function m(e){if(0<=e.indexOf("!"))return!1;if((e=n[e]||e)in Prism.languages)return!0;var a=p[e];return a&&!a.error&&!1===a.loading}function u(e,a,r){"string"==typeof e&&(e=[e]);var s=e.length,i=0,t=!1;function c(){t||++i===s&&a&&a(e)}0!==s?e.forEach(function(e){!function(a,r,s){var i=0<=a.indexOf("!");function e(){var e=p[a];e||(e=p[a]={callbacks:[]}),e.callbacks.push({success:r,error:s}),!i&&m(a)?k(a,"success"):!i&&e.error?k(a,"error"):!i&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return o.languages_path+"prism-"+e+(o.use_minified?".min":"")+".js"}(a),function(){e.loading=!1,k(a,"success")},function(){e.loading=!1,e.error=!0,k(a,"error")}))}a=a.replace("!",""),a=n[a]||a;var t=l[a];t&&t.length?u(t,e,s):e()}(e,c,function(){t||(t=!0,r&&r(e))})}):a&&setTimeout(a,0)}function k(e,a){if(p[e]){for(var r=p[e].callbacks,s=0,i=r.length;s=0)return!1;if((e=a[e]||e)in Prism.languages)return!0;var s=r[e];return s&&!s.error&&!1===s.loading}function m(s,t,i){"string"==typeof s&&(s=[s]);var l=s.length,c=0,n=!1;function k(){n||++c===l&&t&&t(s)}0!==l?s.forEach((function(s){!function(s,t,i){var l=s.indexOf("!")>=0;function c(){var e=r[s];e||(e=r[s]={callbacks:[]}),e.callbacks.push({success:t,error:i}),!l&&o(s)?u(s,"success"):!l&&e.error?u(s,"error"):!l&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return p.languages_path+"prism-"+e+(p.use_minified?".min":"")+".js"}(s),(function(){e.loading=!1,u(s,"success")}),(function(){e.loading=!1,e.error=!0,u(s,"error")})))}s=s.replace("!","");var n=e[s=a[s]||s];n&&n.length?m(n,c,i):c()}(s,k,(function(){n||(n=!0,i&&i(s))}))})):t&&setTimeout(t,0)}function u(e,a){if(r[e]){for(var s=r[e].callbacks,t=0,i=s.length;t span:before { - opacity: 0.4; + opacity: 0.7; content: ' '; display: block; padding-right: 0.8em; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js index 415ac5dc95..b5fa38fea2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js @@ -74,21 +74,6 @@ var codeLines = env.code.split('\n'); - var continuationLineIndicies = commandLine.continuationLineIndicies = new Set(); - var lineContinuationStr = pre.getAttribute('data-continuation-str'); - - // Identify code lines that are a continuation line and thus don't need - // a prompt - if (lineContinuationStr && codeLines.length > 1) { - for (var j = 1; j < codeLines.length; j++) { - if (codeLines.hasOwnProperty(j - 1) - && endsWith(codeLines[j - 1], lineContinuationStr)) { - // Mark this line as being a continuation line - continuationLineIndicies.add(j); - } - } - } - commandLine.numberOfLines = codeLines.length; /** @type {string[]} */ var outputLines = commandLine.outputLines = []; @@ -127,6 +112,32 @@ } } + var continuationLineIndicies = commandLine.continuationLineIndicies = new Set(); + var lineContinuationStr = pre.getAttribute('data-continuation-str'); + var continuationFilter = pre.getAttribute('data-filter-continuation'); + + // Identify code lines where the command has continued onto subsequent + // lines and thus need a different prompt. Need to do this after the output + // lines have been removed to ensure we don't pick up a continuation string + // in an output line. + for (var j = 0; j < codeLines.length; j++) { + var line = codeLines[j]; + if (!line) { + continue; + } + + // Record the next line as a continuation if this one ends in a continuation str. + if (lineContinuationStr && endsWith(line, lineContinuationStr)) { + continuationLineIndicies.add(j + 1); + } + // Record this line as a continuation if marked with a continuation prefix + // (that we will remove). + if (j > 0 && continuationFilter && startsWith(line, continuationFilter)) { + codeLines[j] = line.slice(continuationFilter.length); + continuationLineIndicies.add(j); + } + } + env.code = codeLines.join('\n'); }); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css index 5e5c875d7e..7d7fc595af 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css @@ -1 +1 @@ -.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.4;content:' ';display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7} \ No newline at end of file +.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.7;content:' ';display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js index fb2e402b04..971ae8156d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var v=/(?:^|\s)command-line(?:\s|$)/,g="command-line-prompt",p="".startsWith?function(e,t){return e.startsWith(t)}:function(e,t){return 0===e.indexOf(t)},d="".endsWith?function(e,t){return e.endsWith(t)}:function(e,t){var n=e.length;return e.substring(n-t.length,n)===t};Prism.hooks.add("before-highlight",function(e){var t=N(e);if(!t.complete&&e.code){var n=e.element.parentElement;if(n&&/pre/i.test(n.nodeName)&&(v.test(n.className)||v.test(e.element.className))){var a=e.element.querySelector("."+g);a&&a.remove();var i=e.code.split("\n"),r=t.continuationLineIndicies=new Set,s=n.getAttribute("data-continuation-str");if(s&&1i.length&&(a=i.length),a--;for(var r=--n;r<=a;r++)l[r]=i[r],i[r]=""}});else if(u)for(var c=0;c'+Prism.util.encode(a[r])+"":n[r]=''+n[r]+"";e.highlightedCode=n.join("\n")}}),Prism.hooks.add("complete",function(e){if(function(e){return"command-line"in(e.vars=e.vars||{})}(e)){var t=N(e);if(!t.complete){var n=e.element.parentElement;v.test(e.element.className)&&(e.element.className=e.element.className.replace(v," ")),v.test(n.className)||(n.className+=" command-line");var a,r="",i=t.numberOfLines||0,s=h("data-prompt","");if(""!==s)a='';else a='';for(var o=t.continuationLineIndicies||new Set,l='")+'">',m=0;mm.length&&(a=m.length),a--;for(var r=--n;r<=a;r++)u[r]=m[r],m[r]=""}}));else if(d)for(var p=0;p0&&v&&n(b,v)&&(m[g]=b.slice(v.length),f.add(g)))}i.code=m.join("\n")}else o.complete=!0}else o.complete=!0})),Prism.hooks.add("before-insert",(function(e){var t=r(e);if(!t.complete){for(var n=e.highlightedCode.split("\n"),a=t.outputLines||[],i=0,o=n.length;i'+Prism.util.encode(a[i])+"":n[i]=''+n[i]+"";e.highlightedCode=n.join("\n")}})),Prism.hooks.add("complete",(function(n){if(function(e){return"command-line"in(e.vars=e.vars||{})}(n)){var a=r(n);if(!a.complete){var i=n.element.parentElement;e.test(n.element.className)&&(n.element.className=n.element.className.replace(e," ")),e.test(i.className)||(i.className+=" command-line");var o,s="",l=a.numberOfLines||0,m=b("data-prompt","");o=""!==m?'':'';for(var u=a.continuationLineIndicies||new Set,c='")+'">',d=0;d-1&&!Array.isArray(r)&&(r.pattern||(r=this[n]={pattern:r}),r.inside=r.inside||{},"attr-value"==e?Prism.languages.insertBefore("inside",r.inside["url-link"]?"url-link":"punctuation",{"data-uri":i},r):r.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":i},r):r.inside["data-uri"]=i)})),n["data-uri"]=i)}},Prism.hooks.add("before-highlight",(function(a){if(i.pattern.test(a.code))for(var n in i.inside)if(i.inside.hasOwnProperty(n)&&!i.inside[n].inside&&i.inside[n].pattern.test(a.code)){var r=n.match(/^language-(.+)/)[1];Prism.languages[r]&&(i.inside[n].inside={rest:(e=Prism.languages[r],Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(e),e)})}var e;Prism.plugins.dataURIHighlight.processGrammar(a.grammar)}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js index a6cf1c2fce..38a97b41eb 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var m=/^diff-([\w-]+)/i,d=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,c=RegExp("(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))".replace(/__/g,function(){return d.source}),"gi"),a=!1;Prism.hooks.add("before-sanity-check",function(e){var i=e.language;m.test(i)&&!e.grammar&&(e.grammar=Prism.languages[i]=Prism.languages.diff)}),Prism.hooks.add("before-tokenize",function(e){a||Prism.languages.diff||Prism.plugins.autoloader||(a=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var i=e.language;m.test(i)&&!Prism.languages[i]&&(Prism.languages[i]=Prism.languages.diff)}),Prism.hooks.add("wrap",function(e){var i,a;if("diff"!==e.language){var s=m.exec(e.language);if(!s)return;i=s[1],a=Prism.languages[i]}var r=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(r&&e.type in r){var n,g=e.content.replace(d,"").replace(/</g,"<").replace(/&/g,"&"),f=g.replace(/(^|[\r\n])./g,"$1");n=a?Prism.highlight(f,a,i):Prism.util.encode(f);var u,l=new Prism.Token("prefix",r[e.type],[/\w+/.exec(e.type)[0]]),t=Prism.Token.stringify(l,e.language),o=[];for(c.lastIndex=0;u=c.exec(n);)o.push(t+u[0]);/(?:^|[\r\n]).$/.test(g)&&o.push(t),e.content=o.join(""),a&&e.classes.push("language-"+i)}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism){var e=/^diff-([\w-]+)/i,i=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,a=RegExp("(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))".replace(/__/g,(function(){return i.source})),"gi"),s=!1;Prism.hooks.add("before-sanity-check",(function(i){var a=i.language;e.test(a)&&!i.grammar&&(i.grammar=Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("before-tokenize",(function(i){s||Prism.languages.diff||Prism.plugins.autoloader||(s=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var a=i.language;e.test(a)&&!Prism.languages[a]&&(Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("wrap",(function(s){var r,n;if("diff"!==s.language){var g=e.exec(s.language);if(!g)return;r=g[1],n=Prism.languages[r]}var f=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(f&&s.type in f){var u,l=s.content.replace(i,"").replace(/</g,"<").replace(/&/g,"&"),t=l.replace(/(^|[\r\n])./g,"$1");u=n?Prism.highlight(t,n,r):Prism.util.encode(t);var o,m=new Prism.Token("prefix",f[s.type],[/\w+/.exec(s.type)[0]]),d=Prism.Token.stringify(m,s.language),c=[];for(a.lastIndex=0;o=a.exec(u);)c.push(d+o[0]);/(?:^|[\r\n]).$/.test(l)&&c.push(d),s.content=c.join(""),n&&s.classes.push("language-"+r)}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js index 57e5879e75..dc10f65d60 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var n=e.getAttribute("data-src"),a=document.createElement("a");return a.textContent=e.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}}); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",(function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var n=e.getAttribute("data-src"),a=document.createElement("a");return a.textContent=e.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js index 23bacb136e..e8c9594ae1 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var l={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},o="data-src-status",h="loading",g="loaded",u="pre[data-src]:not(["+o+'="'+g+'"]):not(['+o+'="'+h+'"])';Prism.hooks.add("before-highlightall",function(t){t.selector+=", "+u}),Prism.hooks.add("before-sanity-check",function(t){var r=t.element;if(r.matches(u)){t.code="",r.setAttribute(o,h);var s=r.appendChild(document.createElement("CODE"));s.textContent="Loading…";var e=r.getAttribute("data-src"),i=t.language;if("none"===i){var n=(/\.(\w+)$/.exec(e)||[,"none"])[1];i=l[n]||n}Prism.util.setLanguage(s,i),Prism.util.setLanguage(r,i);var a=Prism.plugins.autoloader;a&&a.loadLanguages(i),function(t,e,i){var n=new XMLHttpRequest;n.open("GET",t,!0),n.onreadystatechange=function(){4==n.readyState&&(n.status<400&&n.responseText?e(n.responseText):400<=n.status?i(function(t,e){return"✖ Error "+t+" while fetching file: "+e}(n.status,n.statusText)):i("✖ Error: File does not exist or is empty"))},n.send(null)}(e,function(t){r.setAttribute(o,g);var e=function(t){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(t||"");if(e){var i=Number(e[1]),n=e[2],a=e[3];return n?a?[i,Number(a)]:[i,void 0]:[i,i]}}(r.getAttribute("data-range"));if(e){var i=t.split(/\r\n?|\n/g),n=e[0],a=null==e[1]?i.length:e[1];n<0&&(n+=i.length),n=Math.max(0,Math.min(n-1,i.length)),a<0&&(a+=i.length),a=Math.max(0,Math.min(a,i.length)),t=i.slice(n,a).join("\n"),r.hasAttribute("data-start")||r.setAttribute("data-start",String(n+1))}s.textContent=t,Prism.highlightElement(s)},function(t){r.setAttribute(o,"failed"),s.textContent=t})}});var t=!(Prism.plugins.fileHighlight={highlight:function(t){for(var e,i=(t||document).querySelectorAll(u),n=0;e=i[n++];)Prism.highlightElement(e)}});Prism.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)}}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},e="data-src-status",i='pre[data-src]:not([data-src-status="loaded"]):not([data-src-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+i})),Prism.hooks.add("before-sanity-check",(function(a){var n=a.element;if(n.matches(i)){a.code="",n.setAttribute(e,"loading");var s=n.appendChild(document.createElement("CODE"));s.textContent="Loading…";var r=n.getAttribute("data-src"),l=a.language;if("none"===l){var o=(/\.(\w+)$/.exec(r)||[,"none"])[1];l=t[o]||o}Prism.util.setLanguage(s,l),Prism.util.setLanguage(n,l);var h=Prism.plugins.autoloader;h&&h.loadLanguages(l),function(t,i,a){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?function(t){n.setAttribute(e,"loaded");var i=function(t){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(t||"");if(e){var i=Number(e[1]),a=e[2],n=e[3];return a?n?[i,Number(n)]:[i,void 0]:[i,i]}}(n.getAttribute("data-range"));if(i){var a=t.split(/\r\n?|\n/g),r=i[0],l=null==i[1]?a.length:i[1];r<0&&(r+=a.length),r=Math.max(0,Math.min(r-1,a.length)),l<0&&(l+=a.length),l=Math.max(0,Math.min(l,a.length)),t=a.slice(r,l).join("\n"),n.hasAttribute("data-start")||n.setAttribute("data-start",String(r+1))}s.textContent=t,Prism.highlightElement(s)}(r.responseText):r.status>=400?a("✖ Error "+r.status+" while fetching file: "+r.statusText):a("✖ Error: File does not exist or is empty"))},r.send(null)}(r,0,(function(t){n.setAttribute(e,"failed"),s.textContent=t}))}})),Prism.plugins.fileHighlight={highlight:function(t){for(var e,a=(t||document).querySelectorAll(i),n=0;e=a[n++];)Prism.highlightElement(e)}};var a=!1;Prism.fileHighlight=function(){a||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),a=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)}}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js index 1e311d345a..94b828a311 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e,t=Prism.util.currentScript(),r=[],n=Prism.plugins.filterHighlightAll={add:function(t){r.push(function(e){return t({element:e,language:Prism.util.getLanguage(e)})})},addSelector:function(t){r.push(function(e){return e.matches(t)})},reject:{add:function(t){r.push(function(e){return!t({element:e,language:Prism.util.getLanguage(e)})})},addSelector:function(t){r.push(function(e){return!e.matches(t)})}},filterKnown:!!t&&t.hasAttribute("data-filter-known")};if(n.add(function(e){return!n.filterKnown||"object"==typeof Prism.languages[e.language]}),t)(e=t.getAttribute("data-filter-selector"))&&n.addSelector(e),(e=t.getAttribute("data-reject-selector"))&&n.reject.addSelector(e);Prism.hooks.add("before-all-elements-highlight",function(e){e.elements=e.elements.filter(i)})}function i(e){for(var t=0,n=r.length;t\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,c=/^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i,l=[function(n){var r=c.exec(n);if(r){for(var o=6<=(n=r[1]).length?2:1,s=n.length/o,e=1==o?1/15:1/255,t=[],i=0;i';n.content=i+o}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var n=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,r=/^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i,o=[function(n){var o=r.exec(n);if(o){for(var s=(n=o[1]).length>=6?2:1,e=n.length/s,t=1==s?1/15:1/255,i=[],a=0;a=0){for(var s,e=r.content,t=e.split(n).join(""),i=0,a=o.length;i';r.content=c+e}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js index b6303a827d..17892784a8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var s=[];t(function(t){if(t&&t.meta&&t.data){if(t.meta.status&&400<=t.meta.status)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null},"github"),t(function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&400<=t.meta.status)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null},"gist"),t(function(t){return t&&t.node&&"string"==typeof t.data?t.data:null},"bitbucket");var f=0,d="data-jsonp-status",l="loading",c="loaded",m="failed",p="pre[data-jsonp]:not(["+d+'="'+c+'"]):not(['+d+'="'+l+'"])';Prism.hooks.add("before-highlightall",function(t){t.selector+=", "+p}),Prism.hooks.add("before-sanity-check",function(t){var r=t.element;if(r.matches(p)){t.code="",r.setAttribute(d,l);var i=r.appendChild(document.createElement("CODE"));i.textContent="Loading…";var e=t.language;i.className="language-"+e;var n=Prism.plugins.autoloader;n&&n.loadLanguages(e);var a=r.getAttribute("data-adapter"),o=null;if(a){if("function"!=typeof window[a])return r.setAttribute(d,m),void(i.textContent=function(t){return'✖ Error: JSONP adapter function "'+t+"\" doesn't exist"}(a));o=window[a]}var u=r.getAttribute("data-jsonp");!function(t,e,n,a){var r="prismjsonp"+f++,i=document.createElement("a");i.href=t,i.href+=(i.search?"&":"?")+(e||"callback")+"="+r;var o=document.createElement("script");o.src=i.href,o.onerror=function(){s(),a("network")};var u=setTimeout(function(){s(),a("timeout")},Prism.plugins.jsonphighlight.timeout);function s(){clearTimeout(u),document.head.removeChild(o),delete window[r]}window[r]=function(t){s(),n(t)},document.head.appendChild(o)}(u,r.getAttribute("data-callback"),function(t){var e=null;if(o)e=o(t,r);else for(var n=0,a=s.length;n=400)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null}),"github"),o((function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null}),"gist"),o((function(t){return t&&t.node&&"string"==typeof t.data?t.data:null}),"bitbucket");var e=0,n="data-jsonp-status",a="failed",r='pre[data-jsonp]:not([data-jsonp-status="loaded"]):not([data-jsonp-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+r})),Prism.hooks.add("before-sanity-check",(function(o){var i,u=o.element;if(u.matches(r)){o.code="",u.setAttribute(n,"loading");var s=u.appendChild(document.createElement("CODE"));s.textContent="Loading…";var d=o.language;s.className="language-"+d;var f=Prism.plugins.autoloader;f&&f.loadLanguages(d);var l=u.getAttribute("data-adapter"),c=null;if(l){if("function"!=typeof window[l])return u.setAttribute(n,a),void(s.textContent=(i=l,'✖ Error: JSONP adapter function "'+i+"\" doesn't exist"));c=window[l]}var p=u.getAttribute("data-jsonp");!function(r,o,i,d){var f="prismjsonp"+e++,l=document.createElement("a");l.href=r,l.href+=(l.search?"&":"?")+(o||"callback")+"="+f;var p=document.createElement("script");p.src=l.href,p.onerror=function(){g(),d()};var m=setTimeout((function(){g(),d()}),Prism.plugins.jsonphighlight.timeout);function g(){clearTimeout(m),document.head.removeChild(p),delete window[f]}window[f]=function(e){g(),function(e){var r=null;if(c)r=c(e,u);else for(var o=0,i=t.length;o=0&&t.splice(n,1)}},highlight:function(t){for(var e,n=(t||document).querySelectorAll(r),a=0;e=n[a++];)Prism.highlightElement(e)}}}function o(e,n){n=n||e.name,"function"!=typeof e||i(e)||i(n)||t.push({adapter:e,name:n})}function i(e){if("function"==typeof e){for(var n=0;a=t[n++];)if(a.adapter.valueOf()===e.valueOf())return a.adapter}else if("string"==typeof e){var a;for(n=0;a=t[n++];)if(a.name===e)return a.adapter}return null}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js index c160faa88f..dd3a108041 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js @@ -39,8 +39,8 @@ } var o = { - // Clone the original tag to keep all attributes - clone: element.cloneNode(false), + // Store original element so we can restore it after highlighting + element: element, posOpen: pos }; data.push(o); @@ -96,12 +96,13 @@ } if (nodeState.nodeStart && nodeState.nodeEnd) { - // Select the range and wrap it with the clone + // Select the range and wrap it with the element var range = document.createRange(); range.setStart(nodeState.nodeStart, nodeState.nodeStartPos); range.setEnd(nodeState.nodeEnd, nodeState.nodeEndPos); - nodeState.node.clone.appendChild(range.extractContents()); - range.insertNode(nodeState.node.clone); + nodeState.node.element.innerHTML = ''; + nodeState.node.element.appendChild(range.extractContents()); + range.insertNode(nodeState.node.element); range.detach(); // Process is over diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js index 6bea9d2efd..9076248398 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var o=Prism.util.isActive(e.element,"drop-tokens",!1),d=0,t=[];s(e.element),t.length&&(e.keepMarkup=t)}function r(e){if(function(e){return!o||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var n={clone:e.cloneNode(!1),posOpen:d};t.push(n),s(e),n.posClose=d}else s(e)}function s(e){for(var n=0,o=e.childNodes.length;nn.node.posOpen&&(n.nodeStart=d,n.nodeStartPos=n.node.posOpen-n.pos),n.nodeStart&&n.pos+d.data.length>=n.node.posClose&&(n.nodeEnd=d,n.nodeEndPos=n.node.posClose-n.pos),n.pos+=d.data.length);if(n.nodeStart&&n.nodeEnd){var r=document.createRange();return r.setStart(n.nodeStart,n.nodeStartPos),r.setEnd(n.nodeEnd,n.nodeEndPos),n.node.clone.appendChild(r.extractContents()),r.insertNode(n.node.clone),r.detach(),!1}}return!0};n.keepMarkup.forEach(function(e){s(n.element,{node:e,pos:0})}),n.highlightedCode=n.element.innerHTML}})); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",(function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var n=Prism.util.isActive(e.element,"drop-tokens",!1),t=0,o=[];r(e.element),o.length&&(e.keepMarkup=o)}function d(e){if(function(e){return!n||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var d={element:e,posOpen:t};o.push(d),r(e),d.posClose=t}else r(e)}function r(e){for(var n=0,o=e.childNodes.length;nt.node.posOpen&&(t.nodeStart=r,t.nodeStartPos=t.node.posOpen-t.pos),t.nodeStart&&t.pos+r.data.length>=t.node.posClose&&(t.nodeEnd=r,t.nodeEndPos=t.node.posClose-t.pos),t.pos+=r.data.length);if(t.nodeStart&&t.nodeEnd){var s=document.createRange();return s.setStart(t.nodeStart,t.nodeStartPos),s.setEnd(t.nodeEnd,t.nodeEndPos),t.node.element.innerHTML="",t.node.element.appendChild(s.extractContents()),s.insertNode(t.node.element),s.detach(),!1}}return!0};e.keepMarkup.forEach((function(t){n(e.element,{node:t,pos:0})})),e.highlightedCode=e.element.innerHTML}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js index c1f640b45c..7d38b6b424 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var t,o="line-numbers",s="linkable-line-numbers",l=function(){if(void 0===t){var e=document.createElement("div");e.style.fontSize="13px",e.style.lineHeight="1.5",e.style.padding="0",e.style.border="0",e.innerHTML=" 
     ",document.body.appendChild(e),t=38===e.offsetHeight,document.body.removeChild(e)}return t},a=!0;Prism.plugins.lineHighlight={highlightLines:function(u,e,c){var t=(e="string"==typeof e?e:u.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+u.getAttribute("data-line-offset")||0,h=(l()?parseInt:parseFloat)(getComputedStyle(u).lineHeight),f=Prism.util.isActive(u,o),i=u.querySelector("code"),p=f?u:i||u,g=[],m=i&&p!=i?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(u,i):0;t.forEach(function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i,r=u.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(g.push(function(){r.setAttribute("aria-hidden","true"),r.setAttribute("data-range",e),r.className=(c||"")+" line-highlight"}),f&&Prism.plugins.lineNumbers){var o=Prism.plugins.lineNumbers.getLine(u,i),s=Prism.plugins.lineNumbers.getLine(u,n);if(o){var l=o.offsetTop+m+"px";g.push(function(){r.style.top=l})}if(s){var a=s.offsetTop-o.offsetTop+s.offsetHeight+"px";g.push(function(){r.style.height=a})}}else g.push(function(){r.setAttribute("data-start",String(i)),i span",u).forEach(function(e,t){var i=t+r;e.onclick=function(){var e=n+"."+i;a=!1,location.hash=e,setTimeout(function(){a=!0},1)}})}return function(){g.forEach(b)}}};var u=0;Prism.hooks.add("before-sanity-check",function(e){var t=e.element.parentElement;if(c(t)){var i=0;v(".line-highlight",t).forEach(function(e){i+=e.textContent.length,e.parentNode.removeChild(e)}),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}}),Prism.hooks.add("complete",function e(t){var i=t.element.parentElement;if(c(i)){clearTimeout(u);var n=Prism.plugins.lineNumbers,r=t.plugins&&t.plugins.lineNumbers;if(y(i,o)&&n&&!r)Prism.hooks.add("line-numbers",e);else Prism.plugins.lineHighlight.highlightLines(i)(),u=setTimeout(d,1)}}),window.addEventListener("hashchange",d),window.addEventListener("resize",function(){v("pre").filter(c).map(function(e){return Prism.plugins.lineHighlight.highlightLines(e)}).forEach(b)})}function v(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function y(e,t){return e.classList.contains(t)}function b(e){e()}function c(e){return!(!e||!/pre/i.test(e.nodeName))&&(!!e.hasAttribute("data-line")||!(!e.id||!Prism.util.isActive(e,s)))}function d(){var e=location.hash.slice(1);v(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),n=document.getElementById(i);if(n)n.hasAttribute("data-line")||n.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(n,t,"temporary ")(),a&&document.querySelector(".temporary.line-highlight").scrollIntoView()}}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var e,t="line-numbers",i="linkable-line-numbers",n=!0;Prism.plugins.lineHighlight={highlightLines:function(r,a,u){var c=(a="string"==typeof a?a:r.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+r.getAttribute("data-line-offset")||0,h=(function(){if(void 0===e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding="0",t.style.border="0",t.innerHTML=" 
     ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}()?parseInt:parseFloat)(getComputedStyle(r).lineHeight),f=Prism.util.isActive(r,t),p=r.querySelector("code"),g=f?r:p||r,m=[],v=p&&g!=p?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(r,p):0;c.forEach((function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i,o=r.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(m.push((function(){o.setAttribute("aria-hidden","true"),o.setAttribute("data-range",e),o.className=(u||"")+" line-highlight"})),f&&Prism.plugins.lineNumbers){var s=Prism.plugins.lineNumbers.getLine(r,i),l=Prism.plugins.lineNumbers.getLine(r,n);if(s){var a=s.offsetTop+v+"px";m.push((function(){o.style.top=a}))}if(l){var c=l.offsetTop-s.offsetTop+l.offsetHeight+"px";m.push((function(){o.style.height=c}))}}else m.push((function(){o.setAttribute("data-start",String(i)),n>i&&o.setAttribute("data-end",String(n)),o.style.top=(i-d-1)*h+v+"px",o.textContent=new Array(n-i+2).join(" \n")}));m.push((function(){o.style.width=r.scrollWidth+"px"})),m.push((function(){g.appendChild(o)}))}));var y=r.id;if(f&&Prism.util.isActive(r,i)&&y){s(r,i)||m.push((function(){r.classList.add(i)}));var b=parseInt(r.getAttribute("data-start")||"1");o(".line-numbers-rows > span",r).forEach((function(e,t){var i=t+b;e.onclick=function(){var e=y+"."+i;n=!1,location.hash=e,setTimeout((function(){n=!0}),1)}}))}return function(){m.forEach(l)}}};var r=0;Prism.hooks.add("before-sanity-check",(function(e){var t=e.element.parentElement;if(a(t)){var i=0;o(".line-highlight",t).forEach((function(e){i+=e.textContent.length,e.parentNode.removeChild(e)})),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}})),Prism.hooks.add("complete",(function e(i){var n=i.element.parentElement;if(a(n)){clearTimeout(r);var o=Prism.plugins.lineNumbers,l=i.plugins&&i.plugins.lineNumbers;s(n,t)&&o&&!l?Prism.hooks.add("line-numbers",e):(Prism.plugins.lineHighlight.highlightLines(n)(),r=setTimeout(u,1))}})),window.addEventListener("hashchange",u),window.addEventListener("resize",(function(){o("pre").filter(a).map((function(e){return Prism.plugins.lineHighlight.highlightLines(e)})).forEach(l)}))}function o(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function s(e,t){return e.classList.contains(t)}function l(e){e()}function a(e){return!!(e&&/pre/i.test(e.nodeName)&&(e.hasAttribute("data-line")||e.id&&Prism.util.isActive(e,i)))}function u(){var e=location.hash.slice(1);o(".temporary.line-highlight").forEach((function(e){e.parentNode.removeChild(e)}));var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),r=document.getElementById(i);r&&(r.hasAttribute("data-line")||r.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(r,t,"temporary ")(),n&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js index 9ccb6da910..1f12d2d476 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1s&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;rn&&(o[l]="\n"+o[l],a=s)}r[i]=o.join("")}return r.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var t=e.element.parentNode;if(e.code&&t&&"pre"===t.nodeName.toLowerCase()){for(var r=t.childNodes,i="",o="",a=!1,l=0;l"})}),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",function(e){var s,t,i=parseFloat(e),a=e.match(/[a-z]+$/i);if(!i||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return t=100*i/s,t%=100,this[(i<0?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(t)+",500",!0},"*",function(){this._elt.innerHTML=''})},tokens:{angle:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor})},tokens:{color:[Prism.languages.css.hexcode].concat(Prism.languages.css.color)},languages:{css:!1,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!1,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",function(e){var s=(e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e).match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);if(4!==s.length)return!1;s=s.map(function(e,s){return 100*(s%2?1-e:e)}),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var t=this.querySelectorAll("line");return t[0].setAttribute("x2",s[0]),t[0].setAttribute("y2",s[1]),t[1].setAttribute("x2",s[2]),t[1].setAttribute("y2",s[3]),!0},"*",function(){this._elt.innerHTML=''})},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",function(e){var s=parseFloat(e),t=e.match(/[a-z]+$/i);return!(!s||!t)&&(t=t[0],this.querySelector("circle").style.animationDuration=2*s+t,!0)},"*",function(){this._elt.innerHTML=''})},tokens:{time:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},t="token",i="active",a="flipped",r=function(e,s,t,i){this._elt=null,this._type=e,this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=i;var a=this;t||(t=["*"]),Array.isArray(t)||(t=[t]),t.forEach(function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)}),r.byType[e]=this};for(var e in r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do{if(e.hasAttribute&&e.hasAttribute("data-previewers"))return-1===(e.getAttribute("data-previewers")||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!e.classList.contains(t)||!this.isDisabled(e)){do{if(e.classList&&e.classList.contains(t)&&e.classList.contains(this._type))break}while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var e=function(e){var s=e.getBoundingClientRect(),t=s.left,i=s.top,a=document.documentElement.getBoundingClientRect();return t-=a.left,{top:i-=a.top,right:innerWidth-t-s.width,bottom:innerHeight-i-s.height,left:t,width:s.width,height:s.height}}(this._token);this._elt.classList.add(i),0=0?e[s]=function(e,s,t){var i="180deg";return/^(?:-?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|rad)|to\b|top|right|bottom|left)/.test(t[0])&&(i=t.shift()).indexOf("to ")<0&&(i.indexOf("top")>=0?i=i.indexOf("left")>=0?"to bottom right":i.indexOf("right")>=0?"to bottom left":"to bottom":i.indexOf("bottom")>=0?i=i.indexOf("left")>=0?"to top right":i.indexOf("right")>=0?"to top left":"to top":i.indexOf("left")>=0?i="to right":i.indexOf("right")>=0?i="to left":e&&(i.indexOf("deg")>=0?i=90-parseFloat(i)+"deg":i.indexOf("rad")>=0&&(i=Math.PI/2-parseFloat(i)+"rad"))),s+"("+i+","+t.join(",")+")"}(i,a,n):a.indexOf("radial")>=0?e[s]=function(e,s,t){if(t[0].indexOf("at")<0){var i="center",a="ellipse",n="farthest-corner";if(/\b(?:bottom|center|left|right|top)\b|^\d+/.test(t[0])&&(i=t.shift().replace(/\s*-?\d+(?:deg|rad)\s*/,"")),/\b(?:circle|closest|contain|cover|ellipse|farthest)\b/.test(t[0])){var r=t.shift().split(/\s+/);!r[0]||"circle"!==r[0]&&"ellipse"!==r[0]||(a=r.shift()),r[0]&&(n=r.shift()),"cover"===n?n="farthest-corner":"contain"===n&&(n="clothest-side")}return s+"("+a+" "+n+" at "+i+","+t.join(",")+")"}return s+"("+t.join(",")+")"}(0,a,n):e[s]=a+"("+n.join(",")+")"},function(){new Prism.plugins.Previewer("gradient",(function(e){return this.firstChild.style.backgroundImage="",this.firstChild.style.backgroundImage=s(e),!!this.firstChild.style.backgroundImage}),"*",(function(){this._elt.innerHTML="
    "}))}),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",(function(e){var s,t,i=parseFloat(e),a=e.match(/[a-z]+$/i);if(!i||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return t=100*i/s,t%=100,this[(i<0?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(t)+",500",!0}),"*",(function(){this._elt.innerHTML=''}))},tokens:{angle:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",(function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor}))},tokens:{color:[Prism.languages.css.hexcode].concat(Prism.languages.css.color)},languages:{css:!1,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!1,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",(function(e){var s=(e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e).match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);if(4===s.length){s=s.map((function(e,s){return 100*(s%2?1-e:e)})),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var t=this.querySelectorAll("line");return t[0].setAttribute("x2",s[0]),t[0].setAttribute("y2",s[1]),t[1].setAttribute("x2",s[2]),t[1].setAttribute("y2",s[3]),!0}return!1}),"*",(function(){this._elt.innerHTML=''}))},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",(function(e){var s=parseFloat(e),t=e.match(/[a-z]+$/i);return!(!s||!t||(t=t[0],this.querySelector("circle").style.animationDuration=2*s+t,0))}),"*",(function(){this._elt.innerHTML=''}))},tokens:{time:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},i="token",a="active",n="flipped",r=function(e,s,t,i){this._elt=null,this._type=e,this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=i;var a=this;t||(t=["*"]),Array.isArray(t)||(t=[t]),t.forEach((function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)})),r.byType[e]=this};for(var o in r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do{if(e.hasAttribute&&e.hasAttribute("data-previewers"))return-1===(e.getAttribute("data-previewers")||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!e.classList.contains(i)||!this.isDisabled(e)){do{if(e.classList&&e.classList.contains(i)&&e.classList.contains(this._type))break}while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){var e,s,t,i;if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var r=(s=(e=this._token.getBoundingClientRect()).left,t=e.top,s-=(i=document.documentElement.getBoundingClientRect()).left,{top:t-=i.top,right:innerWidth-s-e.width,bottom:innerHeight-t-e.height,left:s,width:e.width,height:e.height});this._elt.classList.add(a),r.top-this._elt.offsetHeight>0?(this._elt.classList.remove(n),this._elt.style.top=r.top+"px",this._elt.style.bottom=""):(this._elt.classList.add(n),this._elt.style.bottom=r.bottom+"px",this._elt.style.top=""),this._elt.style.left=r.left+Math.min(200,r.width/2)+"px"}else this.hide()},r.prototype.hide=function(){this._elt.classList.remove(a)},r.byLanguages={},r.byType={},r.initEvents=function(e,s){var t=[];r.byLanguages[s]&&(t=t.concat(r.byLanguages[s])),r.byLanguages["*"]&&(t=t.concat(r.byLanguages["*"])),e.addEventListener("mouseover",(function(e){var s=e.target;t.forEach((function(e){e.check(s)}))}),!1)},Prism.plugins.Previewer=r,Prism.hooks.add("before-highlight",(function(e){for(var s in t){var i=t[s].languages;if(e.language&&i[e.language]&&!i[e.language].initialized){var a=i[e.language];Array.isArray(a)||(a=[a]),a.forEach((function(a){var n,r,o,l;!0===a?(n="important",r=e.language,a=e.language):(n=a.before||"important",r=a.inside||a.lang,o=a.root||Prism.languages,l=a.skip,a=e.language),!l&&Prism.languages[a]&&(Prism.languages.insertBefore(r,n,t[s].tokens,o),e.grammar=Prism.languages[a],i[e.language]={initialized:!0})}))}}})),Prism.hooks.add("after-highlight",(function(e){(r.byLanguages["*"]||r.byLanguages[e.language])&&r.initEvents(e.element,e.language)})),t)t[o].create()}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js index f507edf165..a953fae81e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}}); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",(function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js index 56231c4aa7..6298b3b9cc 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var i={tab:/\t/,crlf:/\r\n/,lf:/\n/,cr:/\r/,space:/ /};Prism.hooks.add("before-highlight",function(r){s(r.grammar)})}function f(r,e){var i=r[e];switch(Prism.util.type(i)){case"RegExp":var a={};r[e]={pattern:i,inside:a},s(a);break;case"Array":for(var n=0,t=i.length;n /}}}}},Prism.hooks.add("wrap",function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");1 /}}}}},Prism.hooks.add("wrap",(function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");a.length>1;)a.shift(),t.push("ext-"+a.join("-"))}"."===e.content[0]&&t.push("dotfile")}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js index 622f0953d8..e84264ed93 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'}),Prism.hooks.add("before-sanity-check",function(e){var t=e.element;if(t.matches('script[type="text/plain"]')){var a=document.createElement("code"),c=document.createElement("pre");c.className=a.className=t.className;var n=t.dataset;return Object.keys(n||{}).forEach(function(e){Object.prototype.hasOwnProperty.call(n,e)&&(c.dataset[e]=n[e])}),a.textContent=e.code=e.code.replace(/<\/script(?:>|>)/gi,"<\/script>"),c.appendChild(a),t.parentNode.replaceChild(c,t),void(e.element=a)}if(!e.code){var o=t.childNodes;1===o.length&&"#comment"==o[0].nodeName&&(t.textContent=e.code=o[0].textContent)}})); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",(function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'})),Prism.hooks.add("before-sanity-check",(function(e){var t=e.element;if(t.matches('script[type="text/plain"]')){var a=document.createElement("code"),c=document.createElement("pre");c.className=a.className=t.className;var n=t.dataset;return Object.keys(n||{}).forEach((function(e){Object.prototype.hasOwnProperty.call(n,e)&&(c.dataset[e]=n[e])})),a.textContent=e.code=e.code.replace(/<\/script(?:>|>)/gi,"<\/script>"),c.appendChild(a),t.parentNode.replaceChild(c,t),void(e.element=a)}if(!e.code){var o=t.childNodes;1===o.length&&"#comment"==o[0].nodeName&&(t.textContent=e.code=o[0].textContent)}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js index 4d2f395544..c88b653526 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var s={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,var:1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var a;Prism.hooks.add("wrap",function(e){if(("tag-id"==e.type||"property"==e.type&&0!=e.content.indexOf("-")||"rule"==e.type&&0!=e.content.indexOf("@-")||"pseudo-class"==e.type&&0!=e.content.indexOf(":-")||"pseudo-element"==e.type&&0!=e.content.indexOf("::-")||"attr-name"==e.type&&0!=e.content.indexOf("data-"))&&-1===e.content.indexOf("<")&&("css"==e.language||"scss"==e.language||"markup"==e.language)){var t="https://webplatform.github.io/docs/",n=e.content;if("css"==e.language||"scss"==e.language)t+="css/","property"==e.type?t+="properties/":"rule"==e.type?(t+="atrules/",n=n.substring(1)):"pseudo-class"==e.type?(t+="selectors/pseudo-classes/",n=n.substring(1)):"pseudo-element"==e.type&&(t+="selectors/pseudo-elements/",n=n.substring(2));else if("markup"==e.language)if("tag-id"==e.type){if(!(a=function(e){var t=e.toLowerCase();{if(s.HTML[t])return"html";if(s.SVG[e])return"svg";if(s.MathML[e])return"mathml"}if(0!==s.HTML[t]&&"undefined"!=typeof document){var n=(document.createElement(e).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(n&&"Unknown"!=n)return s.HTML[t]=1,"html"}if((s.HTML[t]=0)!==s.SVG[e]&&"undefined"!=typeof document){var a=(document.createElementNS("http://www.w3.org/2000/svg",e).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return s.SVG[e]=1,"svg"}if((s.SVG[e]=0)!==s.MathML[e]&&0===e.indexOf("m"))return s.MathML[e]=1,"mathml";return s.MathML[e]=0,null}(e.content)||a))return;t+=a+"/elements/"}else if("attr-name"==e.type){if(!a)return;t+=a+"/attributes/"}t+=n,e.tag="a",e.attributes.href=t,e.attributes.target="_blank"}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var e={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,var:1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var t;Prism.hooks.add("wrap",(function(n){if(("tag-id"==n.type||"property"==n.type&&0!=n.content.indexOf("-")||"rule"==n.type&&0!=n.content.indexOf("@-")||"pseudo-class"==n.type&&0!=n.content.indexOf(":-")||"pseudo-element"==n.type&&0!=n.content.indexOf("::-")||"attr-name"==n.type&&0!=n.content.indexOf("data-"))&&-1===n.content.indexOf("<")&&("css"==n.language||"scss"==n.language||"markup"==n.language)){var a="https://webplatform.github.io/docs/",s=n.content;if("css"==n.language||"scss"==n.language)a+="css/","property"==n.type?a+="properties/":"rule"==n.type?(a+="atrules/",s=s.substring(1)):"pseudo-class"==n.type?(a+="selectors/pseudo-classes/",s=s.substring(1)):"pseudo-element"==n.type&&(a+="selectors/pseudo-elements/",s=s.substring(2));else if("markup"==n.language)if("tag-id"==n.type){if(!(t=function(t){var n=t.toLowerCase();if(e.HTML[n])return"html";if(e.SVG[t])return"svg";if(e.MathML[t])return"mathml";if(0!==e.HTML[n]&&"undefined"!=typeof document){var a=(document.createElement(t).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return e.HTML[n]=1,"html"}if(e.HTML[n]=0,0!==e.SVG[t]&&"undefined"!=typeof document){var s=(document.createElementNS("http://www.w3.org/2000/svg",t).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(s&&"Unknown"!=s)return e.SVG[t]=1,"svg"}return e.SVG[t]=0,0!==e.MathML[t]&&0===t.indexOf("m")?(e.MathML[t]=1,"mathml"):(e.MathML[t]=0,null)}(n.content)||t))return;a+=t+"/elements/"}else if("attr-name"==n.type){if(!t)return;a+=t+"/attributes/"}a+=s,n.tag="a",n.attributes.href=a,n.attributes.target="_blank"}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js index 04e9a28e61..98835b5879 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js @@ -1623,8 +1623,24 @@ Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|imple Prism.languages.insertBefore('javascript', 'keyword', { 'regex': { - // eslint-disable-next-line regexp/no-dupe-characters-character-class - pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + pattern: RegExp( + // lookbehind + // eslint-disable-next-line regexp/no-dupe-characters-character-class + /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + + // Regex pattern: + // There are 2 regex patterns here. The RegExp set notation proposal added support for nested character + // classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible + // with the only syntax, so we have to define 2 different regex patterns. + /\//.source + + '(?:' + + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + + '|' + + // `v` flag syntax. This supports 3 levels of nested character classes. + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + + ')' + + // lookahead + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source + ), lookbehind: true, greedy: true, inside: { diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 8e5f9ddd6d..025853e95d 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,45 +2,45 @@ # yarn lockfile v1 -"@abp/anchor-js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.2.1.tgz#701e01a9637800429cf3f0364e62b8351c3a0354" - integrity sha512-61+rrfSQyZacqUJ5qQxkoWYffWcd7AArkj8DmEHmFY4e28hH3P9eXMcuGBoJ85pXleAPEmVYswc/xZiTMNHkvg== +"@abp/anchor-js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.3.0-rc.1.tgz#ede6821e159291aae4e7f8b0863ed5e013f28237" + integrity sha512-84VMhSBguy12OJ9l8ONBAdsAeXxNYiRI0FYQUzuBG20zzTdJY/LvVxQGArdecM1ouLMhGzB3X3cdQQ4uHgHhUA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -49,180 +49,180 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/docs@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.2.1.tgz#111952a2da8e6e1ac20ed8eaa8a15854b2c92f7b" - integrity sha512-WZCCY73vyIpRu7hypPiP9CRr4Bvzkv3up0WeGQ4rK9LiZWNSxG9PXv4lYeD4cuHg0zgxH9d/6toYToaIJNqDCQ== +"@abp/docs@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.3.0-rc.1.tgz#c53b92172b5333187fccd95993960a259619a70c" + integrity sha512-hLKck5AFDIqk8RKaKmQzl+dzP6mluizcl2aeoUo6SoQE4uCKfInv6Np2Zak7HYdJkCrFvlOJUFkLi/RLX04eQA== dependencies: - "@abp/anchor-js" "~5.2.1" - "@abp/clipboard" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/popper.js" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/anchor-js" "~5.3.0-rc.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/popper.js" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/popper.js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.2.1.tgz#441a5be6889915fc09fe5d5e3c4b419d65a7b3bd" - integrity sha512-poQhd5EYjU2/udJWlDEd5mIPWmw6AzNOzAd5V4OUHMai+BHeuhIXQ6mopvxf9lpzytGoFe2ZIiQ547Wfq4Fl/Q== +"@abp/popper.js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.3.0-rc.1.tgz#f89dfe05885295af256106e340bae862261fd5a5" + integrity sha512-MJ6qMDOldWRF+tAMz2XF1adocZIO8t94q0J4LAwe+VxKkIT1eZOAjE0HubuW4ffwiknKnL/vy90DenmW4WKsDw== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 95b3f87bfc..021d1ba335 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index d5f6d1f237..7a4d606848 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json index 5cbf1e4a17..0bc1a6dfc4 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/virtual-file-explorer": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/virtual-file-explorer": "^5.3.0-rc.1" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index eb76a09ea5..d687b3b2c5 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,171 +41,171 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" -"@abp/virtual-file-explorer@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.2.1.tgz#3c4021307213c03f061ecdcb969f21ed3320a094" - integrity sha512-Ppg6zqZBOaryJhkr6KPhuwfPW8NypQDaMGXtCN6AY/usNOf91WlSZJ1uyou0rC6qT3N2ZgM6JIIp+nw9K6K0TA== +"@abp/virtual-file-explorer@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.3.0-rc.1.tgz#20f596d1e36b4f874e55b019ac1ba101cd398b80" + integrity sha512-xZSh+gQvJbVlR8AlLXWX6fvg9zMxWLJRMzB7ZY5g7QfOKalgKWoY0qTD1ugmUtHV2BdqL/2ZEbD4/A4LnBTRIQ== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index 65e1e1fcbb..dcf65cf2bf 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index 4b6e1a83fe..9298c36b87 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index fa198b0a4a..38d37ac91f 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -38,7 +38,7 @@ }, "private": true, "devDependencies": { - "@abp/utils": "~5.2.1", + "@abp/utils": "~5.3.0-rc.1", "@angular-devkit/build-angular": "13.3.5", "@angular-devkit/build-ng-packagr": "^0.1002.0", "@angular-devkit/schematics-cli": "~12.2.0", @@ -57,17 +57,17 @@ "@angular/platform-browser": "13.3.6", "@angular/platform-browser-dynamic": "13.3.6", "@angular/router": "13.3.6", - "@abp/ng.account": "~5.2.1", - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.feature-management": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.permission-management": "~5.2.1", - "@abp/ng.schematics": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.feature-management": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.permission-management": "~5.3.0-rc.1", + "@abp/ng.schematics": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngneat/spectator": "^10.0.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 9a44b1098b..8755b6ca4a 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 57b6c9c77d..111550d7ab 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 6b43da3490..15acda73f0 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=5.2.1", - "@abp/ng.theme.shared": ">=5.2.1", + "@abp/ng.core": ">=5.3.0-rc.1", + "@abp/ng.theme.shared": ">=5.3.0-rc.1", "@ng-bootstrap/ng-bootstrap": ">=10.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 564777912e..7bd3f93c5d 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~5.2.1", + "@abp/utils": "~5.3.0-rc.1", "angular-oauth2-oidc": "^13.0.1", "just-clone": "^3.2.1", "just-compare": "^1.4.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 2cbf8f50bd..81c3763ffc 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 7c05de9a6f..94e85bbeff 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.identity", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.permission-management": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 11fee9b967..a11fd3a7ba 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 7f6517164f..de74fcd725 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "5.2.1", + "version": "5.3.0-rc.1", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 5af6cdce19..3528eca556 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 9122c79f6c..84d7fcd6eb 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.feature-management": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index e40abda535..cea710df2b 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 3d61bd2036..7b57f7639f 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~5.2.1", + "@abp/ng.core": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngx-validate/core": "^0.1.1", diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 006b9c6a1b..3fc7fbc0be 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -124,6 +124,13 @@ dependencies: just-compare "^1.3.0" +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== + dependencies: + just-compare "^1.3.0" + "@ampproject/remapping@2.2.0", "@ampproject/remapping@^2.0.0", "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index bfae9b3f64..0f8c7a1a0d 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index f449a068c8..a2aabb2a01 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~5.2.1" + "@abp/aspnetcore.components.server.theming": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index 055934beac..fdf4b32ce9 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~5.2.1", - "@abp/font-awesome": "~5.2.1" + "@abp/bootstrap": "~5.3.0-rc.1", + "@abp/font-awesome": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 31a154e12c..9133ccbc63 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 4ce48a5cd5..6d71cc43b9 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,20 +10,20 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~5.2.1", - "@abp/bootstrap": "~5.2.1", - "@abp/bootstrap-datepicker": "~5.2.1", - "@abp/datatables.net-bs5": "~5.2.1", - "@abp/font-awesome": "~5.2.1", - "@abp/jquery-form": "~5.2.1", - "@abp/jquery-validation-unobtrusive": "~5.2.1", - "@abp/lodash": "~5.2.1", - "@abp/luxon": "~5.2.1", - "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", - "@abp/select2": "~5.2.1", - "@abp/sweetalert2": "~5.2.1", - "@abp/timeago": "~5.2.1", - "@abp/toastr": "~5.2.1" + "@abp/aspnetcore.mvc.ui": "~5.3.0-rc.1", + "@abp/bootstrap": "~5.3.0-rc.1", + "@abp/bootstrap-datepicker": "~5.3.0-rc.1", + "@abp/datatables.net-bs5": "~5.3.0-rc.1", + "@abp/font-awesome": "~5.3.0-rc.1", + "@abp/jquery-form": "~5.3.0-rc.1", + "@abp/jquery-validation-unobtrusive": "~5.3.0-rc.1", + "@abp/lodash": "~5.3.0-rc.1", + "@abp/luxon": "~5.3.0-rc.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.1", + "@abp/select2": "~5.3.0-rc.1", + "@abp/sweetalert2": "~5.3.0-rc.1", + "@abp/timeago": "~5.3.0-rc.1", + "@abp/toastr": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index 9147176dd2..8fe679a6b6 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "5.2.1", + "version": "5.3.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 9a9809573d..523e0bd759 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 58360f41e4..c01b119249 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.2.1", - "@abp/owl.carousel": "~5.2.1", - "@abp/prismjs": "~5.2.1", - "@abp/tui-editor": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.1", + "@abp/owl.carousel": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1", + "@abp/tui-editor": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 414748fc4f..63b9cc45d2 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 07b88bf56e..92c7777842 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 393c7a0fc3..ae94c81890 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 2197d7ac9b..9ca832f804 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 17d676756d..8568d81252 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jstree": "~5.2.1", - "@abp/slugify": "~5.2.1", - "@abp/tui-editor": "~5.2.1", - "@abp/uppy": "~5.2.1", - "@abp/codemirror": "~5.2.1" + "@abp/codemirror": "~5.3.0-rc.1", + "@abp/jstree": "~5.3.0-rc.1", + "@abp/slugify": "~5.3.0-rc.1", + "@abp/tui-editor": "~5.3.0-rc.1", + "@abp/uppy": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index b16a5f322f..4a53341291 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~5.2.1", - "@abp/star-rating-svg": "~5.2.1" + "@abp/highlight.js": "~5.3.0-rc.1", + "@abp/star-rating-svg": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index 90d02d96fa..8b4bb7d2f6 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~5.2.1", - "@abp/cms-kit.public": "~5.2.1" + "@abp/cms-kit.admin": "~5.3.0-rc.1", + "@abp/cms-kit.public": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index c9d5c77fdc..24f4f0b3c1 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 8a82924f24..9c30a65869 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~5.2.1" + "@abp/utils": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index ab4b7fd4f5..d6b822e95c 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index a6628e6c28..7faba34e17 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.2.1", + "@abp/datatables.net": "~5.3.0-rc.1", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 9599f3f3fb..e9a0dbaad6 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.2.1", + "@abp/datatables.net": "~5.3.0-rc.1", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 05ab5a041f..5d73dc54b4 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 42181c3fb4..fabbfac295 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~5.2.1", - "@abp/clipboard": "~5.2.1", - "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", - "@abp/popper.js": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/anchor-js": "~5.3.0-rc.1", + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.1", + "@abp/popper.js": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index cd90d02ce5..c75915fbd0 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index f34d2a867a..0aaf358dce 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index fce1c0e212..58ed646b2c 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 30384f80f9..7e03aa0d2a 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index e71325e186..511f0208c8 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~5.2.1", + "@abp/jquery-validation": "~5.3.0-rc.1", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 13154cfbcb..149c739724 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index bb6780647f..01ee351f99 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 2dd6eae521..76c20d13e4 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 3e8a5473ca..0119cf2400 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 89d57e2360..8ede864304 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index 665fc7b624..ba67d422a4 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index f737132f50..afe3f1867e 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 64d5bc8e6e..b1e0936283 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 55ef39b872..96e20b7ba8 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 6b48d7e709..e743511f73 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.2.1", - "@abp/core": "~5.2.1", + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/core": "~5.3.0-rc.1", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 86fb70e7a9..1cc32ccd85 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 9db6bd9df1..dc8e9f3684 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 3bccf0b808..22b7620f32 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 1a458a374e..7febb9673e 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 7373282e71..fb5348cc96 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index d8a3016057..d59a99dff4 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index c3acb8cefd..9817fb0fa1 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index b229a31256..7399669232 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/jquery": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index ffe8b4080a..afbd3a30cb 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index d03f9bd89f..f3641292a1 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "5.2.1", + "version": "5.3.0-rc.1", "scripts": { "prepublishOnly": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index 2dc5a68b53..bbcf3bc98f 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~5.2.1", + "@abp/vue": "~5.3.0-rc.1", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index a4b0bd8b85..46fc05cb8f 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 2e9144b3e5..012c855712 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 6fdafdd93a..c9c1f95ef6 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.1.1", "@angular/common": "~13.1.1", "@angular/compiler": "~13.1.1", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.1.2", "@angular-eslint/builder": "~13.0.1", "@angular-eslint/eslint-plugin": "~13.0.1", diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json index b99280b230..b7d47de013 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json index b99280b230..b7d47de013 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json index 8bad0a8f1d..7c51cc96bc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json index 8bad0a8f1d..7c51cc96bc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index cdddc9c658..2cc214007f 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json index b99280b230..b7d47de013 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json index b99280b230..b7d47de013 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json index 44e817e13e..09b98ca204 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 05f715c7c2..238087df41 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,14 +15,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -37,7 +37,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 0bfada49ae..e446c98dd0 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": ">=9", "@angular/core": ">=9", - "@abp/ng.core": ">=5.2.1", - "@abp/ng.theme.shared": ">=5.2.1" + "@abp/ng.core": ">=5.3.0-rc.1", + "@abp/ng.theme.shared": ">=5.3.0-rc.1" }, "dependencies": { "tslib": "^2.1.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json index b99280b230..b7d47de013 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json index 44e817e13e..09b98ca204 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file From db6eb87b7df2e311f6dc9a6a9165f9f1448b7b5c Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Thu, 5 May 2022 20:07:37 +0300 Subject: [PATCH 011/161] Update common.props --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index facc92f0bc..35dd3cfe40 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 5.3.0 + 5.4.0 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From a7e47f9ed1cab354284220b6fdac10136eb66a53 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Fri, 6 May 2022 09:28:34 +0300 Subject: [PATCH 012/161] update auto pr base branch --- .github/workflows/auto-pr.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index c62896d948..084b0977d0 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,24 +1,24 @@ -name: Merge branch rel-5.3 with rel-5.2 +name: Merge branch dev with rel-5.3 on: push: branches: - - rel-5.2 + - rel-5.3 jobs: merge-rel-5-3-with-rel-5-2: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: - ref: rel-5.3 + ref: dev - name: Reset promotion branch run: | - git fetch origin rel-5.2:rel-5.2 - git reset --hard rel-5.2 + git fetch origin rel-5.3:rel-5.3 + git reset --hard rel-5.3 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-5-2/${{github.run_number}} - title: Merge branch rel-5.3 with rel-5.2 - body: This PR generated automatically to merge rel-5.3 with rel-5.2. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/rel-5-3/${{github.run_number}} + title: Merge branch dev with rel-5.3 + body: This PR generated automatically to merge dev with rel-5.3. Please review the changed files before merging to prevent any errors that may occur. reviewers: ${{github.actor}} token: ${{ github.token }} From a5c4b861b4f0e03ff5a3cfd4dfbf74ade99875d9 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 6 May 2022 09:36:04 +0300 Subject: [PATCH 013/161] Add new localizations for community.abp.io --- .../Community/Localization/Resources/en-GB.json | 3 ++- .../AbpIoLocalization/Community/Localization/Resources/en.json | 3 ++- .../AbpIoLocalization/Community/Localization/Resources/tr.json | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json index e4112a4900..0283b963bc 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json @@ -102,6 +102,7 @@ "PostRequestMessageBody": "Here is the list of the requested posts by the Community. Do you want to write a requested post? Please click on the request and join the discussion.", "Language": "Language", "CreatePostLanguageInfo": "Language of the post", - "SeeMore": "See More" + "SeeMore": "See More", + "MemberNotPublishedPostYet": "This member hasn't published any posts yet." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index 54cf7e10fe..de04b36283 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -165,6 +165,7 @@ "SortBy": "Sort by", "NoPublishedEventsYet": "No published events yet.", "SubscribeYoutubeChannel": "Subscribe to the Youtube Channel", - "Enum:EventType:0": "Talks" + "Enum:EventType:0": "Talks", + "MemberNotPublishedPostYet": "This member hasn't published any posts yet." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json index 72d6c5e28d..0b118ed73d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json @@ -142,6 +142,7 @@ "MinimumSearchContent": "En az 3 karakter girmelisiniz!", "Volo.AbpIo.Domain:060001": "Kaynak URL (\"{PostUrl}\") Github URL'si değil", "Volo.AbpIo.Domain:060002": "Makale İçeriği Github(\"{PostUrl}\") kaynağında mevcut değil.", - "Volo.AbpIo.Domain:060003": "Makale içeriği bulunamadı!" + "Volo.AbpIo.Domain:060003": "Makale içeriği bulunamadı!", + "MemberNotPublishedPostYet": "Bu üye henüz bir gönderi yayınlamadı." } } \ No newline at end of file From 6d1c5cdeeb5912977c5db8a7c3b4a90fbe863c5f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 6 May 2022 17:20:09 +0800 Subject: [PATCH 014/161] Feature modal improvement --- .../Components/FeatureManagementModal.razor | 92 ++++++++++--------- .../FeatureManagementModal.cshtml | 6 +- ...tingManagementFeatureDefinitionProvider.cs | 15 +++ 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 1feaf59202..8bc5e9dfe7 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -6,7 +6,7 @@ @L["Features"] - + @if (Groups == null || !Groups.Any()) @@ -33,55 +33,61 @@
    @foreach (var feature in Groups[index].Features) { - var disabled = IsDisabled(feature.Provider.Name); +
    + @{ + var disabled = IsDisabled(feature.Provider.Name); - if (feature.ValueType is FreeTextStringValueType) - { - - @feature.DisplayName - - @if (feature.Description != null) + if (feature.ValueType is FreeTextStringValueType) { -
    @feature.Description
    + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    } -
    - } - if (feature.ValueType is SelectionStringValueType) - { - var items = ((SelectionStringValueType) feature.ValueType).ItemSource.Items; - - - @feature.DisplayName - - @if (feature.Description != null) + if (feature.ValueType is SelectionStringValueType) { -
    @feature.Description
    + var items = ((SelectionStringValueType) feature.ValueType).ItemSource.Items; + + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    } -
    - } - if (feature.ValueType is ToggleStringValueType) - { - - @feature.DisplayName - - @if (feature.Description != null) - { -
    @feature.Description
    + if (feature.ValueType is ToggleStringValueType) + { + + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    + } } - } +
    } @@ -95,4 +101,4 @@
    - + \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index 167de4943f..d537b099c4 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -58,7 +58,7 @@ group-style="margin-left: @(feature.Depth * 20)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @@ -81,7 +81,7 @@ group-style="margin-left: @(feature.Depth * 25)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @@ -105,7 +105,7 @@ @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 23f0c071fd..9f27dd2c60 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -18,6 +18,13 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:SettingManagementEnable"), L("Feature:SettingManagementEnableDescription"), new ToggleStringValueType()); + + group.AddFeature( + "MaxNumber", + "", + L("Max number"), + new FixedLocalizableString("Test feature max number"), + new FreeTextStringValueType()); settingEnableFeature.CreateChild( SettingManagementFeatures.AllowTenantsToChangeEmailSettings, @@ -26,6 +33,14 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:AllowTenantsToChangeEmailSettingsDescription"), new ToggleStringValueType(), isAvailableToHost: false); + + settingEnableFeature.CreateChild( + "MinNumber", + "", + L("Min number"), + new FixedLocalizableString("Test feature min number"), + new FreeTextStringValueType(), + isAvailableToHost: false); } private static LocalizableString L(string name) From b43f36ad6f4319ecb8e23738044cc683fc951776 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 6 May 2022 21:02:16 +0800 Subject: [PATCH 015/161] Update SettingManagementFeatureDefinitionProvider --- .../SettingManagementFeatureDefinitionProvider.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 9f27dd2c60..23f0c071fd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -18,13 +18,6 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:SettingManagementEnable"), L("Feature:SettingManagementEnableDescription"), new ToggleStringValueType()); - - group.AddFeature( - "MaxNumber", - "", - L("Max number"), - new FixedLocalizableString("Test feature max number"), - new FreeTextStringValueType()); settingEnableFeature.CreateChild( SettingManagementFeatures.AllowTenantsToChangeEmailSettings, @@ -33,14 +26,6 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:AllowTenantsToChangeEmailSettingsDescription"), new ToggleStringValueType(), isAvailableToHost: false); - - settingEnableFeature.CreateChild( - "MinNumber", - "", - L("Min number"), - new FixedLocalizableString("Test feature min number"), - new FreeTextStringValueType(), - isAvailableToHost: false); } private static LocalizableString L(string name) From 1310dacd415c5fda8f3bb7882bb7738bd6d53d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Fri, 6 May 2022 16:22:03 +0300 Subject: [PATCH 016/161] Changed type of password textbox in email settings page.The password was displayed as text. --- .../email-setting-group/email-setting-group.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html b/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html index ff6d51f692..8d23d2779d 100644 --- a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html +++ b/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html @@ -65,7 +65,7 @@
    - +
    From a418cb259ac12bdabaa34decda387dcd86dfd1a9 Mon Sep 17 00:00:00 2001 From: Cyril-hcj <31679398+Cyril-hcj@users.noreply.github.com> Date: Fri, 6 May 2022 21:40:42 +0800 Subject: [PATCH 017/161] Repair translation --- docs/zh-Hans/Distributed-Event-Bus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus.md b/docs/zh-Hans/Distributed-Event-Bus.md index f16aa0610f..da28d04a34 100644 --- a/docs/zh-Hans/Distributed-Event-Bus.md +++ b/docs/zh-Hans/Distributed-Event-Bus.md @@ -84,7 +84,7 @@ namespace AbpDemo #### 关于序列化的事件对象 -事件传输对象**必须是可序列化**的,因为将其传输到流程外时,它们将被序列化/反序列化为JSON或其他格式. +事件传输对象**必须是可序列化**的,因为将其传输到进程外时,它们将被序列化/反序列化为JSON或其他格式. 避免循环引用,多态,私有setter,并提供默认(空)构造函数,如果你有其他的构造函数.(虽然某些序列化器可能会正常工作),就像DTO一样. From f93a4a8b207a3a2ae83dc1583fb9d601b6d34b55 Mon Sep 17 00:00:00 2001 From: Cyril-hcj <31679398+Cyril-hcj@users.noreply.github.com> Date: Sat, 7 May 2022 21:52:17 +0800 Subject: [PATCH 018/161] Update Distributed-Event-Bus-Rebus-Integration.md --- docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md index 409b935ace..635af5c37a 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md @@ -1,10 +1,10 @@ # 分布式事件总线Rebus集成 -> 本文解释了**如何配置[Rebus](http://mookid.dk/category/rebus/)**做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. +> 本文解释了**如何配置[Rebus](http://mookid.dk/category/rebus/)** 做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. ## 安装 -使用ABP CLI添加[Volo.Abp.EventBus.Rebus[Volo.Abp.EventBus.Rebus](https://www.nuget.org/packages/Volo.Abp.EventBus.Rebus)NuGet包到你的项目: +使用ABP CLI添加[Volo.Abp.EventBus.Rebus](https://www.nuget.org/packages/Volo.Abp.EventBus.Rebus)NuGet包到你的项目: * 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. * 在你想要安装 `Volo.Abp.EventBus.Rebus` 包的 `.csproj` 文件目录打开命令行(终端). From 02a7aa1f3dc75a5b44fe3017f1ce1f2ecb94c04a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 9 May 2022 08:13:20 +0300 Subject: [PATCH 019/161] Update docs-nav.json --- docs/en/docs-nav.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 7d919cf063..7a2f606296 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -822,7 +822,7 @@ "path": "UI/Blazor/Basic-Theme.md" }, { - "text": "The Basic Theme", + "text": "LeptonX Lite", "path": "Themes/LeptonXLite/blazor.md" }, { From 3c62a7f1ce1a7a5d2cc8da174e083e42d4526a03 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 9 May 2022 14:09:31 +0800 Subject: [PATCH 020/161] Fix migrate-database.ps1 file --- templates/app-nolayers/aspnet-core/migrate-database.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/migrate-database.ps1 b/templates/app-nolayers/aspnet-core/migrate-database.ps1 index 3af47fcb21..5bdfdc04b2 100644 --- a/templates/app-nolayers/aspnet-core/migrate-database.ps1 +++ b/templates/app-nolayers/aspnet-core/migrate-database.ps1 @@ -1 +1 @@ -dotnet run --migrate-database \ No newline at end of file +dotnet run --project MyCompanyName.MyProjectName --migrate-database \ No newline at end of file From 98ab3e42917255969aecc4d4b44eb8fe5669ea78 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 9 May 2022 11:09:17 +0300 Subject: [PATCH 021/161] Cli: Create migrations after project generation --- .../CreateMigrationAndRunMigratorCommand.cs | 100 ++-------------- .../Volo/Abp/Cli/Commands/NewCommand.cs | 6 +- .../Commands/ProjectCreationCommandBase.cs | 41 ++++++- .../Commands/Services/DotnetEfToolManager.cs | 43 +++++++ .../Services/InitialMigrationCreator.cs | 111 ++++++++++++++++++ 5 files changed, 211 insertions(+), 90 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/InitialMigrationCreator.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index 6519ea70f9..38491551a8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -12,14 +13,18 @@ namespace Volo.Abp.Cli.Commands; public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientDependency { + private readonly InitialMigrationCreator _ınıtialMigrationCreator; public const string Name = "create-migration-and-run-migrator"; public ICmdHelper CmdHelper { get; } + public DotnetEfToolManager DotnetEfToolManager { get; } public ILogger Logger { get; set; } - public CreateMigrationAndRunMigratorCommand(ICmdHelper cmdHelper) + public CreateMigrationAndRunMigratorCommand(ICmdHelper cmdHelper, InitialMigrationCreator ınıtialMigrationCreator, DotnetEfToolManager dotnetEfToolManager) { + _ınıtialMigrationCreator = ınıtialMigrationCreator; CmdHelper = cmdHelper; + DotnetEfToolManager = dotnetEfToolManager; Logger = NullLogger.Instance; } @@ -39,110 +44,31 @@ public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientD throw new Exception("DbMigrator is not found!"); } - if (!IsDotNetEfToolInstalled()) - { - InstallDotnetEfTool(); - } + await DotnetEfToolManager.BeSureInstalledAsync(); - var tenantDbContextName = FindTenantDbContextName(dbMigrationsFolder); - var dbContextName = tenantDbContextName != null ? - FindDbContextName(dbMigrationsFolder) - : null; + var migrationsCreatedSuccessfully = await _ınıtialMigrationCreator.CreateAsync(commandLineArgs.Target, !nolayers); - var migrationOutput = AddMigrationAndGetOutput(dbMigrationsFolder, dbContextName, "Migrations"); - var tenantMigrationOutput = tenantDbContextName != null ? - AddMigrationAndGetOutput(dbMigrationsFolder, tenantDbContextName, "TenantMigrations") - : null; - - if (CheckMigrationOutput(migrationOutput) && CheckMigrationOutput(tenantMigrationOutput)) + if (migrationsCreatedSuccessfully) { if (nolayers) { - // Migration added successfully - CmdHelper.RunCmd("cd \"" + Path.GetDirectoryName(Path.Combine(dbMigrationsFolder, "MyCompanyName.MyProjectName")) + "\" && dotnet run --migrate-database"); + CmdHelper.RunCmd("dotnet run --migrate-database", Path.GetDirectoryName(Path.Combine(dbMigrationsFolder, "MyCompanyName.MyProjectName"))); } else { - // Migration added successfully - CmdHelper.RunCmd("cd \"" + Path.GetDirectoryName(dbMigratorProjectPath) + "\" && dotnet run"); + CmdHelper.RunCmd("dotnet run", Path.GetDirectoryName(dbMigratorProjectPath)); } await Task.CompletedTask; } else { - var exceptionMsg = "Migrations failed! A migration command didn't run successfully:" + - Environment.NewLine + - Environment.NewLine + migrationOutput + - Environment.NewLine + - Environment.NewLine + tenantMigrationOutput; + var exceptionMsg = "Migrations failed! A migration command didn't run successfully."; Logger.LogError(exceptionMsg); throw new Exception(exceptionMsg); } } - - private string FindTenantDbContextName(string dbMigrationsFolder) - { - var tenantDbContext = Directory.GetFiles(dbMigrationsFolder, "*TenantMigrationsDbContext.cs", SearchOption.AllDirectories) - .FirstOrDefault() ?? - Directory.GetFiles(dbMigrationsFolder, "*TenantDbContext.cs", SearchOption.AllDirectories) - .FirstOrDefault(); - - if (tenantDbContext == null) - { - return null; - } - - return Path.GetFileName(tenantDbContext).RemovePostFix(".cs"); - } - - private string FindDbContextName(string dbMigrationsFolder) - { - var dbContext = Directory.GetFiles(dbMigrationsFolder, "*MigrationsDbContext.cs", SearchOption.AllDirectories) - .FirstOrDefault(fp => !fp.EndsWith("TenantMigrationsDbContext.cs")) ?? - Directory.GetFiles(dbMigrationsFolder, "*DbContext.cs", SearchOption.AllDirectories) - .FirstOrDefault(fp => !fp.EndsWith("TenantDbContext.cs")); - - if (dbContext == null) - { - return null; - } - - return Path.GetFileName(dbContext).RemovePostFix(".cs"); - } - - private string AddMigrationAndGetOutput(string dbMigrationsFolder, string dbContext, string outputDirectory) - { - var dbContextOption = string.IsNullOrWhiteSpace(dbContext) - ? string.Empty - : $"--context {dbContext}"; - - var addMigrationCmd = $"cd \"{dbMigrationsFolder}\" && " + - $"dotnet ef migrations add Initial --output-dir {outputDirectory} {dbContextOption}"; - - return CmdHelper.RunCmdAndGetOutput(addMigrationCmd, out int exitCode); - } - - private bool IsDotNetEfToolInstalled() - { - var output = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g", out int exitCode); - return output.Contains("dotnet-ef"); - } - - private static bool CheckMigrationOutput(string output) - { - return output == null || (output.Contains("Done.") && - output.Contains("To undo this action") && - output.Contains("ef migrations remove")); - } - - private void InstallDotnetEfTool() - { - Logger.LogInformation("Installing dotnet-ef tool..."); - CmdHelper.RunCmd("dotnet tool install --global dotnet-ef"); - Logger.LogInformation("dotnet-ef tool is installed."); - } - + private static string GetDbMigratorProjectPath(string dbMigrationsFolderPath) { var srcFolder = Directory.GetParent(dbMigrationsFolderPath); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 526ae77363..2974e01fd4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -32,8 +32,9 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, IInstallLibsService installLibsService, - AngularPwaSupportAdder angularPwaSupportAdder) - : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService, angularPwaSupportAdder) + AngularPwaSupportAdder angularPwaSupportAdder, + InitialMigrationCreator ınitialMigrationCreator) + : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService, angularPwaSupportAdder, ınitialMigrationCreator) { TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; @@ -79,6 +80,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'"); RunGraphBuildForMicroserviceServiceTemplate(projectArgs); + await CreateInitialMigrationsAsync(projectArgs); await RunInstallLibsForWebTemplateAsync(projectArgs); ConfigurePwaSupportForAngular(projectArgs); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 6e280d7dc3..74a23a6cbc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -6,6 +6,7 @@ using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using NUglify.Helpers; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; @@ -26,6 +27,7 @@ public abstract class ProjectCreationCommandBase public ICmdHelper CmdHelper { get; } public IInstallLibsService InstallLibsService { get; } public AngularPwaSupportAdder AngularPwaSupportAdder { get; } + public InitialMigrationCreator InitialMigrationCreator { get; } public ILogger Logger { get; set; } public ProjectCreationCommandBase( @@ -33,13 +35,15 @@ public abstract class ProjectCreationCommandBase SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, IInstallLibsService installLibsService, - AngularPwaSupportAdder angularPwaSupportAdder) + AngularPwaSupportAdder angularPwaSupportAdder, + InitialMigrationCreator ınitialMigrationCreator) { ConnectionStringProvider = connectionStringProvider; SolutionPackageVersionFinder = solutionPackageVersionFinder; CmdHelper = cmdHelper; InstallLibsService = installLibsService; AngularPwaSupportAdder = angularPwaSupportAdder; + InitialMigrationCreator = ınitialMigrationCreator; Logger = NullLogger.Instance; } @@ -337,6 +341,41 @@ public abstract class ProjectCreationCommandBase } } + protected async Task CreateInitialMigrationsAsync(ProjectBuildArgs projectArgs) + { + if (projectArgs.DatabaseProvider == DatabaseProvider.MongoDb) + { + return; + } + + var efCoreProjectPath = string.Empty; + bool isLayeredTemplate; + + switch (projectArgs.TemplateName) + { + case AppTemplate.TemplateName: + case AppProTemplate.TemplateName: + efCoreProjectPath = Directory.GetFiles(projectArgs.OutputFolder, "*EntityFrameworkCore.csproj", SearchOption.AllDirectories).FirstOrDefault(); + isLayeredTemplate = true; + break; + case AppNoLayersTemplate.TemplateName: + case AppNoLayersProTemplate.TemplateName: + efCoreProjectPath = Directory.GetFiles(projectArgs.OutputFolder, "*.csproj", SearchOption.AllDirectories).FirstOrDefault(); + isLayeredTemplate = false; + break; + default: + return; + } + + if (string.IsNullOrWhiteSpace(efCoreProjectPath)) + { + Logger.LogWarning("Couldn't find EntityFrameworkCore project to create initial migrations!"); + return; + } + + await InitialMigrationCreator.CreateAsync(Path.GetDirectoryName(efCoreProjectPath), isLayeredTemplate); + } + protected void ConfigurePwaSupportForAngular(ProjectBuildArgs projectArgs) { var isAngular = projectArgs.UiFramework == UiFramework.Angular; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs new file mode 100644 index 0000000000..cbeb6ee9d4 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Utils; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands.Services; + +public class DotnetEfToolManager : ISingletonDependency +{ + public ICmdHelper CmdHelper { get; } + public ILogger Logger { get; set; } + + public DotnetEfToolManager(ICmdHelper cmdHelper) + { + CmdHelper = cmdHelper; + + Logger = NullLogger.Instance; + } + + public async Task BeSureInstalledAsync() + { + if (IsDotNetEfToolInstalled()) + { + return; + } + + InstallDotnetEfTool(); + } + + private bool IsDotNetEfToolInstalled() + { + var output = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g"); + return output.Contains("dotnet-ef"); + } + + private void InstallDotnetEfTool() + { + Logger.LogInformation("Installing dotnet-ef tool..."); + CmdHelper.RunCmd("dotnet tool install --global dotnet-ef"); + Logger.LogInformation("dotnet-ef tool is installed."); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/InitialMigrationCreator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/InitialMigrationCreator.cs new file mode 100644 index 0000000000..860fcef60f --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/InitialMigrationCreator.cs @@ -0,0 +1,111 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Utils; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands.Services; + +public class InitialMigrationCreator : ITransientDependency +{ + public ICmdHelper CmdHelper { get; } + public DotnetEfToolManager DotnetEfToolManager { get; } + public ILogger Logger { get; set; } + + public InitialMigrationCreator(ICmdHelper cmdHelper, DotnetEfToolManager dotnetEfToolManager) + { + CmdHelper = cmdHelper; + DotnetEfToolManager = dotnetEfToolManager; + + Logger = NullLogger.Instance; + } + + public async Task CreateAsync(string targetProjectFolder, bool layeredTemplate = true) + { + if (targetProjectFolder == null || !Directory.Exists(targetProjectFolder)) + { + Logger.LogError($"This path doesn't exist: {targetProjectFolder}"); + return false; + } + + Logger.LogInformation("Creating initial migrations..."); + + await DotnetEfToolManager.BeSureInstalledAsync(); + + var tenantDbContextName = FindTenantDbContextName(targetProjectFolder); + var dbContextName = tenantDbContextName != null ? + FindDbContextName(targetProjectFolder) + : null; + + var migrationOutput = AddMigrationAndGetOutput(targetProjectFolder, dbContextName, "Migrations"); + var tenantMigrationOutput = tenantDbContextName != null ? + AddMigrationAndGetOutput(targetProjectFolder, tenantDbContextName, "TenantMigrations") + : null; + + var migrationSuccess = CheckMigrationOutput(migrationOutput) && CheckMigrationOutput(tenantMigrationOutput); + + if (migrationSuccess) + { + Logger.LogInformation("Initial migrations are created."); + } + else + { + Logger.LogError("Creating initial migrations process is failed! Details:" + Environment.NewLine + + migrationOutput + Environment.NewLine + + tenantMigrationOutput + Environment.NewLine); + } + + return migrationSuccess; + } + + private string FindTenantDbContextName(string projectFolder) + { + var tenantDbContext = Directory.GetFiles(projectFolder, "*TenantMigrationsDbContext.cs", SearchOption.AllDirectories) + .FirstOrDefault() ?? + Directory.GetFiles(projectFolder, "*TenantDbContext.cs", SearchOption.AllDirectories) + .FirstOrDefault(); + + if (tenantDbContext == null) + { + return null; + } + + return Path.GetFileName(tenantDbContext).RemovePostFix(".cs"); + } + + private string FindDbContextName(string projectFolder) + { + var dbContext = Directory.GetFiles(projectFolder, "*MigrationsDbContext.cs", SearchOption.AllDirectories) + .FirstOrDefault(fp => !fp.EndsWith("TenantMigrationsDbContext.cs")) ?? + Directory.GetFiles(projectFolder, "*DbContext.cs", SearchOption.AllDirectories) + .FirstOrDefault(fp => !fp.EndsWith("TenantDbContext.cs")); + + if (dbContext == null) + { + return null; + } + + return Path.GetFileName(dbContext).RemovePostFix(".cs"); + } + + private string AddMigrationAndGetOutput(string dbMigrationsFolder, string dbContext, string outputDirectory) + { + var dbContextOption = string.IsNullOrWhiteSpace(dbContext) + ? string.Empty + : $"--context {dbContext}"; + + var addMigrationCmd = $"dotnet ef migrations add Initial --output-dir {outputDirectory} {dbContextOption}"; + + return CmdHelper.RunCmdAndGetOutput(addMigrationCmd, out int exitCode, dbMigrationsFolder); + } + + private static bool CheckMigrationOutput(string output) + { + return output == null || (output.Contains("Done.") && + output.Contains("To undo this action") && + output.Contains("ef migrations remove")); + } +} \ No newline at end of file From eeb8ae3389bd4c80fa50c3fe4ec0f5c07cfee4fb Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 9 May 2022 11:13:20 +0300 Subject: [PATCH 022/161] Update ProjectCreationCommandBase.cs --- .../Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 74a23a6cbc..40d902fb0e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -369,7 +369,7 @@ public abstract class ProjectCreationCommandBase if (string.IsNullOrWhiteSpace(efCoreProjectPath)) { - Logger.LogWarning("Couldn't find EntityFrameworkCore project to create initial migrations!"); + Logger.LogWarning("Couldn't find the project to create initial migrations!"); return; } From 3573a199d9d3f1522449b4b4287261c7763597e8 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Mon, 9 May 2022 13:31:56 +0300 Subject: [PATCH 023/161] add `How to contribute to abp.io as a frontend developer` docs --- ...ntribute-abp.io-as-a-frontend-developer.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md diff --git a/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md b/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md new file mode 100644 index 0000000000..af2a4c6ff3 --- /dev/null +++ b/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md @@ -0,0 +1,46 @@ +# How to contribute to abp.io as a frontend developer + +## How to setup development environment + +### Pre-requirements + +- Dotnet core SDK https://dotnet.microsoft.com/en-us/download +- Nodejs LTS https://nodejs.org/en/ +- Docker https://docs.docker.com/engine/install +- Angular CLI. https://angular.io/guide/what-is-angular#angular-cli +- Abp CLI https://docs.abp.io/en/abp/latest/cli +- A code editor + +### Sample docker commands + +You need to install SQL Server and Redis. You can install these programs without docker, but my example uses docker containers. Your computer should have Docker Engine. Then open the terminal en execute the commands one by one. +For the Sql Server + +docker run -v sqlvolume:/var/opt/mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourpassword -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04 + +For the Redis + +docker run -p 6379:6379 -d redis + +Then we are ready to download and execute the code. + +## Folder Structure + +The app has a backend written in .net core (c#) and an angular app. It would help if you ran both of them. + +### Running Backend App + +The path of the Backend app is “templates\app\aspnet-core.” If you want to work with dockerized SQL Server, you should change connection strings for running with docker. The path of the connection string is +`templates\app\aspnet-core\src\MyCompanyName.MyProjectName.DbMigrator\appsettings.json`. + +Before running the backend, you should run the Db migrator project. The DbMigrator created initial tables and values. The path of DbMigrator is `templates\app\aspnet-core\src\MyCompanyName.MyProjectName.DbMigrator`. Open a terminal in the path and execute the command `dotnet run` in terminal + +Next step you should go to path of backend host project. The path is `templates\app\aspnet-core\src\MyCompanyName.MyProjectName.HttpApi.HostWithIds`. Open a terminal in the path and execute the command `dotnet run` in terminal + +Your backend should be running successfully + +### Running Frontend App + +There is a demo app. The path of the demo app is `npm\ng-packs\apps\dev-app`. The demo app is connected to the packages with local references. Open the terminal in `npm\ng-packs\apps\dev-app` and execute `yarn` or `npm i` in terminal. After the package installed run `npm start` or `yarn start`. + +The repo uses Nx and packages connected with `local references`. The packages path is `”npm\ng-packs\packages` From 32fcacb77b1db994ca3e73d6464096a745b48dc6 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 9 May 2022 14:11:21 +0300 Subject: [PATCH 024/161] Initial commit for v5.3 blog post --- .../2022-05-09 v5_3_Preview/POST.md | 96 ++++++++++++++++++ .../app-nolayers-get-started.png | Bin 0 -> 124735 bytes .../community-talks-2022.4.png | Bin 0 -> 380254 bytes .../2022-05-09 v5_3_Preview/cover-53.png | Bin 0 -> 55531 bytes 4 files changed, 96 insertions(+) create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/app-nolayers-get-started.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/community-talks-2022.4.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/cover-53.png diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md new file mode 100644 index 0000000000..60e5850e96 --- /dev/null +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -0,0 +1,96 @@ +# ABP.IO Platform 5.3 RC.1 Has Been Released + +Today, we are happy to release the [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) version **5.3 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version. + +> **The planned release date for the [5.3.0 Stable](https://github.com/abpframework/abp/milestone/69) version is May 31, 2022**. + +Please try this version and provide feedback for a more stable ABP version 5.3! Thank you all. + +## Get Started with the 5.3 RC + +Follow the steps below to try the version 5.3.0 RC today: + +1) **Upgrade** the ABP CLI to version `5.3.0-rc.1` using a command line terminal: + +````bash +dotnet tool update Volo.Abp.Cli -g --version 5.3.0-rc.1 +```` + +​ **or install** it if you haven't before: + +````bash +dotnet tool install Volo.Abp.Cli -g --version 5.3.0-rc.1 +```` + +2) Create a **new application** with the `--preview` option: + +````bash +abp new BookStore --preview +```` + +See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. + +> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**. + +You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)**. + +--- + + +## Migration Notes & Breaking Changes + +--- + +## What's New with ABP Framework 5.2? + +In this section, I will introduce some major features released with this version. Here, a brief list of titles explained in the next sections: + +* Single-layer option added to the [*Get Started*](https://abp.io/get-started) page +* PWA Support for Blazor WASM & Angular UIs +* Introduce the `Volo.Abp.Gdpr.Abstractions` package +* Batch Publish Events from Outbox to the Event Bus +* Improvements on **eShopOnAbp** project +* LeptonX Lite Documentations & Status of the Project +* Progress of the OpenIddict module +* New Deployment Documentations +* Other news... + +### Single-layer Option on Get Started Page + +We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've also add this startup template option to the *Get Started* page, so anyone can also create a single layer application template via *Get Started* page. + +![Get Started Page / app-nolayers](./app-nolayers-get-started.png) + +### PWA Support for Blazor WASM & Angular UIs + +--- + +## Community News + +### New ABP Community Posts + +* [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared couple of video posts about the ABP Microservice solution. +* [Francisco Kadzi](https://github.com/CiscoNinja) has created his first ABP Community article that shows how to ["Customize ABP Angular Application UI with AdminLTE"](https://community.abp.io/posts/customize-abp-angular-application-ui-with-adminlte.-7qu1m67s). +* [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show how to ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. +* Manoj Kumar submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). +* [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read from [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). + +### ABP Community Talks 2022.4 - "How can you contribute to the open source ABP Framework?" (May 10, 2022 - 17:00 UTC) + +![](./community-talks-2022.4.png) + +We've [asked you to pick the topic of the next Community Talks](https://twitter.com/abpframework/status/1514567683072745474?s=20&t=rJfHrB3DYDNsk2EXS8zBBQ) and you've chosen the "How to contribute to open source ABP Framework?" for the next talk topic. So, in this Community Talk, we will be talking about "How to contribute to ABP Framework" with one of the top contributors [Ismail Yılmaz](https://github.com/iyilm4z). The event will be on **May 10, 2022, at 17:00 (UTC)** on YouTube. + +> You can register for the event from [here](https://kommunity.com/volosoft/events/abp-community-talks-20224-how-to-contribute-to-the-open-source-abp-framework-d9b50664), if you haven't registered yet. + +You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) to inform about further ABP events and videos. + +### Discord Server + +We've created an official ABP Discord server so the ABP Community can interact with each other. + +Thanks to the ABP Community, **700+** people joined our Discord Server so far and it grows every day. + +> You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. + +You can join our Discord Server from [here](https://discord.gg/abp), if you haven't yet. \ No newline at end of file diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/app-nolayers-get-started.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/app-nolayers-get-started.png new file mode 100644 index 0000000000000000000000000000000000000000..e030dc50b994489a99b0ecdab98607020fe77686 GIT binary patch literal 124735 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Ν@uis}s|I9UOzl@t)7aq@0wOe1; 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 Pe@C@-52YS7z5agyX^aIs literal 0 HcmV?d00001 diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/community-talks-2022.4.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/community-talks-2022.4.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5f374ff49e68326728d5158e7b5e8a912f7873 GIT binary patch literal 380254 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

    X^C^|W_SKpy24+hIZa_Ho!n|ooZzW@! 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 c%{C-Xq&aOnMW-P_n?1 Date: Mon, 9 May 2022 20:50:32 +0800 Subject: [PATCH 025/161] Update Distributed-Event-Bus-Kafka-Integration.md --- docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md index f621a95fae..c94c10873c 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md @@ -4,7 +4,7 @@ ## 安装 -使用ABP CLI添加[Volo.Abp.EventBus.Kafka[Volo.Abp.EventBus.Kafka](https://www.nuget.org/packages/Volo.Abp.EventBus.Kafka)NuGet包到你的项目: +使用ABP CLI添加[Volo.Abp.EventBus.Kafka](https://www.nuget.org/packages/Volo.Abp.EventBus.Kafka)NuGet包到你的项目: * 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. * 在你想要安装 `Volo.Abp.EventBus.Kafka` 包的 `.csproj` 文件目录打开命令行(终端). @@ -20,7 +20,7 @@ 这是配置Kafka设置最简单的方法. 它也非常强大,因为你可以使用[由AspNet Core支持的](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)的任何其他配置源(如环境变量). -**示例:最小化配置与默认配置连接到本地的Kafka服务器** +**示例:使用默认配置连接到本地Kafka服务器的最小配置** ````json @@ -160,4 +160,4 @@ Configure(options => }); ```` -使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. \ No newline at end of file +使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. From e18a190867c4098e6b119266489707ea875bf77d Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 9 May 2022 16:54:56 +0300 Subject: [PATCH 026/161] Add the "What's New with ABP Framework 5.3?" section to blog-post --- .../2022-05-09 v5_3_Preview/POST.md | 96 +++++++++++++++--- .../deployment-documentation.png | Bin 0 -> 4595 bytes .../leptonx-lite-documentations.png | Bin 0 -> 13496 bytes 3 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/deployment-documentation.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/leptonx-lite-documentations.png diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index 60e5850e96..53376e24af 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -1,4 +1,4 @@ -# ABP.IO Platform 5.3 RC.1 Has Been Released +# ABP.IO Platform 5.3 RC Has Been Released Today, we are happy to release the [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) version **5.3 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version. @@ -16,7 +16,7 @@ Follow the steps below to try the version 5.3.0 RC today: dotnet tool update Volo.Abp.Cli -g --version 5.3.0-rc.1 ```` -​ **or install** it if you haven't before: +**or install** it if you haven't before: ````bash dotnet tool install Volo.Abp.Cli -g --version 5.3.0-rc.1 @@ -34,14 +34,13 @@ See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all t You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)**. ---- - - ## Migration Notes & Breaking Changes ---- +There is only one breaking changes in this version upgrade and it's explained below. + +* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to upgrade your projects that uses **AutoMapper** library (probably your `*.Application` project) to **netstandard2.1** or **net6** if it's **netstandard2.0**. See [#12189](https://github.com/abpframework/abp/pull/12189). -## What's New with ABP Framework 5.2? +## What's New with ABP Framework 5.3? In this section, I will introduce some major features released with this version. Here, a brief list of titles explained in the next sections: @@ -50,20 +49,91 @@ In this section, I will introduce some major features released with this version * Introduce the `Volo.Abp.Gdpr.Abstractions` package * Batch Publish Events from Outbox to the Event Bus * Improvements on **eShopOnAbp** project -* LeptonX Lite Documentations & Status of the Project -* Progress of the OpenIddict module -* New Deployment Documentations +* LeptonX Lite Documentations & Project Status & Roadmap +* OpenIddict Module +* Deployment Documentations * Other news... -### Single-layer Option on Get Started Page +### Single-layer Option on *Get Started* Page -We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've also add this startup template option to the *Get Started* page, so anyone can also create a single layer application template via *Get Started* page. +We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've added this startup template option to the *Get Started* page. + +*You can examine the screenshot below to see how to create an `app-nolayers` template from the ["Get Started"](https://abp.io/get-started) page.* ![Get Started Page / app-nolayers](./app-nolayers-get-started.png) ### PWA Support for Blazor WASM & Angular UIs ---- +With v5.3 ABP supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. +Example: + +```bash +abp new MyProgressiveWebApp -u blazor --pwa +``` + +### Introduce the `Volo.Abp.Gdpr.Abstractions` package + +A new `Volo.Abp.Gdpr.Abstractions` package is added to the framework. + +Anyone can use this package to use the pre-defined ETOs and implement GDPR-related operations for their own applications. + +In that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. + +### Batch Publish Events from Outbox to the Event Bus + +We've introduced the "Transactional Outbox & Inbox Patterns" in [**v5.0**](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released), it was one of the most awaited features by distributed software developers. + +We've made some optimizations for the **Batch Event Publishing** in this version, you can examine the related development from [here](https://github.com/abpframework/abp/pull/11243). After the optimization, the results are impressive. + +| | Before | After | +|---|---|---| +| **RabbitMQ** | 50080ms | 547ms | +| **Kafka** | 15303ms | 475ms | +| **Azure (Remote Service)** | 116157ms | 1534ms | +| **Rebus (RabbitMQ transport)** | 26094ms | 560ms | + +*You can see the optimization results above for "Batch Publishing (1000 Events)"* + + +### Improvements on eShopOnAbp project + +### LeptonX Lite Documentations & Project Status & Roadmap + +It is finally here, we've released the **1.0.0-beta.1** version for the **LeptonX Lite**. + +![](./leptonx-lite-documentations.png) + +Lepton X Lite documents have been written for the three UI types within this version. You can see the related documentation from the screenshot above. You can follow these documentations and try the new **LeptonX Lite Theme**. + +We don't suggest using the **beta.1** version on production but we highly demand you to test the **LeptonX Lite** and provide feedback to us. It's really important for us to be able to release a more stable version. Thanks in advance. + +For the following versions (beta.2 and RC versions), we will focus on; + +* Fixing the reported bugs from the community +* Providing documentations as much as possible +* Adding new custom pages to demo + + +### OpenIddict Module + +### Deployment Documentations + +Deploying an ABP based application is not so different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. However, we wanted to prepare a "Deployment Guide" to mention the important points and considerations. + +![](./deployment-documentation.png) + +We've created two new deployment documentations, you can find them under the ["Deployment"](https://docs.abp.io/en/abp/5.3/Deployment/Index) section of our documentation website. + +In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Deployment/Clustered-Environment) documentation, we've documented the topics that you should consider when you are developing your application to a clustered environment and explains how you can deal with these topics in your ABP based application. + +### Other News + +* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. See [#12189](https://github.com/abpframework/abp/pull/12189). +* Global Features was only accessible from C# code. From this version Global Features can be provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). +* Get the user's detailed informations (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). +* Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). + +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), that contains a list of all issues and pull requests closed with this version. ## Community News diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/deployment-documentation.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/deployment-documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..3dde546b153d7ada02f94b81d090c57d9c2a6509 GIT binary patch literal 4595 zcmb7IcQhQ{wjQE|j2b37iOvuuYK-1{lqjS3FzV|vg_L`0HBK3 zP*yMswA#xdgVXlW4|HbB3&b9(E0ifJvfU?j)mysRZ$ugB8uEUNhhe<2_e)jUgy_JhT_uCVJHxa-h=<_3=Ev z9h>(JaK2ltxaEVZU;DZ?-}4m|@BsiFjv;FR;5)uDAt0YNo)jR@Pe}`SZNkO}094Bx z0RZNaWdJ}uz5yPaYc~nbL;{+qz^MZqj*)` z{u2E<5KxH!LuVFqt7>_L$k1XQkg#^o_r$iF3PvUq?Nhjb-o#Q9M|FG2HbdATugjDR zyyodDDl2I)d|BD;)@XeHptXd+%JDkw?s&~xw+swjk$0SKL;Cplv|=R@Zb=5X@&iul zBa=M)%nu2g`B$Mk(&19fx~cae969F?CwOt&>e14Xxj$X@OWRyApUOoD>**X5rmJ#< z43kluXOv-3)#JgyOg2;YjOD)wshXL}1l+f_Z>Y{^D`Q2&D<`Z=G{s5l!IYi7+D0!_ zbhXQ}VEvm;^e(^GPR`oY1i!Z{aEgf^!pqs;r<_TV@u zzQMK+Gh%#?9ds;eYZpl6QqC>yik7nMOfExDXpb{F->@uyyO!mgy=Ieh;nb$BfaRN@LNtYkf1C=rj%4Hmg)@=V zKq?%9xQ|wcc2?7r|4GbX=nFRoLT}wsWzIkwa^_I5k!gF>n*e6A6<@-T<&IM-;nOjeUDEX{Y=G3grtaEgS= zRIt~!Te&b?L}wKq5iVqzMVd-SnSoIk-lK6Mvkt z+(w15dl}VOfj+i4-HtP@;Vik~S^-m%3@jH5hWtwv)bV%cO^si@8v0o~?rp78aP#DY zR;b!NM>1o)R}hHfG>?`}!Ek|+$}uZ%sM`CuWk=hmV1$bol#}g`Q-Z5u39Q2*3DXb& zTH{Sn994<+Ce;!kC^;O`$l&iX=^8hx#FcXcA4nxju|*WNbJp%Ut~0*}b;9Mv}Trft-;iWt$h-;JGLvbl*m-z1?CxPl(Zu~j9RJY`|B@*gk~k%Hl%e2Loj`j=Y0?$8Sz)Rn8`j#K zf@-P*Q#Mr=DEGAFe6qS+r_(?V!ItWiGOCYb;by4)lq?aS8p=Xie#Tlq?Up2$^DrNU z!`>(8Y+R9C=199$3*@r}nMm$VEN~iUu(<`STO^{;CF6koW~zj4giAIV;w{LJ=ZX;h!K)7H-n*>N z>`9q~)nwUiz#~Ro(>PVb{p`ejo3T%+C@1 zYUALBs1Fa2AYL1@Kvn7VVfiXxl6hChQo&<>n-NKS2{rtHBAI*5YKp7MGOrit&i7UV zA7giX1$;-pl#F℞Y+ZSaQ^86_YKLY!_S zN^m5kJ-~|y*4y$PCiZ5w+NC{wXZZFHJm@AW|#2J)9eU-d`-*0!O?*m!5rIJv(th(oKVdRtU{qet> zleZ>NrIae&^aOEtC%t@-JHPy|mnS6RuwuE4G(#ZaXz7pNyRQ1v(Z|m%bqsN>j6v~@ z7_!fFli6P#?0Ji|6+FH|)xryZ{XkZogkR)bWi=g3hFFOSgl8>3gYm%3j>U7Hf|o0H zv7~xEI3}_K9I%xQZcY7hz>FU3lik)DO+K__eImZ3$bnWB2my-;&~ zpB96Ci)^`)^|z}Z_Y8e>i$I-O}596yD8m+`D%=6*LYS+u55 znX9)i)$@eG!$hEco@c=Q8agY-Aknh=Zc%Q+IKzkaiCIt!GKYiV3hu@T(c2u){Vk28 zQ&d*lIL;3qw_$BOd)2IH`%@NIuq8MyZT#^&R?t$r)`cE#$N4smOy>#gr&yLT-N{mcQ ze#yz!Ci^qeQ%nwwFRSTw-h%D7)yu1IYfwK`4{0tv_L2mXoTi5(FfYq{T(rm7GwmQ7 zD7vqSan=PnVrg&kg5=S2hrqB`{Sa>@Q>xq>y%GBSt%*iFsJs!#jhqtGq=*4E%ARCzpdiVNAGoSggMmQqW@N=ye{N`^3nJAWA1=XS&7!hCe8s|tiv(y#FoLX`qMFJrKknyI{8 zaTPZz&vayYVgI7!XBT0tJY4`9K^ok|J8cB7CY6CQi;mK(_7i`mKz>pX@RkLL?*7Oy z*}XQg9jNqDidXOBN0rJ~QG^tYd~9xs`smcEN++pF^CoQ4>{djau7RpS?e~5uW0i1F?S1xPyMCgznfgW0CH?j zx`EDa#>}G;ChP5V+|PJDE4jyga$m6Xlxq;-SB#FZTKe`cGw{f{6W19V#~7xhdg&iA z?!Uu5#+s?3m2zhir$lwpk@W~G6b@dQ((@LK@Eo{}EAA^L2|#u41<8~2ttHkxw%YWX z6=0}tiNG(HV&9Oi-Uz%`I7uXFWAbi!fp*u%ZMAaBK&+*UN|HuzkAW6_!&I9`JJ*AF8p#-ekLssD0PZHVnvDHn-V~9` zRG(*5sJz6ypLMIXoD`>!OI)eEg&;KWV^`gyu>G%=I*TwQuY! zYi^hiGJAfYsd&a0Swy;+XG-(rOs$WlyD#WRte(ISqZWXT;eTl2%FRC^hteeBd8%Oy z)UU?~ZmxgDjmv4#=iFL38mt~9uPs;Pf5tO7`pMIN5mIFnuE++lo*=Hn+o!l=qP0fX z@pk1OSf}sHy-9Asihg{HD_{ECAA2gHS%oCuqmVk?OZ%eJc>r-()N5@%?({U`fn zeZH^Do0(8_egIZd+SDUCs0Zf&7??c#ew%Sv0$NC^yeW?bh+R(eF+(fvLzd;G{TpfV@ESs|WOobF-x zXR+Upq{lM}jdJLz|J>2rt~$KCbXdF}OCR;uh2hQKdp@C-9nbECwe%BFXXxw>j3q#kUIf_; zWrAA~WW^3=rC4{o`;~*dRRu+~`*p;N`0@aQ1loSkLP-M~!Q)GL>mzjp+``><WJ z^Dc<`CyTGoN%Cz~41zyQpd;I^`w8%K7~?ew+9Q8VPHs~XzajlfGDqa%rK;6Nbh*~G zC7UE}fNWQ+BzHo>y?f{03O1iP`N1;WLRTs;!{^Xp3-^k=-O-3m3J#9*y#J^Ywf`?I k;-CHh{;O_?DIQ1shDuubi+Ew~gc^W`imviUMVqL916HV*ivR!s literal 0 HcmV?d00001 diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/leptonx-lite-documentations.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/leptonx-lite-documentations.png new file mode 100644 index 0000000000000000000000000000000000000000..4186dc99a12a287011d36c444335c3a070ff65f0 GIT binary patch literal 13496 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�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 HR$>1QY+zJ5 literal 0 HcmV?d00001 From b2bd25b95edfb8c5748b496bc35f8066dc43b2d9 Mon Sep 17 00:00:00 2001 From: Cyril-hcj <1559634184@qq.com> Date: Mon, 9 May 2022 23:39:55 +0800 Subject: [PATCH 027/161] Update Emailing.md --- docs/zh-Hans/Emailing.md | 5 +++-- docs/zh-Hans/images/email-settings.png | Bin 0 -> 17875 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 docs/zh-Hans/images/email-settings.png diff --git a/docs/zh-Hans/Emailing.md b/docs/zh-Hans/Emailing.md index 22edc50301..2ca01b5cb3 100644 --- a/docs/zh-Hans/Emailing.md +++ b/docs/zh-Hans/Emailing.md @@ -22,8 +22,9 @@ abp add-package Volo.Abp.Emailing ### IEmailSender -[Inject](Dependency-Injection.md) 将 `IEmailSender` 注入任何服务并使用 `SendAsync` 方法发送电子邮件。 -**Example** +[注入](Dependency-Injection.md) `IEmailSender` 到任何服务并使用 `SendAsync` 方法发送电子邮件。 + +**示例** ````csharp using System.Threading.Tasks; diff --git a/docs/zh-Hans/images/email-settings.png b/docs/zh-Hans/images/email-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa77da3129f1d216d0ab6a6bad35d87472f2fe7 GIT binary patch literal 17875 zcmdtKcUV)~x;GkR2`;3F2#A0PC@8&26;J^IsY(+tbdcVQ)SyTc1p(8hQv2@{PF8zR%tJp6{Hq&$rLL&vVxwNenY{jxpvt-uGADxkA-d<;h5HkU$_1 zGDQX1=MV^CB?NN8|I!8UP48)ECj@c}qA2@F^L6s(EKGeG-H5_emzIz8J1vMlycXd5 ztvT_+)?*dHOqC=0necl~qUf8%KT6kxy`O!4bL^EO7<@uZ7rjXJAn2iFc~`cSMP5jw zn0NExm*a{%!huQgmW#s57Xt0x)RTOhnGhvm38%7Wh#q;3`xz1O$5mm|%}@TT6`0bczdOA&#$YkU0Q^~$htb!xPBs#dk+ZTMc2@!(}zzLfvwU*mAvq?y}jig zn{8bQ8QE0x^J8#UzX3_~jOS{~W#~fXaZEd}0rQ&70;9vip`TjFY z^qG3T>Cw1ct~jS%z~1usd=s_3IVb8qD@zXHio)JL&OH8o%0R6{1*UY^%1twpSqMASWsYoPqgKX`|#*0rHMchxpl5tTQ z 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 literal 0 HcmV?d00001 From 6329f6a99d53261956ce126a17ac51c864ea7f58 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 9 May 2022 18:49:12 +0300 Subject: [PATCH 028/161] Add the "What's New with ABP Commercial 5.3?" section to blog post --- .../2022-05-09 v5_3_Preview/POST.md | 62 +++++++++++++++++- .../gdpr-personal-data-page.png | Bin 0 -> 55942 bytes .../gdpr-user-menu.png | Bin 0 -> 15780 bytes .../oauth-external-provider.gif | Bin 0 -> 1980507 bytes .../poll-new-question.png | Bin 0 -> 59431 bytes .../poll-question-example.png | Bin 0 -> 19448 bytes .../poll-questions.png | Bin 0 -> 180795 bytes .../2022-05-09 v5_3_Preview/webinar.png | Bin 0 -> 59922 bytes 8 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/gdpr-personal-data-page.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/gdpr-user-menu.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/oauth-external-provider.gif create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-new-question.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-question-example.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-questions.png create mode 100644 docs/en/Blog-Posts/2022-05-09 v5_3_Preview/webinar.png diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index 53376e24af..9624b3a45b 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -135,6 +135,66 @@ In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Dep If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), that contains a list of all issues and pull requests closed with this version. +## What's New with ABP Commercial 5.3? + +### GDPR Module + +> **GDPR (General Data Protection Regulation)** is a regulation in EU law on data protection and known as the toughest privacy and security law in the world. GDPR applies to any organisation operating within the EU, as well as any organisations outside of the EU which offer goods or services to customers or businesses in the EU. + +With this version we are introducing the new **GDPR Module**. This was one of the most awaited features, so we've prioritized it and implemented it in this version. + +GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. Currently, there are two main functionality of this module and they are "Download Personal Data" and "Delete Personal Data". + +![](./gdpr-user-menu.png) + +There is a "Personal Data" section in the user menu like in the screenshot above and when you click to this section, you'll be redirected to the "Personal Data" page. On that page, you can either request to "Download Personal Data" or "Delete Personal Data". + +![](./gdpr-personal-data-page.png) + +### CMS Kit Pro - Polling Feature + +We've added the new **Polling** feature to the **CMS Kit Pro** module. This feature allows you to use a voting system in your application easily. + + + +### OAuth Resource Owner Password as External Login Provider + +> The Resource Owner Password flow allows for the exchanging of the user name and password of a user for an access token. When using the resource owner password credentials grant, the user provides the credentials (user name and password) directly to the application. + +You can login by providing a username and password from an External Login Provider. + +*Example: Use OAuth external login provider with Keycloak* + +![](./oauth-external-provider.gif) + +### Suite New Features & Enhancements + +In this version, there are couple of enhancements and new features in **Suite** and they are listed briefly below: + +* It's now possible to create a **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for **app-nolayers** template with this version. +* Suite allows users to see and download their Suite logs. +* Suite allows to generate code via CLI. If you have JSON file that contains a code block, like your entity, you can use the `abp suite generate` command to generate CRUD pages. + +*Example:* + +```bash +abp suite generate -e C:\Users\.suite\entities\Country.json -s C:\Users\my-proj\SuiteProj\SuiteProj.sln +``` + +### Suite Webinar (Take a closer look at the code generation: ABP Suite) + +![](./webinar.png) + +We've organized a webinar for Suite and in this webinar, we've talked about ABP Suite's capabilities, important features and more... + +You can watch the event from [here](https://www.youtube.com/watch?v=RFArBh60RSA&t=3s), if you haven't watched yet. + +### Docker Compose Configurations for Single Layer Startup Template + + +### Microservice Solution Enhancements + + ## Community News ### New ABP Community Posts @@ -142,7 +202,7 @@ If you want to see more details, you can check [the release on GitHub](https://g * [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared couple of video posts about the ABP Microservice solution. * [Francisco Kadzi](https://github.com/CiscoNinja) has created his first ABP Community article that shows how to ["Customize ABP Angular Application UI with AdminLTE"](https://community.abp.io/posts/customize-abp-angular-application-ui-with-adminlte.-7qu1m67s). * [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show how to ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. -* Manoj Kumar submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). +* [Manoj Kumar](https://community.abp.io/members/manojkumar.t@shloklabs.com) submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). * [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read from [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). ### ABP Community Talks 2022.4 - "How can you contribute to the open source ABP Framework?" (May 10, 2022 - 17:00 UTC) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/gdpr-personal-data-page.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/gdpr-personal-data-page.png new file mode 100644 index 0000000000000000000000000000000000000000..2a85dade63b2cf89570dea05531b42376d2dffe6 GIT binary patch literal 55942 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

    TOry5|Zp;o4U3A zNH=LWXze+o2YjpKg&}UBBC12LNYdE3n3}d=lM{|3)>^FnZMJ>M#5}=a;j=>X)EnAz z#ZZNgz*xw@9A%)#rP9y7>4B(fK!Jr06a{@wYo7 zGP9_T=hz5%{Dn2fKw~Q0FTzz`HNge-%!89ptp(XUth?+Z*OhYD3I*pn>6srd3;O(Z zpc>6SX8jINbEt{&$DR;T2ER@#9k9LnBgFi~3RagJSenK#aX@dH+Y#Y_Jpb`?n~dE7 zzGGMUcG~4KC{5%|5pmcZN#mr7oQjE}v@=B$evKQ6roMHb|Y ziRPv#WUAlA;Kf$Z-dhczxJeqKb8JpjGbSxHQQab^Ou!S~UyF-_{P<}R;Dj46$s?m0E3@B2e=r8tyu~#y%G6f%nV%8eVBYJdMmyfc zW}yPx=5J>2V^Gz=qhB(?#b}J2MCMw9nNL{IVvd7lY7u8m=j0XQtr}eiu$_~bPfS@5 zp4(IBAt;83L~Do-pSJ}Dg9%{#)ISUpK`yvOOnr@d@i0l4hbIsNV~3+Ej+Qrv{v5x8 zV(nPTjy?w%*9OK`^>&DhA`G&6Xm<2`Z$;;-fGJUwk-W$I@!&p>%!`Y>obw?syp<^V z6a;7>|0bwSE9s|56E=F&QdD*NAVhzSIT|xPKlsgo=a8KYvXYqT&#NoS z$SGE8o+^@N`yyB0CD>KkRJ{8b$$53sSfN$OE6IK=Qvu+p*XpKmTWSMYA+Zq3XpkG;_Oqn6LlhX4d1*@?jGN zFccHedm6U95M;8fu!pDZ`)spcrt@cb@6lZeVDt%W71GAkv))1e6KVv=7h!d zG;etWCaQBtN$97{h>Fja$t5!aC6K(cEw2jzhm zE#?1Qm4+=@qgI$^mOZ0x6{GL&2M@hPhD-PKmJ?z~nfj#otKUahIIUa!OA{xaQ$NFt z{pc!o2zv#u)98U0Rd^CXMTTBeB}}s_83sGT(n(5h%9HRBo5aK4@9p3jzbfo4pN&;5K`dPNkQ+t9kZhOY#S|U@P#ca^a87%ju{b;)&HdxxiJs+Flm39p6 zq(yA16bBDrtbG;K=V!*g1_bBEI+*v>jV*WLLx}UsosKwe>mhS7y8MV;kbS>H?Z%o^ zcWt{yXf9b+TEZsQ!Uq{~wL&dph8ZDy3>m$L=dy-!tJ!I3X{V`^N5_Lv=lP=V^!DkI z&KBB4s0P?sBsgay?-4}1-KOnUi~YKrmz<;CzHW4ne!f`0sO1Jmo?1N#1Z(_JEN-=a1XSE4T5m;v%SO5 z%6~{|)q1P`QMA3#9X;w~YexJGCRJpxZVpzd`vx`Q!W<5|DX;F(*|Jh1QaEL$mO~X_ zS@#05DlOBpHC_GmvAd~z2Ph2lAYotg_>|@-d}&bps%dgne~x}!`Pc+;&7`D!6BoAd z7zXl?Fi@YXGHveCnAF(ldfTFeTs+%&b5+iRab@no;K_I7yzv9{rvj|77Gg+ zKW5=Q#=9*m7sX`>52zRolu&_hbNi`MVnQQ(njS`h=tEi`qnlOgeAlvZG}uZGsh0Ai z+ry$V>y^lCM6F)S9so)5C+f&I|abrbm zf@(wlto@~C#k14k2phK`P0vc9ik~>OiJ_LOaD}Hfb~s&df5koI(Y{)uJ)=OgQ{Gg@ z55`1=8P!&IU+H$o_OdaHm#WlzogAnI2QBrCcM zC%{vw&b;VXC}osbueL6b_8{p+fIsH8OED4>Si0G3(_q+5MBI9!rsVG5BAr~!Jb2hx zAcxoxAn2dy*EoXVqJNpsLadE^+&_fh$@Is4h_)dgwQJKIeg)D-7^w$M47=PPorrL2 ztMx0@%0MGfsBrxiwXQ3Sz3gegBV)n;n|mFO=tOMhCW612lNEgtoiT!|?OEGC*@Yz4 zNkL&@^ez{&Z^9|NnukWl{$wy(Rowc{uAoyir;32F)o{zcTXe=&|Bt8jpS31Fsp0ug z2IG|`J}H9l)LA`y3L#+)vchlgQ7xpYIZ(d3ixq)Tfu3{^zqT|y*`eQ1bslc2nu&EV zl@IQBHb-twX9V~Y)hGvEpI8laKHm<&;p>zs4!^vJX)z}i6)nuO)Ua^daI=khy{N^8 znbp3xma8kDpJ>f(p;YrB6_34+yI-|ZrUq}Ik|Lc5O1$9Q<_$TOUAR?o(k_307;ppm-kuQFzClwpIsBim43 zS7W~lNm~rbz!+D=JEGmI&|g}e+HXP)y;Ro}Yak=;bP>QJWVd}w4Ckw2B@kK)zipCN z-`D!yD3f$9!%uK8N_;q<>eEe{*Q8?z(3t+Zo`De5+?~uiE59^V7(O$v_KPnn_=NCP zhbli2-g)@ck?}7^_AipDO<#Ge=D{SiAGgc8OPjFmgOIB-0qMN;-r_*vzQbPmd&3d*gFN?E7B4qM-0rp* zYi4V?4fbY5&b(@wId&)GOm!4*&b?cE7&Xft&UFE0q;nRlY1)k_Q~J2a-gDPy2_Je^ zqQV6PGwB2LN^&YLEA39hL10DXm|sl*zHQ!df6IHL;k{_(ptyVJTyY3R?vX4F5EmkFu1?$`I8SRP8o9&Rz8~EuFdNHTl%_tpVPf4!GdyZyq-m_8n zovJ>A>Z^42g39nb!uopD#g4(dGcUM_Rg0RQ@nrmEzIhj;j&`s3VzT`zabAuHzQcTg zlSem;0={#Qo4pm*DWvY~(m53ezZO=6li#v4_4o-x!`FWaE7j=z7&oV`Aa#TBK?}>+ zwKpQ41JO?S0d`Fx&HkY3Uw7~92?g5m{X1b>U3-W&pB*=C&RNB;VtND}DkVp@DQc7` zku5=7-KEV4BwZKCDg_#J&bdbZV^#F)a<>cu;;f0QGIhJo@~2m!26mA&($u4nIj4}+ z?IK=6gJ~h15JI8zGms!Z>Du_v6Pbv3Mj`fPIZVX zs$pTmk4kG5kn~?Z(2}X;5>2lZ{dV51$%l{Zl9xbEanhUXs?+;6AMgqs-q`{Et`3xC&e@G+jU^5U>zTcC zerk4nqofq=UiP$f!A{Q}`K=-+>J27_v=6tk&A%DhsR7$un{ke+FTe@q?F-s;uPZb% z0#xLEB;hB5-!i^5QXrkrrXUyZri{T?v^kgjs|{gW4-A!_*%K{%5U@2+n&yWSO2Dev z8Hr-QzcS|2$J~tU%Ud%QViFNSydaJ9w$$jQSk_QTt+)A>jg)M_wK*eBkzs=bdaj@- zbB;WA;SEc}Oa#rqd*nk#k1>DFXBB^uuE zm(E87?J3Pj9hjIG1Nh+L3)$-3;9hl~Py>iAN63v-m&mLWc-IY??oLNIbRmavz;t5n zQc`b`PWyUPe#8D1;+^_}L`4r@5qe2Ut#mh-B~VuDLqVV{gQ`N}guo<1KQ`E?d3Y6n zjhsz!ZzJ!xW_)%X2>I^!9d)Wp@0s;zkLtM9chzII$b|hoY@rQj=TCKI)J$1!Zjb|z z19x8rHdiOn95W&yIro+pLKHxzjW4xV^#I!gsJSB%$EejiH*l#yYRB9XGd@>{*L3RpDdSD{YV9bOe_yok

    9(>30pDgc|?>0Dtcp?^yXxVxX<~ILH|&+ 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%0D^QWJih6${ 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 literal 0 HcmV?d00001 diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/oauth-external-provider.gif b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/oauth-external-provider.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f301559eeb8b9c01f9c4a591a14cee06fa9f065 GIT binary patch literal 1980507 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

    -0m>wBpn> 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

    W09K^CMkLrs_P~wTg*|R=2V1?GMcPpZ#2`k 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�SS1(daJ$HnN12Oju0un;!on@dQBo#;08`2 zBrm`>1%BXDk>CriB!5r?DUb(PLf`FG;5(8Ba&XlhzF^}G*BVaC8BXQS$>C7WZ9&oq zXu8|}?C=OY9;*fZ2s~+=2C&?zFh!}pdT?PTg3d;G_^F zcTN>_a1wqn6>F{KRbk;*zR6au=)sxghdy3HjSwzw66_EUcQ6%Ra1wt_6`-vMfRF;3 z?$=e}>7ZT%ES?B(dFlwE2t6*{d+s4Z9tlD~6)8~QtuEvp0qKY?<&9qD=k4pat==iU z>*t~e7C{A4Vb;?9JaYiz@h}Hk;p~1-{(^yFCi}gNq{AP zP!(%#-~v$aRYCIN&T)E9^YI?>6_3Uguk&3z{>`>yQ;1&tdF(U#AOa34gt*<1J z0Q<6Urw-l@wx1A?|2#Gh6pesUkl^tRuj>mh_N1T(!hQUZ&iSC9!k-WQMk)HE|2}pf z<27Iv+b$%(>jqdN6Or)mRuBGYJ^rN7NgdJ-hwz?t58$qk2jOn~<8Jf0KjFpx{L@du z(y#wFS^d@z5TpbSBv{bkL4*ktQi;TlT_OPo^|WIb@6JFIfFwC&Ckc=VgBdqE^a!#b z1U-;AwrkWTB0&Lq8nSEWD9etScmytT=qLoi5RM!!0_ta`PXb8^C}i5y=~JjtrB0<< z)#_EOqyz{!upoko98c89QCimQS+r@@u4UWS?OV8U<<6yB*X~`s{(1H8O`Fy4U%-I{ zPvu+K@L|M>6)$Go_^li@PjZ-uu;9Sf!I?F0=G@uyXV3!8PED~RMbpx!nJ(B-<7L7W zH4YG_8`}15+_?d7?fNzBSjWMI4<}yS`0>QLl`qGQ-1&3p(WM`UESa)p%*?fK=ic4B z!qK3^i?99N{CV_Fd3yybmh5!+@#W8_zc~GU`~&On=ilG|;_4==?6TMLGw?tJ@f**x z1sNQ&jP<203fd#RpfEamIrv zY!A2*bJTIi3~BT+D;|Rsa!9;N95A~dlT^~f7xg=`Tf9qim|mvPgN-ped=G z60L)}Tyo5TZ2av#BGXiJ&E&{*Ga)wPlv79}u`BRRJo8+xNw&OHOUpk+Tgy){nZnXa zK?4P}E+_}p^G7o+oO4o2D{b;oB`wu-Q~K&W5mQh@g;A+6t$b_ILfuNVPw=uN=+sra z#EZ~NMTIa@968l>*Bou7jZ_7B6?Rz1JVnx1WRsQZ#V5Da3spy9h0|49!Gv{IXcblV zR<77PlUQ)WrSH5#wX2moann_|E@SW9_FZ_rZmVubZYIpuj- z9(k#iNshTuQey@fMW_I7;mdmf`s!*=1 z_{RS*v35gzqT`~dzYU^rfpFxbVz8)2K$5G8Pqaz_1=+;G7&4H9L1G^r867#!k$<17 zBMZ^^!|^>*lSPV*fb6tLP<9Ay{-GpgRvNiUR1OD*k}R01FnC7kZ84Rzl*=DWdCOJe zQkRTm!DMDyY`IHl-e#21q-KqJ`K@MVvrUtFvSz3yMm922`TILgYl*InaXU020c81QBwiQI2|aQxXd!pExL{dp?ew z51nO1ExNP_2qXkErD;uVdQ+U{RHr-TX-|FnQ=kS_s6!=cQH^?3r0!H8F;x;q)rE#c zL=_GEi3B*T3XcVhsH#`~&8nu-qerYLQg|$-rAuE5ve}R#scU6xTiyCrxW-kkbNvY^ z(wZcv5+?_VfX6bNp^QlE;Q(#Pfgz%L2rKC209;Um8j@fZLs%6YhG7w!!WhnQMmrcG(z--|v1-V{S(4CLE(}&FoVBWFM|xI^k+r3rG|{ne+d2Xq zAOdtHZgGu!T;wLVtq~aPlJXiH6+FTklBF&){vd$07-AceeS}`r&RQzrjKD5k^gs=(cGoPlZH5}kqF!*YS9`yusBSfBRsz2ZtO>5( zf>rd~#yr6o@s0lPHX;#$v@F0K)J+CzK?`1Ri1)wbZOeH>Y@8ghwk`sA#C9nR4sA4| zF89svS@`SUvZT1R17`4344g^?_ZV3Y7INl@j3Njxh6odu>@?Z|k7Qs&vfFq>ea#{V zXi)bWeaMT6MXZ#_TD81u@v?^8@C>VB!x3v}Lp)sk3^&*pzu?esS#B)5A`k7y2j=aO z+?8jL9U0I}6Lg1?te6&Cl^TnXEdewNUvOB1%V%+fRkJZ&aKyvPNpV9wFgxa?nBWnZ zjYJYG>kdpegVc`=^JED?1kpCb9frWLQp&uRy~ZOM#)!lpYJHXn{6W|5cmx#)pa;yt zLk~$oHvVRpee7f}8`j2!g@;v_!3DF>n9eC*IXL=j;`sKL z0IfEJA?7UEWURr~ApSD2rAuLG7-G}MW=4FikqDkACF(mTug~KfbTCU65@oSNR1;x` zvh1PhPJcwLWgg#S zFE+-GZw>60zZk|MmwR8`xrX*~0_FXQyu3*B;-t z@7~1iU~+t=f%!Eo`OCAn1eM?gt6O(ZaX&?TsL@Vw|9%Tc~dqQ)Ibo+hHNl~MMwll7{3A}00GcF8XPxx zP=;;D1{c$>&I>R_*or>5J$LvuReHbltGGV%EEXEIXox}nX9wPt2vz`fDMd5ky8p5lPq|ELi9QdLo~x|g9I0I2NNIw z%?r6dP>KUcv=*GYR;$FMxWubc3Pg~y6Ep^ED~n1Cu=Y}lHW<4OJHQ&-FVe#?-)lh= zqcSVoJJN$WkP9&SdPPN`#hK&1NF)G8u&QVPyW*I`H|(SJvqKuGLva4Y6LG|k`Qr-( zOgpuZxuPq>8Vp3Mas)<1z(*WLO+2w{%d|~H0}xZkNlc0|)W;mFxojkWN8m2AD8b!h zMaj~%vfxLnQb#TP12nTfN2oOzU@~Jsxw1G&aHs~sYeXBf$E-6(5PP|@5CGb`znyb2 ztV&5PoJQ?(M%hxW#u~+Kbi;0hqi-C?v63X8Y&<+nk#pP&1x$t~SjRcb#H7$LtAewn zAcD99hhGH7X-q&!#IZ?iHU7iOh-|HYG|1iSKN_Sg+5*Y5ScHXK%l#WYaFEEPhyX)C z21vt14D+(a%1br4#ugMwVO+p`EH4u?2Aot1k7P-Y1czNL3;uYVMlKjY@_PqE@G#@x z#+`hlo(xJ9DM!uR9H3m0qSOng1P1_A3q(LjPOHc)ObY*tG{HMIdi*|;+{&@6$F~Ga zqC<aNzbp*LpO2`kE}tGOGF7g#iY=`w@fy8sJ?ip zz1ZwSt<259bW48}P_yvJEjx?EG|T_{r6+vQsq@O)R0|b|J#ZjQ6LSZz+t9;GEZEe} z*&<2l6ifp(%*(UR1kKK?)Iv9S1ZAj83p2nrWIyt>{vz{K&jevl9Q{e>a!&_6j#2~% zW%xt0P)2Y-Ndi!T>T6CUl{rFGiYJ)LNTkgcl+Xg*M6>WsaFEB8Jj;=z&up+yvJ_4- zB~B}CEvSmB*CYTth=#9>(nDOj*HQy6FuUiB&IhH=6U9$1EekDm#D(L70knoS6^`+& zQT2<%PuWp&97;xQ)X&Vr-tZ;q(6-J>O0EO3ZRpA%ZBB65hVsgTX;3#~Q;L9`QV?^8 zO^Z<5yi$BL3p}{J;tRXmQ-;J+1Q#;~58DIad%@wPyL4==#@tAyz_PDY$p$TpPHcv$ z`cQCq(hvoQXAruQoX!$Wis}r~S>;6$)GtQneT2a}fYuB# z?CJwdI|gbcf^8E>0x(va^8+=og8FJr3u^;47)7_cR_kO*1q26XK!hB~0YnhNX)Hx# zOo}-mS93K~olMslT32_?7~xVbvMpP)JzKP0E9Qz+qV!StK)&Ww25}_-0kkSxJqr_H zveG1g4xBP*n67H5*GLoq`fOO#tIht3byaI1EyhI#nCnGP<=6XkF$&|(l>Jo#-LYA0 zGG_ojNo&f&)dpyQhPvF=Bwf-8C4hh=v82UP6TQx7`vYl=FJ-8PU{uIYH3mjtgh4IT z;5byTZ6L4>Tl2Up;uRI+^$~gH3$c^EZE%M!D2srE*0SK!s6<_7%t~&hE}f&;V3kDE zJH4c^1019QXZ+t5EipEN0+MUTwY|ivSDl zz1Drz*Tqf&aD>^l+eAP>xZ6J3%Sjpy-Vz$#_=tc+NQSz^24mQR zO+!|2NYS%s)7s+5=(62UMg9gn0MN1^f=D3O?nT`1WlruTMip>`iu}~?49{0Igz~M1 zM^FKkeP1(W*|Km0co;uzFos1m3jy#0x|A$vc!V7+i#33UQBB?8QiK;JVChrZ>a0Cv za4~F%2O{vxr1;?=c3MQByx;9w3T7Y+)?n?RsXX2ln(EO>#isdKEXPU=0kDFjoevYB zQ#MSCMi$x;O^nxyEw(V^F8*LHuw-Wi)KI(0=K$V6CZ9d#?!3`&W%+b<}oQ|&$Yy-D9B%&S&Io9UMiGi` z+dH|4y36W_Tdac6b86Crrpcd+}A!?-l3#Gp5`^ai; z$>{f_>PMPtutplI)@rQaYO^*Ev|gBj9_v05Yq#c^vQF!&SZliG4!brGrjF~wfos0r zn7O`dsmN>o!9L}g5@c`D=)Zm=zh3Nz3GBjt3c`+TVm|DqYHP<%qQ=f_b%AWkW{S!F zY;U$~R`%*2v-LhLp=?dHZFx^ahS2R%TDMBoS?7YHvH z2{2~|NLT_c*9|0ZiyxQ-DbI5~m-0#Yfh_-XKrfChpL3=tfHYV0NQeYCZ-?s=2r_qw zMt}f=sDT*oh#wb#LvM#eSb{ES1df0RLKh()1}1AAf;I=!v>|0U^)vSN9Bt*^WPW@^g50XpeSjpY~~g z@<0Aac5Kgfsc>~{UjR?5oA_;H+o^aU7*Hpp;1Pz`No zB)dxNvDl7MF9&M>cYv36Cr|ZzFL;9|2v5<9gWrxW7zsddmjXD1M0W%ZCv!>PpMSWI|8Y{-1B#%DMsS1Vy?Lxad3~3I?Qn9Julj0la;MMwIj?!GzYRZd zh>YiXu)l+ih;)IVbarrrIVgIW;)z{9ge2(ttAP6Gp86)Ydc1#jC%=zKwt0a_(U_l%w|a;NC|Bw&P&==EO*1dg}#GRcFPScycatH+Ou zl-CZb&wH!i`=+qTfW1l1h^(}03d=JD!LWiqSOi5d1TNSP&Uyr@=zY$h12sBFmaK{%_*UsdJ~p zIq}%F!-Me;J9d$F2#I8rN*77&8bM&=R1zD82lO~)C&>-Zu3o=_4Lefi6E$+gk}9Y6 z9NV^T-@=XCR&BY9dZ<}*2X8N5JuD4@JC?&@j$_~qjf?_Y3#u6;YovZv|F4KLm;UAxqpso4owFk!=pLkf7bZCgAl z1c}6(|46{XJ=UycBaKiWc?McRrj?cucMCGupo0%W7$HY5Nm!x&g%=j2Tv6@(!QVgv z{LxNPfCzNlQKa}}lv0t{7adi!3CE5jwUL5{b$(!&qmDaz1m1Y#Ig$uEZbns^=O-eF3lOKtoK}rsZjOrnev(j3tt+(QutFE|pp%hSyWFf!-UNj;i zJCH0O?u#ir@j!TL>SZ9;)y^44LH~!LJ%U@fFn&Li6{b(HSItWn9vHkYFPB| z@S(;Z&Ce-o+wa34zx?ylucH8WP;GT2+zw>o)}%D0D3GWD*rswO{8_Cil4wKy8t6cQ zybW$_k=xwrR+qb}OL^dE#v?3cCu<0A0r1Ek9|)oXcqpS9liOf36d|hvJOUfrP=x2y zL<%k_V@{uv12eYK2!CR;06G(xu!!izfP(C2M z6!`=o2@*a8A-T||U2Li__Q|T^a8U#UZc!nztf^06j+u1wyyB95kT{ zHP18hpoX)am0)fpDa&>@GGoA?KPn6jV35%R)j`8R2FvC49_81@U1MJb$!IdrxR4&y zOQ|!%jABXQ(}_h9r390vXpVZ2XKIi%Z;h)#0HX{mtaKsaE9x6R2P(s`HLI#!Eo)ml zPpeXuN3eA*Z3nVdED+?YVUsC1FMEYS^QyNI zRXV~U9&1Lcn7AiwJR`c$U<{zdtKNYGjfyp$CVIz9WARQHqY~}`hnKjJJ=M2{?W|#H z32fveBRR?00q|8B!el1{7|Kx|$bhMARe>Qgirj19Y_QLXgH!nGXpa5!nGhoo$QP&TjLiy zTFqD+h!WqypZ-0ilOR@LN&v7kTH{a!3}9Jnt{7JRVMGdtz2O?j1jVdAWoz<6(2r7|?y`IA^S>AQI>n9z*`XGiD&7HYPxX!mQz8+B9#X22tV@ zZ|JUM{#=`0^=f09;L%H&T^7>k9f%=h_>MOnKoLB1N77W#4vj7%X*r0VpMpGX{1%zw za-Tch^*ixcPdwreU%0~+e(Q+4`tEgapv5nqadDM-*woMlG@|=lb7Nh&0*Qdm!Lg0T z1MD4rP&vPjfd_>-muKKG`o9mxyv97n7yz?IBJf!dKRDxE)|ke-qG9f1GAd6C@mMoS zalOVQ10Ioq$7t0m@^|en@@~{R%Zw=iM_}*r&H$KZ47&!*Oz#;h#s(u|yjCF_B(#Gc zKl#hQ)F^8?{dc!D-X%`!_U|3xT<*L1WQH_2 zLIijpDTG}KJ`(`iSfr_wF*G1JFasm>Qo%$*HDt!e_(6Q|o2U63k=5T3B4H9f(15Am zs`*{tC0zVLA+0%F6W*ENAzBE46{vwBF+?2F2yw9?7W&~I0%H6y;ULOds=ePrOyR-7pWn&f71CcIHjNfa z(7A9NBr-$H+JJ} zq2E4IAvr>vKO&>7nWH`K2s*5VEFxYxphGt1Ks?mUyW9*xO5{XRWJaW7KQ>S`stlVdgCd=IXzG5LFB2S{CS*E2^l4ZC2KvsHXT*l=j{6JgU} zRwsL^=X=6ue9nq{7AJkm=Y8U5er|_-4kv%==YIldfTD$e{+cF%3h03%XoB7&T2iNh zD(HhkXoO;fgN`PJO6Y}RXoOm5Xl`hRdgzDhXNP{Kh=OQ|n&^3wXlJJAiLz*mlIDtT zCXBl1jM8Xk%BYPpXpQRVj)LZmVy2JsXpjo&UIM9Q7U_^8X_8*$ky0j;zLOgA2Mfkg zAL4|R%27pNA{Vrzl5%O6uH}0=Dg7LP92`O-9KsxIX_$}#9T<%=yvbLv>72c(;-%X{ zct(zGge&TXo_cAY(jz_sYM=`0pb~1K8tS1UYN9IYqFQBBslX%npuJ#2Jb+;54F*I= zgtnbT9w-AcppwI3>O|a4oqk9j9DqyxlnOAAMl@>vZnUbO!YVd0>a5agt=j6X;%cte zs%o{t=77UAv;#b}1MPu>Ggy(D&g4kI7P0XuQ<4G#8rL+ugBlnEJgk8+D8offXtO#* zO?JdZ3M9A2>bUZvuA1w)qHDUU>$<9}r!NP{Ajr&O6->@mZtTIy3Ot5q>8RGy`* zL90RVfiY;qGW1O}Si?Ku>qUs`zbay$`YTnMC%IB=#R8}oWzQZkS+uzW*8vl%%oZCo z!d^TAsgTo>G|7`h$&^eLmpsBXNJAq$iX9Xps=OMTWJzTN>_TY42wlSpert|)t44AJ zxH@5&T5QrPEoRmMH2Bb#{Q)+BkgFl!6W1qG_>0?FoIg$L`OobSvKs_>h0cA=PsR6D-wW{ED6<`6Dg3bRQ2ix zH9{M#K_YCOZcmPoI|#rjGMSnZK*<~~#&+94oDeBU%oTOe zRDF=fhAlNbrBxZPtBDW^HQ5QJkby8+1TX>-6voALf$MZ6K-Q$h8Y4yqYV8tjRE}c1 z_U`=B?>w4-F&M5|0vPdLF9ER9n*L!KGVO~gaRF>;O#V)9^-fj)vXUzWSS-0&t9eEn zaicI+@Do;q-Vv(%672=QZ~cOB2>W7TAaFy#7XKn}^}v-=5&#L$7ec@TlOaSrOjW;T zS^w@-0k2v{fkvy9;Tbk1N3w55Hfk_#F#4hz?FKQ@if|J&h+*5ApozqZ;FJfaUEI z^Kl;+905$!#Z2tpg-Pd<&&XJV<2fE9G#?m~j2I(HI9e?M5Z3|#Y=+IQM`ADsS7jaN zu~ZJRA%<&g!LIFQ@+R-G{vWIIDvKHc1Q9gM!5~vXB)|h7NL3*h?;*EW@H!%`P4bn6 z@$^PAR8I29*p;loP7mX)DK9fAhw?D4FI6eA(bBOqL**Se^FQh?D|2%<2OI$$aG)`S z$l1{?S8*!?GaUQtMlP`& zH{wBSvN%R8;6AK3JM=>%83BkK_u-QvG!!K8GA>W@Wn_aQ%-A^xvGfW3GO|oUH8mhB8t3ksbHAl11LiA4qHC6>~MEQ&yV2c|#q-GGo zRB1E<6TtOQ!y=UaClkE~ovf83zr$1wnhv3KLQIv&(FYZ{n#rLYCWEp+o2MKfV?K6r zL+f--Kl4HJw8JuSP}}ugw~bWg+(Y&Z*j`mrA1(pJhc=J`G`NF1NY6G{9Z7rjY{@ez ze9^lEHjPac;W(T^*N6;9vnl>Y=bfw!n_)CV8`<#Pn8Nd0tZg^7hjbC5FIIGMgbn6 zS!?7p$91x#5vgF|?POE|5rR!+Khf_LzC z3v^89oqGfLOp7-BGPGL@v46KVLSJw}H~5Nc$Ar81i^F(~Z}U@mxGS3W!)kaUi!sGs_(v--cL`lq*gtjqeBs%NRs`mKAjt>2}t<9e_AF|W5Ju>1P3i?Fbd zrLhxxviB~shb6Ns`?D{tvnQprLwmK8E43dbwp;tQd#Sefq_=Z>xDP3~za+Vf`?=Ss zxrd~>qkFrbD7#Z6yu16nXQ;eOq`lL7zCS3wySb|O5e#qv8VLNr6MVrN{J|r9!Ylm3 zGkn84{KG?h#7q3dQ+&l+{KaE@#%uh>b9~2p{KtcQ$cy~QlYGgWe8h7BXZdNE&bUal zd|CSY9>KuL(|pa_{LSNh&g=Zn^L)?y{Lce@&Tk0I1KCK#9sEdNe30q(@CIWhxYERH;*`LM>Vq zYgVnKNTLz>6>M0sW672^dlqe4wQJe7b&Iy^R=IQO*0p;V@5`$~ks5VMpy}VCf0O1l zd>Ap!y@?si?fMpSWXY2$SGIf^b7sw(BgSp~8FXmTqhl`a*|#)d)hSn#cKzCFVc4^2 zKIVKIcW&LgdH44H+qY-h!-*F+o*Hm$(=AoER_XM3^ytf_7q|Wm9D8={+qrl5{#~;0 z>f_0mH%wjU(&v4f7e&qTy?ObK(a#@!9ejTM`}z0x|9>;_>>H540&A)dC+G%yiaqEW zd`c+@4V-W*1SvcWzwby9XhQ%!{1C(tMI1390WUleMfohesXYdn5)3u<)Ju^@zGSNr zLy}0`5wZ?>{1M0?c{CBnB8?nvMHX9JFsT`1Z12b@6}wSNx-t|J%Ph6rlFKd$BC^Ub z#jKFZ)1YKBIVT}(Zp=1WE7MJ?uJn>lhkUFP&ph>v49qzF{L`i+6C~`-tKN%`P(a5N zR8gGf+!NABC7qN~k@{>D(@XEkJ84XpYNB%1X>CRJCU6s}TE+rM#Hb;$> z*1Be`btO|0S6g2p4dYgaF&sS+j{N2cTaE6-B&ts`TZ9@H~}^(-P_h} z_X#%K$wm?_LZTy?W%$6C;)*TiOy7YucFo_72kscxf;l_bU9s$VrkXz>>hn1vpiXpm&a8ELz8PCD78W91p4KN#5~VMgG2Cz3n} z$^(*j-f^Ujfx1A15tR*cW09!|lB1EUBl&}i{(^jdLTaiDV%zOMtSAT%Mhww{iajEE z2OdUBegX|e9+~DENEj)5OO}hCoN_)(VjA$y9Of$QoPX(WPz}Q#2)OBh+}MH8qHf*GTiZu zN917-kf;VYnxVDCEv|8oYu@*0Si_6{9nE|>+zI-0*eD)mN__agf1ej?IMGG-CeikOL9j_6l+`a1d~j*La2<1Y$ra3Z#|bc!WT%C=I(2L<@$1 zoEX_vvQyHn8qEl!5Wyh{H>&>AAnTe}E`#Pvd)~8Bz%1rIH^onW6|zyu6v#OV;!Ic; zBujt7a*sEd?Y?wQ8)F?klDQy<<%cl2EA%gmzR6WhMoph;8IFAr*asTY<`uxj|K= zB)#fh`6{BUc2$R51uTjL>!+~Jbgba8sTFa0Rsc>Ti;|?`K;R|Ig0P_-&mf~*;T6#@ zbxn3o{iqxBO4Yue7XG#T`RicES6J3g$hB@dEE#F4*s?YjoXecwHV4wv$r1z+*kG$% zdkP6`4a5-E817Kz7S&u{V|b~R?sT`a+Sg_-w$~j{cE>bZgBbL-aJ6JMve8g9TCsob zpw|Io@30z>@SXaAA<8Fe@v*0j! zx0z%`C~gVT29ElaAdG0FHjvs#a2O+~@|7uVpP*rIP{SA{+{TA1DPp{yb&IHDrh#c( zW6B_y!8dboj;pg{DM7fli{&PT36eXu8UzpRzy|7|@rVJ-bs$Mz^68-Ah$l1m#c5=O zD?4gqFMpXW{y65b$9z0yDfeI8q)w;^rOiYX-*@_(c_vlMl6is zOrILn-`Vu1zttjFzZ%xDmi4S@U29w48rQkj^{kUN>Wf_R$f*|guz|B`RwHZI$yWBV zncZw>KO5RhLYl8D;#)Tp8{63qQ237B!)SjS+~F4YxXB%Brcs+BiBp@l+1>8T7`xl? zmN%o(?QVPDyV%^G_rCev@0QdX-vJjm#`NuPgCAVp03Z0m86KX3BOKxp=d;2aUU7@V z<>3I{(Q|?L$JhS$5fdLYZ7NMvQqY1TbSS~B#54{<(2Tg>e)qp0{t*Wilfd6kG$D#j zQDddPyYaLNfPD%?hgP9W&8?|0xQr0FA%#J#YMtz zF`i^E%#WB1MMCzk|0WOvPY?xDPz7=200X8;UQql*@J80eLS#^oyzl=6X$5zX2Yb*5 zUCPlm5CKb&1JSQATG0OH4+#_S2b<6dpAZVkV+kcN38jrXKClL1PzR?l3cJt?zYq*R zg9{PR23z9_k1z{4a0@*x4BOBR-_QwLa082w34fwYurLI*&pC;4{?~(Fb4-Q5FZf|BQXqd&;#iZR0@&*hR_8CQ34%N5-tkr|uO8PQH>#;{ZP@ENPo8m|!>vr!wjksG_w8@~}8!%-Z^ksQm>9M2IQ(@`DQ zksaI79p4ci<53>xksj;O9`6w!^HCr7kstffAO8^`15zLdk{}DxAP*8D6H*};k|7(? zAs-SVBT^zKk|Hb8A})(LsBG1k|aygBu^40{!>yVSCS=L(j}9{ z1k}I^1b`GG;1QHT5oq!ycakTy@c`uD5E9`K<{$!A!VqjJ2S|YqqG6J#peLUaDuGc2 z9$|%E2OHvn2vXuGk0B{@U|}F(0jeSolmQu9Z$P*J8I&OpqLMA!GRN9reqg5^;GrG* z2OOM14^Uz&lTt49fEt=X4G2UHnt>Yf(k%}YF;$8H*1(gbK@kpsC=TEcoS}BwfGGAd z-24(S%PralvoJXmG(%G~N0T&5lK`>-C8Xyho}m#;(=}fcHe+)c6LTO5Kma7+jrPDP z+JG4xDFT23GYMc162T6Zf(_aR9v*=X1OO?9vp6H*58?s-9wK26AQLE_zz`nc8l<5S z5`j1g13DvNI{)A|o#Hs*Avu@xFQ{M(RHW!pZ8`MFg4K+<-8?Fc?s^LK|6hkxA)@bt}37`%{sWt!N z4}?oWgYzA<=_tA&dR~WJ+~6oq^bzd9leC8jfWj|X6h(J4E>VXW^Z+STbj4l=8C>)z zav&anhe!S3D7JD9R+KA&!Vh}$b+jQ8Q~)Rj6Gz`cL${PmyYxXLbV3P$8BpS)ywpt3 z^g%h)APFFMmVpbv^AEn008BJT2>>oxs1e#=4HEugewe{Bf#O6ZK^ctU57dAURumq7 zlN7RZJG)a(kwOL9!I9pS3*v!|)_^GPv>EbrPy6&w34jO~$Q>3T5gy@*tN{@&6C6kg z9I)XT+yMp%01>QV8wgbm=HL6`3I&E`{tU*BuKr_`qHS8c7o&i&V zA_9yjTXEAExYb+1m7%2J4~q0emEle2lzygR5#o~zlwljl^(f@Pl|qyNJkv*=RbnTW zVx8g{vY}szVoXn>Oe@x7Ki1r!bs$aPfc~)c)vgsN+*KOzU@7oG8a^{zn^C??Y#tW;%L7AaizGp%5^mck95VH*?yIKknSkRo@C0bGy55s>mq z2{U3rmTS9KSlvKbPl6h}mTb#bWCt<_lIUhz1Z8FQ!(tUF(pIqm6@i@MMB{-d)>SpA z0AV4aYLNmF-gYVEb`gZL8ls^%kzxV-AQ2+=DB<-e1VD7wHgBl`8ss2rVYX~HmvbGo z8Bn4RI#+Zj_G|@m0qFH)u{LH+R+5gvJ73p37r|!fmU8JApJ7E@LN0)l5S2PWQ8A!)^w>MZzHy{Zh9vo=_ zQuj$$H+aFp8k|9W*Oz@6fp+Z{9Bvn9H?ui%U=fmG%AO%7&o_P9*MHsjD3PHD+GBYM zKyIbMf7v$~=pb{qmU|xRFXtkH4I@J=r@K{7bsxhfKs(RrgwsS*oS`@h`YCf{gD7_ww-`iYTt@T z+x8E#AsH5s05%vNB9?@a!h|cAhMgiNXYwc%Ase2wiJy2Wq}WH@6=Mh29h|{r3mAMy z$0_z;I+LJ*gP4x%*pBc1m^6o&h}m=-uz?Yf7&xh6bgH#&i69xW!D*3V5tR6SOE`Wj z_i|Mu52hiKv6x*A8IhM_k)OduPZu1%6)8p(T|GDln$sGZfk=sBUd1k!2Mds9_PTQveJ>kRPF1tN2A987R=884|W! zmm*RTsA?Cve1prFky)9wsaoO1kph$e4!{s}wLIB40%}Pah?Z9)VH>C+UF8-Y{+5>S z8K3i6mTj3Ii9!V;0ZCs+mxEcD%{N;g!F8a)9ozvLpthcg!kHl&nr#y|QKxo+f;U+R z5*EQ7v;iA**j)Y-dZ8P78y=b{W;J!7!5OUKbc}(Z*%(wANEzV47+BgG5&?-B3U%aH zpL^P;fBJ#>c^`|`9a#Ewtic%e0Fc|3DDdDIfM*+&!4RrBqHR||9l>Sf19s&n;wCixQpAk zV_CT8@&34%o4K1isFOP$om;x6o4P?3x}&?gvs=5jd$h0n9l0C4!&|&z)4RWWyw4lG z)BD@X+a1;0z26(YH!5`eW85|uUoWd*owI%!L z{%XzV+|KX(kKi27_ngl$r_TEv&;wo22c6Ih-Ovvm(Gy+K7oE`?-O(Q%(j#5cC!NwO z-O?`|(=%PuH=WZv-P1oE)I(j=N1fD5-PBJV)l*&7SDn>c-PKX44%@XI-0_LqyPe~{J>1Wom&TpkHO}18-Q8`E56(QAU@+i z{+EJ|jdUwp589L=6BwPZXV|+PUm@E z=)1?~e}2qne&~~aNK)SD!w%_{9_mA+=$oFwo<8cY{y(Ok>b1-2vEJ+TL+iKxwYvW6 z%f36pUhD^p?9HC-u>%w%PVVVm?{DMn?_QZ=VV(}+`kShQ3JHIS4U-SQn^F5#R!2y!-SJsp_JzguU*FqffA(`hUpuvL(6DnNDu%W|;5F<*QNU@^D zix@L%+{m$`$B!UGiX2I@q{)*gQ>t9avZc$HFk{M`8Iyob0ts*8B&Ac}O@cau?(``% zDAA$_i`p!xbScoLPm%J3I#nvot5~yY-O9DA*RNp1iXBU~tl6_@)2dy2bg03eRd@bu zt8`$~o>ZCQg&VgnU8_*z8T1 zxYOr%9Yx-1{rx4JU_TWY9)i#9=iq}7MkwKg6jo?qSqiErU|&@IrdoPA`NiOR9u9cm zh~ZtR;)*P`=;Dho##mi{@Que@i0IjP<3d8E=p1q;x>sV5G8Sp%kw_+~nc6)`{?~9|YN%sWAabc8dkOAVW1OU2 ziRPYs_UY%JfCjn}Qh-U>*Iye#c^-}g0*L6L9H!{mq!|io>7|%vs_CXnGU%q20VWEk zf&LX5s)46zDVTada_Z`TttntPickJ=U zAcrjS$Rw9+^2sQttn$h%x9sxEFvl$O%rw{jZ1c@H=dAP2JooJL&p-z)^w2~XZS>Jd zC$03-OnVdo7hD`rk{`)Pl0(y2XRS59dQj7h8YG3#4mjBOAyU`w2(b0qY`3lAAK8Ed z2}Y4P(?~&Ge_c`|)*u5mDO@0}mmw6`x^ zP>z6OOeEmAvp`T!7-EPDLgjBr^?UwE#4+lZh(zp<0Ky{x8y*1NQ|T;CrQalTJn;Z%p@k4$jRF1B#KjXA~+mT#V%G6c>x@tI|_Kf zyg@=5kC;On8UYP(NCSp9LH-0bz_GeSEW#LKGzJlFvN?FDaT<23;~jHQ!V{)&g#^HZ zG`69LpolUa0uYJ-9I*{!sZ4 z{JTj4PpJoD(orW}v&J#xpp!PJv7XV41~}l6Pn-Nf8vi7~=CU!kY}&+*c(lp!`gs$| z$*-Yav<5DPLIp*rKy;8G03Al^&X&6Lr7(@DOlKOtc-pizH{rrEc4reiL_?$iwIVyTXb@B<7=0rFHX0PT0re(-%;;UZ)<>F}^{i-3 zt6JAu$(y=WGB+{A{x&dY6OX1;pF#~P@~9e7n{;g&dAK4qqOrjqAmgY)Sp)8PC(-&@ zG_K3k=;%0llWSU3r-;4F)2#4VwtDunpbf2PM@y`?nwBwjtz0~GqKLUJ)r+RoD`kII z%Ha)FblWgvP;xN9M)0+$SdHvfCo7cJ7LovPJ1%LL%iQKV_qi@Tt#lP*lf+%454Kw@ zUSo^by*3uOe$8ul`zgBX7KOL}q-{{LDp~L5bQ#nnfJd=L2-lr2$fD_G=lp&8&n1X7X_;ok~{y~A}cSU;M$uj=>1AP%vJN8GIb zniwnuK<^&@w|LyY1~w>z^saihYg+}I;D+?gpf&b7W5|k?t3r{cNbdlJQ!u`3jhx`V>L zRkEDtOy@dpvdMVvPCVpif};HK%mUbR87-=UNF<{g-hBi(m~qwcayPtt&A|<$@rNA} zU=8lrhBesy-3tpBy$mf1+_JF^<=Xkws7|%2%a`X?dj+$LP)ZcPYEa8P;~mjsMk1); zT|6k%a$QXDcyF=>3WLKM&Va@?j-80d_V}X0B>+^nSk{{m!Pq%owYIm-?QYx3)!?Ry zajE`T6j4ILqFr!@7}@xaE?|+e(KN;`gDqZ2!&?Q8c*Yj7@s2tK<=M&9|* zkjG}Jw-?UvhSNFR5T^=!A!+Skr@`=b5r6luHM=T7&v!u{^f zs=MCz&i8fV{qMZ#yWj^;_#*=T@TDre;up_&RwMrLzG}SWCr^3eLH_cU&%EY0U;f(5 zAD;7|5543)|9H`x{`7q(J>pT%`qr~u^`CdW>}PLv*aM#SxX(S%ZU1-O`~LSK=RMwm zPyFI{TljZ3zVerEXXL}3`OuHPk)8i`>0AH$_@zGDvCsYPFIW3#Cjbn%fQIs$|NQ7r zzxvnD{`R~7{qT>!{O3>q`rH5h_|L!o_s{?S`~Uv{7=QvefCN~826%u7n1J-h1u&2! z;FohSAP@>TffQJQ7I=Xen1LF&fgIR@9{7PE7=rO95E1x*QI|QSAc88mf-KmAF8G2l z7=to6gETmR0)c`in1edFgFM)SKKO$`7=%JNghW_`MtFosn1o8WgiP3k{!aLWP#A?$ zIE7SLg;sclSeS)cxP@HUgJsCIEG|chGuw%Xqbj-xP}{}Xzic{1>uHp7%Or} z8FjcFa^Y@ij2W(=T13bP0{TtEkO zUe{PhyV$ZfCz2yjcmXO?eGlGkPMKZj@-xvf8Yr5&SNZj~p42 zPjHSRS&}9xjvfh;Cz*|;xRNgUk}w&QGC7kpxsnnXE{KqmI=PcP*^@gtjfYW z1@W+MmeWQ`3QEQ|PkN}X`s0h=rM#+!|+(?yPxs6)cms7b@QVE!ZnT>x5lebuy zin*AK*_e*WjW-D{J~^3`i3mVx80JTmaXtg{hs7Nt4{Uk|g<^2yBpzRzL@KK%yKvpCeh6^(m2I3J;AS2jD0Njc}xq@CRJ* zjdpsZkf4`c%B2Fzl~0fdknj%g;0SaYk$(`Ua~hF`5D!Rd2zz>sP5Pu!I;DH?1Z-dj zbg-v~kPU>IjU=gP$WW%($OU6VJx`zpHv|dUIiOF#2h)I`*$7o1N~%TKq>6wBg$fDr zpr+TD2akZLkgx~Dxs84L4u2|-j3B7+XsL_PtN0kFi%_XgP^3qiq{)hnY_JG;s-&;E ztJ8`G)hedfnyN;Mq<@gCd%y^bAgnCO{s@TB1-$C3h8nEdxU6})q*HmP%nGP~@T}MP zm-l+EV~VZX%C6m7qSXKmr>Ub7JFyh|l05n?KKi3Tsun`Zk%71ebF@Y6u%V2&M-QoQ zYvc~yC^u~|mRmFp4|I*6SwGoGqc&QzH9DB+D61oB2oN?#+5iuz>aFmgmcaHuX8H)% z0JQOd29=|-oEoh=`wWI^wAG*p=IFC=DYV(xI&0Jneo&Pr`viZ4p9QLsS}-;!daHM| z25q{T+Sr*cx}eZN4PlFoHmkFtmbPSRxlb^;TXeeHIJXshyvUop<9M;&lCkW$u^d}|ni&tv za13Dg2V?mTdwQu*Dy39vrC6$^1p5Sm*bdm>4voMF@o<;eprH1tZ%})Uen1TntBvzp zzW{oTjIc}3011rH2*7klm)iz6qz&zmzL21A*WkV**_(vqzm3oiLHo1?E48603Da<_ z#9B+!P`gjCzYqMs0elP~dPDA@lym?O+rSK`$-SBCrDZFcd1wtti;Z%i4A#J<5c*49oToMEnGF0AG>N22`L2H*^d`%f$5S z#EodikbuT&+*ED+#&JByL=2l6s*Q<|4HmkyP`nLNtdsqZssd=9s zOupct3}sofHv|o4X{F?5c1p%_>@z+kiSl>&PRTjfrav*<7;qe9q}S##KpC z?ySGquno#U!l3NQ7aFR$dW|>Splth}Ev*bM{lPIk)0fMeHZ703lL)$6KSa!k9}NkA z{LRe})D${bx{1>EjE?AB$`)J=E}f10E7LR`%tzh1H%rTCoz^&N%iMy?l&Q;T!OQko zIn1D&*hmLz)Xh^{%nPlJm1C=2i)G+gIg+rAgw4YcNk7W4sM+|TV%!@FIry4t8{&7hl#&DhxJ*r&;e%Rt(S@C+%v*W$PbH#E=?)eMWUr1J~d z*l5hyhz5=@4cib6(0~ou01sEW1_Pwm**Kqv?Xa!et;RXY+DNOmdfB9{zniVjWLyoN zjg4u0Y{!h(;859vx7ujp{+z_yosD>api;?*x3rB~U)a{S43`M#`|MRf*dQZL3tEwFCVO)F7LXkj);6+_1dSC_d%K z%m{7kmxtw`LB6^J~rLF2ho5Hj^M8+?zs*N=h!Icbl%;19m&w7 z-DObQ|GGB%V8LAq6m9XM#fukrTHK+yLyLP!NN_6-#kCYGPH}g4clY8FPWoSKpE+xv zz27{~HTPsP$s{wsnY_p(pYL@)A%|(rnxAZD4@W|qcl<`Cg`%uIUheh_@42r`a$u~d zuk8CVuP?k`7qwZp{JMTgI@m|idR4r*hrKg}g;O{XdB3z)6*YINsJyfnJ0>U>NfnhD zdbr85KVQ0q6Q0=`RbzcJ@5G#jYLF(MkvcyIL^8)p9|Xn(VrM=gqbh8xj&0O7woZ?s zxyqyX#&n}A@3oiB)~vwRzpiMg-=C;2pn3Tn_Blp<5-u8p$yTLImPOvfdf$}HvW)!rGyJ3MdnBj}YajDeUBQ&a=V(bT+bTaa>H4rzc@&Fv^ylhM zR(B-E@$?!e>~huf)KK|oHu(&~HvbubK1d_;CE?O`wCcF*58vus^dstw^WK%9+#CSg z>G^i*^-UD}ksd7Ih9>jITV#i+^)9_NmL-~vb@Us%DhcOk)Z6lU{LDq()?czik)ExQ zbhr=uPe<-prdSbGYgt)6D94I64@*VkikbJ_?5VD65B3=ki}mT}&e#hTwJ3VGi`Hnf zV|y(A4>#%9#n^ohL(3^DwO5lBLKF|Et0yO86^lBLeXWsgr#l@^ci`4D{CU&^ckFj> zU`L|2v|^d4sn`nNvo8$p0NK|1zxY(KsHASeD%{Qy1mqfKSm{C_`DUWb*g6!l$|3=#Ys1O{f`C8 z-$jGTHDU16s3AX%x>GgZX#Fs3_D6ZCb)@slVmL!OP3u^%)}b9yda`OuK8_IA@hEw0 zq{=pcAW?&1H#^aNZLP-sn|)diIP?W$*CAJqDGTni&fx={MXeO>e6^4J=eJD*=r>YT z4_&WhA}K`PmnC|++JKWR7GotJ&~xoy>F>G;*1?HBy*y(Ca@qGp_?t`+_eJ2C+r7bl zXKAqL)*(3`-{8f>xFRH`YAGiC-P^5aXOS@I@@dvwT4)XTBf@^!Tlcv({0?e)(MGHs z#Ej506A1V5BR3QMA;EjNWh50E<(Xpoc>L-*{edG7fKM<&Bhw~miJhq;#U)LwZC)w; z0%jF7$VO(BSJ{(O+rcF(WxrJ^OC5mxR*n`*_p2{&EzYi`k<NxYjvXs$|Xreu&Xle7se3 z9yC|KT1Cqh8D2sO2>!GSqKNE`2y+=kk46joj?jE%60ycN(KkHP1Oc#W`Rocptv<~Q=P2^*L5IZgN=3-fE} zs51_DMiDUiipoGBpYc9ET3)^GYZnGs>kDHUNF$gb4p3^HNAA4fY9=fzMK>-5mSG*A z4vRvNC6}gPpH6o88T&EUh9PGLL)y|GiV51&0j68wnd;(rBub>riVW7U*1nw=*R@DI zcP6t0jm0o+fVv`_)*-kbw3nu2VWBP@*Ay2zTjtC9P0B?I9r-wpgNd1zDjxNn3S!*Qnic$Te$Q)CuJ`tVugRw3$nN@}C5(X;|+kzF-_76kjkVzwzJdTjspd9#-rS`EMJ~xEfbO#Nua4n2DSdtJb>_5UObsv z4hDi>$8Z(A<>hi|B{y>!@Zh~v2I1bnBzr6}#qvnEHM{2OBcVoviF2rMN)lrk?P|z2 z0UbiUqQT~L^r5eI9Y*6MQ>m`l8{}2oC%$D~YTvkCh`fEfk8bUW%+te9^M*5sY)^gF z7b_d<@@p>nxem>fy)1sX@Q$h7P!wTdqQZq~C#8=yI@Q95&U1-Pd|e(n%B6NC2U4UI z$Pw{`38-D2;EQjMl%?4kLhE^@GJlcAwy%y3L&UHWbRkfd9XAN-5kvU$_;y0rFtN*$ zv_oN!BD0!EBFzZ+Cz5Sm@@-C0mj!E(1zIcvZ|NPfy(4?TlsAP?C(tM$ZB zx3Y)Z5Wi1f$I_nM`5>=i$i=4|Bd_xP1)Utg^pJuKW{7xfBiy&TB zQ<32+SfhY%x>z-sMO}(n16-Uf$|XUfKw(2zvctfj5d)%}I@1&!L-61@_>n-h0TenT zV$_;Ldc9>EQhA++9TM~A^+nc9iuo0TRu)LNpG9ZutL9I`g@f>0&Pdkvt_n9lbRBd| z4t|2^UrF7pO%ddpBQny(?+)y(rG@k+fc8Hm=<}6WiF>CTd8^8Y?d?o|znZUoBZ!>h zpzPhBv2;CC*Xq!3sVHQS?aL?ICGGe*;rCKyx_ex4WN7Z(G?TN^i~3o=JlD!W!sFU- zoFPE(VeJE+Dwl23t~AFV@Zi!2`3u>jU?<;gOygac0zo6kyun**z}=|yZ5v==6tr7v?s ztM@2v7A7+jo%1+EY(FL~OcknpD3Ex1tx^tKm@Zc-EBYW}r#HJWldHx1({9Sv@Md9F zHQ}l>Sj7I*i-*1jn47-mcY90z#kh7p_v(BR2is?o`4O4HUzN=cj+j^r(?E~B-FRcbj-C|d*vdj*LR1v)oa9Kn+lw#0 z6opNS0gqZ9H^q?S#n(%k5w~D%ICL$4{$KsJ7P--Vo zl2{{bC$DbLMQVprJ=LK01H1Oe@OCm`acuK;n#blBM-o_4VI)iK46g6p2iqCrI}Tzc zFqXt<9$Tn=MH!AH_JkxjG}@VoI=PnWnCLpWkCIrVBxp6nUu(Qa-|E0G6w4c3xTfNFJ+x(IH ziaL4&>H30(YT<>V;G?{+8hsE~xuWD=XuKTlcyDNRU$}5sNLOEEJU(QrFPcX#61hK? zH9U;2{~MiLtWJq6qc^MiL90z_;m|eN(@l$5eB7*5qT8?4Sq#!d4@DIiDYXH0Arm!BP`veg=8^xy|C*U0?lpZJ294EH;u!J@CqNc?Y0JTg89ZDkGC6CL> zfu)_HOmBg&bVOdopuu1Mx58JAzC*Ve-2o_F0km`mOPPTE?#F2o&}=-xf@&Z!XEGbS zaT1hCPU1-}`pLJvliX|{Nc}z_jv-+sK%_$eM??u8YGc#z?#nr%X+nT(EM(W9nSx2# z(gbNbP0dCJA{(fRhzF3&0)EpG;W7mZnlvK`P+Qci@N`cpO;0IrPpMo@@o1_8G@Hf5 zv7I>?L_^eP?7%f-8uLh@=75j<0twP>BJ6kxvNTgNeozfV5rpJ#lXQSLFg1w%ElAH0 z;=l=3)ts@gn6Y%5v9g#^Bi5V_2S}<#oW}xX}d_YGH;%s(H(J*1Kz;28{*Pk?{m zkv-+K>bI9hu9ilXbsM&o5R(ZdEJTQ7(46wME172|*|5^-0Y5Z#<`0qVoVDG9v-xz? zLih9$<(7VSFHV;j+TDH}<6YU5UfJr_7++RGbVht!^~m~OBt3llnr zp@?J~8*t4u4VPo%XQZ+bRZ`Q*t)6z2&6Z^Snaxe?%Hw2VE?99kf^ zZV`rUUFjM`_BG8_Ni*J=jd!)1LRv=b?nC$HX2RE-V!$nu8MDqUGYp4KahWYCt*tuB ztqxZ6Ov5d?#4UNgc^QTwSy6L^nJwj=EtQ(B_O2}zlI;%++ni74%|BH?;;Fu7-_~;9 z)@~V9Kl!9nu&r0SZINKn)U<85vuy;UnlxxpG$z?GWw0zl*=c0mG1uC$0FIc+SXx4M ztP?FaTz4AMckFt0>>Yb;{S_Uqcbp)Wj){uS47;DNEnK1$zi92c`CGU`6x|`ao-5`a zCzf8dyFNJP-tLONJG=ffpZpvZ14#D1TABu0DhA2yfkll#MvB4idr)_Mh?ZhV!Csh_ zUZ{#<_{?4;P$xoWuq0o&{x!DN-$q!5T4&SR|9p*C~X6x7`+u0R(+f{|w9i<#r)!KC0PP(z0y;nwz}k->40u4fLV^ws z4)*u=cXoEQx3{;pwl=r4H#D|Z)inJq{gs38jMUZDm6es{<>h5$WF#deB_t$7L`3-c z`MJ5dIXOAm*w|QES(%xc>FMdIsHjLuNeKxFadC06v9U2RF;P)b0smVN06;PzTN4}C z5ZBw`xBq>H{yq{g1Zf@aA0C~ao}QT*m|Iv}T3%jVU0vVU*oJ3!cW-}x|KQ&_Iyn5B zqknRId~$MldJ3PDQ+Uq)=KTMci~mplTwMH}|H|c`%m2!stIMnZmg}plf6p~MSJ&5< z@VSA{&GkQX^B=kW-*fjrMI}iWNzwX0t|1+>B*#BA3U;u8-$sUL0cRtrJ z=Kq47d_UjE=5&RVzK$~M`QKn?4nh>8wGrl{y|ha8K4*XIg+#l z*2F=W@}%>o#Mds_l4K{qTqim{$b#cD+TEJuVIb*dxX)EAdMMl5_vVh|D%J2N@{S!n zYEbB{I!*Pu7FjH|!=1jQ;0oVbs(tPLPMUKM^KQDJF29NU`gZYd#@hGY-Aqr;S85XT zv}ft2)(|ZUt0Rs%@~GcA(|7cJg=359yZHTtkr{= zQxzH%Sh>Z!*Tjc5HR-WxH8&osC>-Jx5VGgRS^3emPqu zO5sB7$Ew>s^K{VrdAkw8@5t3t)6?Lxpm3_E>{upx^>bqR;~sCc!DxxykjbC;ivqjM zB1^+}PRS0`B@Yxel7k22ecQY*9B6;pzKM6-E~tNeRr%VETPU^AXQ<>?cG9g^Q2ukL z@zkGA&g9!5=bu7}u_Mxl2I}41Ob$Wif?L@w7{>G@| zW5xI0Fo>_PWW?)4M;4TLE#ppRC`UdgFxH@fU7W8q zF6T*YSUb5*^@`B*b7>}!Vhy`oFS6!qyQ^RGvx0U-;%hbzY#%-WiGnx6JW(XABKv_T?;1T4k@z#*fR}Sw#a2D zW@{zW5GZI^;J!L+OD$CC9|+UC%pp~ddXtN!sOue{81Rc;eP)u=$OvD&L#bFnTaWsa zjI-l{u8I=(LdL|tky8NLtd?05KHdWSW!MuLSvh?msz49N}`9?3{fTDmeAygHtK=ZHsExEk@X`IR%&mhsGp+c_AarRb@i=&#;`(7p7VlApr_*C zIQdO|)aw(%(%gSw=U8N!Yky~1gVIgo+%Wr^!S9YgU6pAI*yWzRiYphXH%)uW<=(S{ zE7$j-4GVs;j;r?us|#*FJ`%!72%%G@k82Y#H-B1;fLBh4$9rqTb5)Q)vpGCg?x+a)%W!M9f3E2L&`{fQhzlqXjtHZt- z&FjQ?+o4UWhudCpoL@1S3+qSsSY6a^@Mh>VByzD0l z{QGV7ajKGgm3H2yr6fv^oWP*5>7w+}w=HdcldLyyw%;uZ(rbuTWrPZspq<`zyt}+8 zYkS;%|MGq;MCHKIH4y*qrj}_7C-9$1_K7)98pS{(RGF|2D9aCs38T9@i z*r__aclhpp-0yQ$-lni9?$N*>R6uzj4@|&m#+am!K+iVY9imDLei6 z^WwwG?MPkAjq=GCS^njNTDLDr!ux9&O$&ciJOd7gPa#5&>v+-iU8YA)dx*ko?1^sG zyU0%GERUPL7Pnn6S(S^pw8t$bW5=FuAD4)#wElQe&nB*?2$u*mQJUTIKJ}4584r)U z;Jtxap66B~MoUqsp{y(S+Gnd4r_p0(McXb{3}oT(eRD)XW2lk{*LpZ0Ur zOVin3UmoR7g}HuHYsR>)xX&&4upMczT(A4w_!oAzJcu-zI-SgYH+1(XFW$77#a(8e zz^T)27TYWeSx(`)>g9fYL6q{iT%LN<>H~wjPQN{*@}>69#M&wncdpi=k#7a zOSBwb(Nm8*lvzO5_BE91y-rfA9*L1PXOE>pl)RJpB=S8|6-uN2!$rlPy?>-Kb{1KJE(;%0j?) z(UGMP=*7C!wz!T7I4=ws!^1w=HMz6;a&P5#j~XyPE3k;_{}*LIKyigW zW4-v3YWT-^ZiMv$#K~X(b)F&Z$ArPnwBA{X-Imn`I( zlUhW8N~}m*!kTJR&5Ot-U_;GE5x)C3Klo!k)OQXFVF;>54*6O8dEFxTPjE0yz7R^& z9b7RBI$jIhQDHmbz})bp?r+wn z1TlWVThGwLUi?33kuycnqkYl8QDbfjBMCbr*F0m;1kKR`QP9+=v}0mSd!qbjNi~BiNIp=Zd`O8lq+D{io5Qk?)MXNw;{C$6_Bj#)Q;KnGR4V7q$Ins?KXHu|Eis#*V6yjV26?3#2S(0KuKHGl8WC&^A*(^JxTp zsR6G5i`fXoMD_kB}zKygJN90m`;kfeE-TwLXRyt55lgn||1qGJVO z>fwjgnbQv%GW;i!kI>!6$c%c5Df{H9m`%{wXVc|o!_U18+n53~=1t-}!B}#EbLeTe zo)O62X>_`g&wXL5UK#k`GEQ}~Nm#stLJY}%Sak_fadW05c%`JwBM`Y{-gzZfS$eWh zXHH&a&XI;*>_+c$c`c=6&7;MVRkJly%%aQv|Q=cdvPT%v7)_OY(wSp7ecz zGkM{_c7bM0o_9x{rb*6FXwFLye^wSl0win)C;?1)H$S{H$*z%!h@~)Mp(yIWz}2=; zaUqZKhe1|x4&ayfxZqbjjDpa6rttfsoOeGCst}1ye@H154iqz*q!bR`<@tKY4$2l1 zxj-rJiucg-@)}E=?_;!Oa#o-}P&W%Km=(pD^Q-kxJaj-ip(UXN@T$(ziFbw_VR=Ng z*$cs?0T+k|ou!?3g`Z|qe7^jAL!Kuo__glfX9QyD3pqaulR`@w8?+P>@&g*+dZZ#A`XQx{X0sIov`^Iv_$@0nT^1xKT zeCsduvK5E66^xqtbo##-e16IB7~-^}?Z(1TFxr1!r`CfEp7h@6b=WJc&~c*6Q9qC)sYAF7les(}PG&w#48i+F)(?CL@WcoQ|) zE>)cyHQp#?K~|M7F!PgBEBi5iIld(Hg8cd{ROhN+=bZaXS`lCN0Z&G#N^3F3O#hY8 zVig8$ZA1kvqFN~`4ae)ny3cXd3pLf)?I_^GI!(2z_`_;ki7M@qIvmVFPx1L%|`QQ85ArLT!5* zvEf>R7daZn`PZ(rI?akY25F=0k_H^uR}?M9My#*RNsA5R@M`h1CM<;75&fnF{YG)0 z#vK;Jl2pdhg_a82V(W&?L+jd66nNdCl~*!X{bDQZp%w76YAhJ=CJk|Qunx%DjM?6> z^ng-r);4O_REB}?x%PWozZzYb@zUE6bq&w64N=nsfQwMi`_N7++@UpyMn+M)uHP)` z)4rfzPsmz-_|hw95>UE($w-!3_&x(PQF6yG-GpKTcJ zd7NrhUrm0XJ5vUdwsV>^^OvMQw>1m?#-nCxc+vFx4F%)Ek8Ip*fZG84ih%5DDC$4) z?0+IUHsLw5_VSi=s5Ig6ziEMCeg*13cCbC-2H7|79d-xV8S!IL2_EHv3u{GLDaDoY zC4Kv;xr{0iJkS^WGlZ$yFa$6Mow9v7^My^YYx_5*`&Q5U5(YZ|yv*OeH%~Sgq@XoI z_|%%&H25MlIpW}xd72?LOA74|%4Fu0wjZ6b6eT15nY>MvwGsXGk3@|_gEPLvYquPG zyqPl}GB>k_3K{#W^oI9e3{OxPCrOOVHH{n%K|Q}1Ek)q17~r4%9=b@&`9?vRfK{<0 z+_kRx`e11UQDltdc4Q$TrOQ60Ct{4eBISESBiVfI)6wXj((tI#7%7{#eUp)kfwc{m zA+?Alu+*}6(Q-(sHHQo~mclzu-W~@#|duA zDbd}*_acSAHA48YZ3Mpuu`~y3+UD2FhQ5y|V$m8WF`Uxz`>YRW08ak6O0|6{93`Zy zw4nJ@rDn>uVREE9*iAlT@U~Io`zNjMKXnaf-J2b@)Mw-kIjx`4ZI=z~DPw5b^V#=n zU5<^vEKhkf&-K;D1PW2LU<4a9TX`u@_^?s=9S>D6CF;D(SSHIx)Cq_tUBC_rK${DA zMon&DTqrIIFw*;yBNB$Tho8^1K>a&Ef7$=KE(`|6t5c4=(hh8r4QOy!WM_(V)?WCK zI2SNHH}bS}t2NID^P3+{oWELJ>LQ*CD*Zm#mtSZN6=VX()#q=oCpq)`mGwfFYzkrp zyiWI)4f|GZtoYk>$)}F+{n>Nwqny zJd^l+?ct}Wi15f33g&tuu;2dfD?57^OlODX|KM3MMG{E zt>vJ8@4%*c_vSomx*or(EFyBY_=iX|uXoZoEWa2nA&)7GmU+70KhAU^h=%NIhg`xR zxnmuxba{H7AM)62uNtzC47-D~TI4rTAop1tvm;s! z`u^^_J@ti2%c0zAP}d3mD@QlXANvtTM`Hf@XzNGn&(R)UNokIhS5y~Fs%NylSH`Wk z5n{n>We0+|<6^$M!cS}S^|_C8Avl&E$)1-EY`0VB2S5d{c+w1H(tV5Dd4#(gTHO0l zxd_|63th3jxq{osfQS0%f#}tu;j&3ss+hV2kvOYvXFsrJXW&UE0$jJ>$hb_7v8-~G~E z)l*pCIWF#P4Hf9UUo1VJ#03G`mDcK6PuH|5ujb-~9KQv3>u9Mepgv0ub z^KE`)nnt1OKd#e3?}r?3i?qP7QM)@9ri$cT6uXqQ_sfN}f{Fpj*6SRJ2);UnWpLR3 zH5(e~hCpw4Cb8&Ja&9vear*@J{Rpq}Qx78T7klXJ$y!K|5O*#s`HB5PjRUIRg6qEH zO0(ZHkjmiJd80d$S~kN#@S;F9*EX2S@SSU!QF|EuZ>HIy0d)iz^Ys$f1g z?w-p-E=46{Sd+}f;qGd0W+tCwTw~HRDyKLCDqV#*60Q`d1j-BhsJz_*5NF5Uj|Y~Y zl}ZQflGqPv18h&C$oOUMGWNSu_`Hxbo5Jkn994}4n`QUGRsi4B6BNo_0m--agP#>^fCv$ zvXkR~op;uVIj9HwrBa>Bs-P%h_YhI$(sO=TCW14!;tV4eM&cwCN(BYDP?;pRT8@ z0Q4>te+Dd)46Vxl!cO>3Bcr!fSLoV~4Oi|X&R?IV`rT0(>enPzYxqrrUs%?gLSsAX z82xUhYmAMb4L=)XW9`(NMN3HCn#Rg9G?;&T8I@cZ%3M3OLB};BuqG^4&|sNXhdeN8 zrMlB#l^Fm7E)2zc=%sA)8v=fXDee;bLi9_8pP}sS>1oD!xVHZNEe(3Et ze{ymL3w7#eWSlx}=javwGQ7?9SkQ@|S?1VFo#bUdpep-adXV3$*=^QXyZTF-D5~H4 z?&wPo*NJWhez(C}WG~CVqS~!-Czcg6nb(Xo+#Hu&{-1J^HWftXpOCN=>w) zdb69U{pLR7hpd=ic-d}?-_0u2nBmk4QS8ytX|~$sVxFbhU8Xp0^^#QAV^A^VPdMrVQm+y#07SxVNa6KT41D9Es^CvV`2y1L zZwF!8U7tv5>ZRG;$HR@0%}BciWZou@M_5Ujkxw)Apei^Ap`e)|QrwE8$&5vLbeU0I z)ys+=j02DW;v}^(gy;k&07UUT0AfWSfQ}$G;;-uzlvj|Mh(&_)02~0|AJ>U&!6c2Y zfEhm#Unph4qS>IJRXdST4z^&m5LDEgnMkbbvS4=;9Q<%Sk(2?>0{~%afy%InbqhL#(d_iSft;y8cE=#_e24zS0$+T5uD}io7mCuRa(omV&XlWai(ON!$ zkpiuRw*^(bXC^alA_`w4#RRiD(=vv2A&Q|iq69fgWIeK4zb9@~gYao&qYfjIkoTj6 zX-(z4=(d*O4f}xMI+aU}Vk0O0?qgiyR34+Wje=(5$HdyHe2!onC5y(1$eF1E5@jYa z1iZks>#0I96x)AXC&_e?thDXNgvNinPFs!qcbY%6rhjO6+iKM`YL|4BF~2w!qZ?v%?2KzzEGOq&a0de z?O4|0lH?O6khvgJECdqgAmSzyAb)*3fUlGE(?c*jDG~0A9%l$|lPQjeXD2?uB}7{I z6G75k7o&_zm}b)_k~+BSgt$al2%EvkXXm=9;INZJ7%EtwjcqS3Ny^lOLJ5bR0y{2o z2~Fk<{C{ER=lFbK3l{D90c|+!tZA}f_n3#n&M(Q`!j^B7=7+5Q!pH&|cK9_S>DU-Vj+$b<=Y%WsLG4tW;wA1EYf17pwME(`4wS;i4@IF)&)D(^1f=4*LZja`VVct_5Tre{-^8o zsVFgWD^5c^@PK;1Xp4aeA_w6o^hu4Mwl5Z>bt|gdN&I7zswi&JJ4RepY8R(u4(l<@mPIWMGd(9 z3p9jQ`Le5>Vyc~TtDWkyof^4=hNy#fN`g(N{k7D4g6ig_60o>4 zi0dqfF1~|VN@DR1tfknjm369vZL5R*vV#M;lM@a*={n!?baG2|9uf*a5r$W0b@0c( z=O9Jm9~1saIekTcMs)_Tagx(_H7jv~1@R)m3{ih9k-XYqs|}rmzN?INyv&h_%zj0WOlOZQsMDsvQb*MjYXrOv%uxn^&YAE?3v85}v z^-`(y5uXx4v3+T1Qfe6X5A0N)i65HzH|$jIJ{lVPi9gmg+)Oc?fi<*IG7N{E>vSU< zO}}S(Mz%CYw#`S{e-AIm<1d3%P-0bpcgnx*MvkUNj<-}gq()AVN6&~;#50B@J=R`5ifl0k zG#t4=Rzt=gLopG8*#z=z4 zNtKoGdB*|A!{mmeFP{buqnVdD|gPcR05>=lL) zR_nwt)l4w*exz5%VVIs+S(|uvo_GU?oqmnXBH=9blROsVtj8ZWZ=r4g72br&nJI{y z4j~2lq~NqV7q5Di_@oHR6q3axAAOV?jRq2z#>CdRxWyFXvHGrBj7);YJ;fBfZr7ng z1F>C0`lV4KV%jctl}XW7WCg$#h!FZCX2cT1NykX)#uqcUs>;Ekg-2 zW^OuB4KsdkngvZOY77slecDV@MMGJ0C2QJ3Im+^CScOf^Jb&iVHRhN`>sSr_WKEN$ zd&d44$E+%O1`dN?fquBW9j>j`t=V&Sj+TQedp0MrNX&!Ai z5e#<}osSL;dWKW}(mKae-=lTnqW0n;Of!h`bD`Zs0hBs9cyr;J(?Q!)2I*R1D7x#u zRM66Iz7BI<*xI4k^9c@0;nQ4*h4$y2mbKG~7dl*Z zQ?AfcdG+$d^$uNUv)vY^geNm8XN-gAOo?Yq3^C*KKb8hhA$u*9`!(h$FMQWosO;8> ziqwimS*&RuDqGgAOVBf1)+;;K`;o8TlCFQk036gBIKm1_6ZEdHJzZxX@l5;3SGHb`Sy9DWKNk*4bGUK*!Vf-P4s^duMz`YkdG z8cqf4PiyK;Yt06S#CkiyD~T~H7x|%ols_C08=rR@b-OL6 z)2;Ll8?B=lZ&Aivck5nA8z-o(!rY9OYw**ijko<)krIth@{MngS8kgp&)C*twv7Qe zq0jjye~3-m>=)47jeFcoHkXagEJ9}-*6N?saWdx6TTG&LG=k(_59W(LTEybQK6@2q;nk_l^ z1<9F}wJTlJ71NK`ra&VcRfbu4qjiOmEp5oQPQiNHv5uj&29bEHTy)Rr&eoh1YbY5vSVkI*{RXlv4p!$#~p6FJeMyvjXlhhTR9b)gNRt9FUjI=Q`Sgu_vk%CkxqE zi&kQa%MPl~kXXe7QN#hPXGm3NL5MUZMirwTZM!I>$W`^Wd`tiowLnA@kWlDRf7#I>Ln!N+ z9qSrIy$x{=2>Mll%1LTJ%6?q6=g?nZKge*X%QuH@d6-~$xXqwm2QjLj!D~hZUb#XUia=oY?@|5Z|pk;_3kS!~>&@0()n0#@$cX7(%lg zPb0OQ%xpl&a!%(A=tw3<9AkTte1VCtoue!P9Gv0LIA?ie`#J1U-`r1J98NG>Kkhji z?T_FcWK5s-oE+6o23Vh>;JKX5SY7N`M*u-cH~Uvqp@ga~Q7VCQMW^FEr?F@@NP*{N z?q{)TAnIKwc2Z|wEr%l#Sm2?G(>)AIOYH*Wyx62d$6&<4e4bJ&0`Yr-6z0^~c0Y5> zj_Q&@O+CS~Gzo6gXCm9qOIK$n0GF!1phyxxXBjfXO(0vc3;cRmi$LrEXJ3^-g)tyU z8zTJKuzOHI5m@{t5D5U{7q~0~f<#vL5YIsBw}_WLRwBlj4-5{IqG!l7Aazd=N`R}- zG!Q@ObFnx`+&GY*6kTJ~5ux)>w^ktA?H5^&z*wEDvK>TisGDx#=Qq?itg}N(G@zh+ zM6NR?27l3!VP?TqD!c}YJKIAwZREE_+8tTK?xuD3z^H@(8Ur~V2@+lze8_$?E zQs4OliJJt!z3~edl(uuQ(^+93l1jO)hM1?%oD)hPQk=D`#HmLV?nUhFZ92PqRU*E5 z>yS7p02p$e9&pL$>7KsoPAU>;EgLA^=bo8)&4r6&*%m~G6(}o?&MV-7ssl>p^mw6k z11a)$)xL4lo^-!i@>q@Xd~xAp8K@9|!A^SoZp;H0&9f@dGnx7}K*u?96q}*&;o1`L z)-%iv&joo5qB?sXR%lzrTdp0^S193Hrp12O2}@1%em1NW|KMr zXR!UPag6F^_IGc0hEn;FdaTd?bVy+0eDa#x&Kg1apmbsJyj@{>Hs`)Jbo5*(uho;%ht3bl=62{^m})DCv4E z)KGqnb1(9Eo2CD`Ozh5lAR#Y2+YjM8j%xg%_lJo-`x`pFYTcgeiUGq7zKdS0%Z6X?*do4;YSlGM~p?qyLvjdMj0@s^{-j(y4HOKtX#Z_B=KmmI3bT8Hd$*S*nD9to&+YO~{^oolcENKU!s3#4r}>7~;*c9`DkcX0tY zG2rh@nbh&d8}%--ufRANVD7y@;U2F7b+ojF#}9u|@WBUo+*IYcgOL8A#5szrwWJxp z>{1r+3XH(Q7&V_e^e0OXf&nY%zI)YT^BfnO9lcdn0psMQ78pniGQZ9oA+0piW;yNi zo8CkQ)KRa120S1Fzr?jnp{{`rd>{lv<(bm`<5>@}$GbeB05&Yd9>hC{0ETlO(rBYr zT;L4@(y$OV@Fs)|Nds^CHJnpu#{+vioI^4fkzqB?Z;vz1KO$j}-~>w>>hZ!tbXdX7 z{f%)##7z;8NWm$Z?Q{{ujOxG@uKwVpTt_!4xn$SOUgqFy}R;cR;~H8M<(r|DbGo3EYqMV8VujA^xNbW$0MEc;rV008)_J z6H=0ZQUEY~fj~eZn8n2QzMzF9XG!CTDTg75yWp=-ZHmhyrU3>ms6`82@WLaiK&Z2< zff<4T+5-e2jCRn;sC4e9UQNuqBhAadWfN%#IZH6C!`KThFI)cD38BTS7s5r8XRMQ1sR6Bgqd(l=TyQgl>Sgr;P&c(FPhOaLu0k%U5Oqe=wAVIU}gmoSovMEX$x zDXqqCbcd1b0fh`M$%+S>vd02-2_t?m=>p2o5{|(O{*&EHCSnr#k}Uir09v%kPnz;m zd}oUe>zM1 zz=qVl^0lv4TP8*WE7-warfk!Ml{p;;hJu>2RrEYzVi7XWg+P{_3t5K%B72Yo>`I*Z z{8d6B!b5$|>R3Rm)jQ)kStVMqiJe2OW+hwE*~aIhgawO6EwJsQaFF@FfYBjXW zTbFd#sJi~%sQ5{46q9R`E_gljuuy4zE!TZ?1(ANs#owbxWNuK z3}A07;R#c?Gu0wpsUk}&bQP2VE_Ll}(f}NtV4;N4QJ&*!1%?r8a0@2(>}x@bkPDmU zv&HfuL;Tqg5t~y1TeurSXMDEufS6c3MvaewOxq<_#I_X}vrcHGuNESdE=h*(F@?$+}>Y$nQRQE8@jSd=Y@7n|ANbAc(V= zv3gXO^lkxR4rSO@Ni(wYawDnK$SB8Z-~el6f0K44fH5uLMvJY^p8hnbhZ5l@le*N- zG%S-L(u+a#0wOs42RB%4Eqg>_5a0e`h(=O9Dq7n*)x5s7u7e#BC!3lhQLYr3qZgBq zS%tXrS`T{?VADb$8eo$J`M8tWcxy~A^za$Pd#L5KP%cdiDuL2!Vtj;|@s_Hv-T zOKvniui9V@+bD(kk+s&f3X$H3JK1+>qg8sq_Z|2vIUTlgGrZvs9(A!JF7dCSTG+U* zf~##z#avsw;~xKbZMQXXW259-RYNW)&qZD;X9eCfp?18jata_FU?{tNNs{2`l4Q%< zkPe@UvWE&J&b|c8TFLoKc<$cqo(o6|5FVn#hJ~_zgiu1$2p9sWbqDnK;2JSyE(uI& zultwko&Gu6({4mBo}^e&G#Re);XcypI1zPWrBw9nN(d6@JL&?*Izk~$wG=e8tC zOSgPW)Sx3h*EekYeSiV->hH9&MI&p~`kSsUR*sD0uBQ~crjbwZvMYSSqJKX0|LT~o zy}kO@&rIC!j&Y0Zot}srRrezje!r8y{GtDHTwLtQS$P3mV8Jj|fufy7oz!4j2;3<3UKO+h)Eu8! zwL_*Y-+!GQ1QwwYD$w*X(Df}L6NW|hWy|=*R{jfB_f;PHYgp`JcE&5BuTE0i>C{V1btyVC#8|PAtU+%w8cW$q`lq zkTAfO*+?~PpzHL+7>Z0L_2HiZ;`q1`0~8N-)gHbT0Pwv@0kltoc?21}71W%C0FVXm zh21FmkMbp)11K294I(VYB4Myy6V{?FS{OxHVctCi6<&)j?&1~(qcDC(7n<4^QpzG6 zfcCJ=0YKjVzZB0;xE##Ip#(;PC$S9rtXa2hjLHa1aEx2%MIY)3OwCmT$vg}s2_nas zPa2^a=z%~Mh#^pfThxgSGz7pV22=Y?gC?@oGzZTrrl~F|HpN*x{ccz>&m6APj)VFu(wC$Qv4-c%6b55Kc}cfET=!9{!6`{*ftw zqaYsPIL1pkqMHEdNXxVVonb^$!V4u$!F2rSC97wjLN4z9w#^g+vX0X*HsokW-R6^|-#UH%E9}tG@)PZz81#8A;Vn)R& zL>48G2o5Cn&R;ituj>x%PmWnB#Zbg@3O_@$upAITtk!hf6#+gQD zh#qNtuqlFmo8aojK7DW*=ul}gy25~`;bg&%BzsIsMe9x7pdDyklmp_=Mt zB@w_9{he>TPvust)U3vFczEE3#(I{;C=)Wws%hyA zsHINnlin(vuB4;Fajxq#5iG*`h`JgqU9_u3LMwpc>%PvZ zXMSeA+N!o*Y{j;zzjiD{0IXmMY{HIgq%iEMku1s<#=@HHS2%1&zH6*%Uz=8{waO{3 zX)MmttH zEd*gL*BV9AYAr}GZGXb7)JALBN-fnwlht-D+a3kjI#AojElhm=?b~*Q*v^5|o~^9v zEzhRyGp()M1};q0EddFx+|n)KYQ){ay+WI^XRc?dsNT>t3if z>~4mhWcAsu@Lp~1zT)u;ZSTJA@A~IDEU$g8gY_A&^agG6PR;cOZS#Wd^XBJ2tV8f_ zFJfxLK~-5zEwy+E9FtWz5$zA+y+XdK(I(9&@o1G1RnF|+D%Ez;J+O2i`f@!rbr z9}_al3UYl&av@7FC2s^GH=!b1VIw;-6h^JoMzSR*Y$k6;DQ~GE8|x-BVJGvd#e#Au z*Dooj^1z<5X4vwNt}?5(@)EwXuEw$~J1!&_um1k(GRfjH_963)^0KM=^7V!9_%d^Y znXk6yuL4su!YVUnXmf@-^Pxhs^+m5YKN$5IbAFWbzz(xashpWTb0*94+r934%?e=rthQ*)>a4~pDaI!BoZ@Ok=PKyZZUp7? zOV|-dceF=;G)RZENRKp0m$XTrG)kwmO0P6ax3o*YG)%{|OwY6_oPngHB^fZ}+xu|8^#!?2UpR*TXSjxMIEQz*hkrPThq#E3IEk0IiEB88r?`r*IE%Nq zi@!LG$9RLQc6eh7Hd0=eeHmIiJJ1n*TYV2fCmSI-wW3p&xpd_cw`5-#IUK1$XWg73h#}b|cSs zkX!m=7x|=9M15y#-!A#Y<#Q!OxgnH#Ae=g?r@E@II;*$3tG_y|$GWV~I<42bt=~GX z=en-%ImI{Aw)TjP_-cA_;c#G%yS?8#zURBX?>oQu zyTAWCzz4j*4?Mvayulwl!XvuEFFeDWIl@0Y#7DfuPdvp}yv1L9z`J`Ol=`J`!+6K@ zqq{D)&$70QyH;;y;Y^7UtS`VnLmisk}a<``Y*x0mi2d^mv!n@Cb8w7nD z3_Z~oz0n^%(kH#rFFn&Yz0*HE)JMJ4Pd(LFz13em)@QxeXT7s`z1M$zv2VTDk3HF! zz1g2V+NZtROa6V(yTKgbK_3JHOPFuhI42fcd&Hghk(WHBvLt8AX=s|e#d5nu(>z&s zX3i3R_Bald9E1? zzsFj3_kUdRe@zxK!W@_Z`tLvg_y7Kz0YJ=QWJ(*ib@uF4QMiy{Lx&F`MwB>_VnvG= zF;1Mb{*hxxj~_c`6giS)Nr}}^{!_VlV(kt3SHu~xszv4pFe>H6)F>D zHIqk?Rz$dtTQyUG+=NLwm1a~i{9@A=-0rhAc?3%lFld^Y*7eAhS`Pzw}FXbkj5pm<*;m4OhpMHJ&_g7Ev!>C&R z!R+|;;?6YyCj!sB0})J6!35EBPCac*X|Ff}DXh@K3o*=4!{qcE$iLJ!6idL?Laf5T z1yM{<#TA8Wu(<~#!~>1@O03bw8*$80#}L0j0}l`3N@z!|M!c)U6Io1B$t78IkvSL{ zk&(tBsjSkpGw63jQ@j8o1z!Q>Li|LDv} z%(}>|Ce1$q4Ro+Im1}dxJP}P)(M1_`&Q34!Y&4=hLF!Y`OEJxqCPI@lbV^A<4OP@p zN!9An4}~msAxb~8RMS^s#gtRzJXO`!TXD@*)liJ*p7S(uddfZ21Ojn=nmv5i;WdFicB zTM%vSmZM+`(*}WYJy@U)c3nz$U4mnE7dCk7ZP?+5A@=OvRP)sruMolg3k(K|-Jn=3 zV)6qE1QtL53qN2InPihueyJKR3{W5e0l=__C2p`Npnxn|>O}yZ)lex5ov~PNi+L=x}|Cg0C?O2npKHy zw~K|FC3~{q*lh*Kfc9Sx3}|T(Vm&zaAA{3K!0iNDHrwrkslL=|)&8*V+VaaW&zz#K zeYKe1!76du11vW7fB`VpK7j7G&Hbku)mQhRfY$ACobJ=*{yT7%1~*ovbQ4gV?gNyz zeO$;R4|MX-D%afk=b?|7^IOCI9563DW+07Iga?_WEXGxU3qQ6H-GeQJ4uAae$3_32 z(oM(W4KQH$Ac0C;*IjVJ4No`zNHVbnz2S}xT=<&;w!noiv@Utd>rHwZvz{0oDtZ;P z;03QWy^86}dVaA-x(>jNf0#`H_)`h@ilu->tRxSjLx46==m8b7(1q859qv?8yY}U; zSi4(E?+W+39WG68-aFi~;?_VxEe|x!!{8I47)3;BkXxR^{utQ?Gpu5{j|?2!fEQMx zh9b6PXax{JFU0sUGV1J%kq})0Y_<|N_K=5w+n?`_7_dLEBoo5(p}~@A{C)Axi(%BM%_HUhj zt7RTtmeg?&Ot9#);{y?~BZt{SY$SJuP_{XT0fu_am@ol4$7IMXcvpbE$XYE{bs)`su3 z|2W0pG6~Sp#Swl1JAmR8ptq+YFQY2KB*6Ycy4jgrbu(F2?sK6VUFlADFrAguXD!6s zhrBg~k#LAAi?vjR^cG+YAOl0lJ1+Aw#1F!wn*i3a5FNUW0bJmpLIAlJ-7Vy{$TiBf zw3`{{QkTF5Ht>O=Yu!d+w?YAKh-u;YkmG)lzXAX#0|amihn&K~>dml2w86gP)vO`* z5a99J0K_if7m51q;a;#nIA&qX!Iv2@f^nQ<9q-tl3T708DO6*sAhZ`0Au>g{5z&eC zA`)6}PxtFivttZX7xf zSGj>l{&KCF{Ny#axl*PK{&JbCIp#ZODa~&lbfL>P=fCv1nR|ZplmdO|O|QAjl@8sc zM_r^$cly=!4Rxw-cIsQNr`53@_GoL}>zM6&+2sj#v9Ep5WJmjB&;Isfs-5k1kD}Y< z-qpD0otSjD``;~ycfM@{@05o{tGz;sjv;4OjvTjX(=mZUtHJ>s+u` zU=S@-?G7&^57+PGjBY{jAO*hg3x8k%)W#*afdht+1voG$s?Z2DAPS#v3S;6CBXK+! z0R(}<9uodQ2?x;#dH?}{q72W_CDf1&St1idFb<(-4tuN)w?z-ff)8a;F=$cBjIaF` zBoGAA0BxWHG=K$mzyN+~asUf(68|9(5FiCyU;_l;5dUEs@s9u) zfCW-u0RX@wSwb5EU?e#J0p{QzwtxXOzC>`68A>Q#X&mu58B_0!`8lR5_ zQ0Z>w(Fi&q6Iy~1dNBn~umv3Jd(1E#BeNIR@Daao4F^jK1t2pGkOjtIB|y?8v>^ck zatLQY0FH4BT;L0JfB<|F0dG?!ZgVuh&@@-VCl`Pvxn60stz1fG7bpGsTfVIWqvO^E27dCl!DO zKG8Y|r42E|KTC+^uYD6XVR9WB$c)%0U z5CEWZ2jHl7K$HXWGB=vkN!bNT|FTM_)GMI%YOd5g`qKzp;4)tV3j#7YSE5p%4_9@S z1{~^4H8V}04>YM$PfIj07n2hW@Dfw=TRRnwHc0_Iu>(v2Kn0Wr0AMB7p)sTJRpC@I zR{~!3bO462P*b2ITLM4fa3#P1IT=xCjx-I^6&2fcU>~sUr!`u);%1qrTFc{FEfgleF+=|Up+JpbQn~f{L~$j= zb2Bp*R)rQ$2a+YsU{x)2UR6R^pD$`x;#yz!9}-{*TVha6bUJ-fYgJ-uQE(OQ0RXJ= zM{nvMDq%7qlO?{^2yOtCmKI};U}XvR5iRp>PS6H;hDEFIZgllr33mr}$^!#%U(-_# zXSVNPQSos0Ds&c0Y(rNrw~%<2Jg$`m@E|6Fb|n(=`MOah0s%XXpkgf+O}Dl|ofaCC z_I1;CT_N!$>ULmRLIEW8AW!ga3ubJE7ipQ+2!3{x1Yia7F6E zJWAIH!ZaoZ0BrlLZE;m4cvl}6lX{VKZ&7hxr;~P#Hw3NLdySxbTfzWHlpLY4Q5SWA z5BPXlA`lMXLGjcxWpsKkwt5k`4Y8M9Rf2nYhJ{^%dcnXuhwuklfB^0E zfvXlnaTg5vF?Z|g1o!uXHx`3+cY`(6B{Bgz_4N@sfH>`V|N75d7gQxIc#UIsd$+W1 znem0U*dD+j0a{>r3(-t>Lw$8vQ`)x{>sKO({`iL{nIz^{bCDPq>+=s0BtW08_D+tn9p2S zS#M+DG_QA2t=5J6d7>p2P|@&%VSokxUbLi%_ikJ`BDo2n$0DchxwXcf*YWd1?c_m!<9{>Pl zzpw>v08PcVXj9+-4q!;dIenL#xwX%^p*t(QFS}{H#%=t@b5J4FFNr(3o)aVsgnNcN zAPrc;puKfZZy9w@`5F%Zc2$DE4G=U9yP<7&5Y@E{EVVg_d?mDD0RTJ#DVV^;e4!89 ztq`C!hY%Z&Fpj_609_zRg(kCqRvU0sM`?P)S9nX!9K=JJ0802eKe4!l8b`u923?%; zU_8dJg7|Q}(H;HKA^tu0hL5{@d_}Z@09asocc25ZU<^^3jA7!ejdyPQXvB+l1-jr` z`8E(1z@(+Tz!|!BMR*8THWLt_ZHu;sZ`iE_z*27@0WyJXHyfni_zN_kH4PPJa|jER z*8pb#0p55e#y|ry^LW>R020|EHT_4p+wKH?7~-D8513*D*(9^oy+-5m*?<=rAG z`QKH|=I8U^{#)MQ5nkPI!{u?l2X+4DdmiX{e&@$pRTN&i0zv->V4U&u2YPv!svrQA zZ)#WqYtJ=F^r9x#+2=)K=;awRV7|HGJr-x)9bNuCZG!D@ap39Q=L3F|!#e1DSr)?%Y|}~l_W3v{^!9SBlLdW%YMreJ?-~!?fc&D z-QM2qp7X!{?TsGqZ({Ph`sklJ;maD!y3_^u4-c?Fb&Vi^iOHZb6%7Jm3($LY(N{$b z9pG#Jt2=+}p?W5UfB1=CE-L@U&z^EI-|;nn?e{+U;hqoW9`&hT`cGfdQ66eB!nzCip5G^o&_M2i|diZrRxr3llcFak9y)ENMnTD^)jt3XB?en^d~ z<|#%*0qyNnw< zehfLXsc}@#M>!KmT)Z z;lqg+gMSY{zWn+0TXr}4IeSp=oLO@ZPugd#d4`{V0{+LJb@eUCpiH*mq!Uj*p+{kb zN%et-DHd)h6eDOb!r^!IDQKW(qMb(IYHVTFV2Cch2xE-Bsb?5sirLd(jymqhBahuB zSdm=XB~+Al1Hxqyib%fpT}iMpxnGY`PFcl+xJf8umRfGfC2}pohM<2PDY>1K0UEeq zmujxbCX6()cO#W@&PivT_GOnKcTws&q>4|18RmgT_KBUJXPUX9or=C^W&VV^wFzmY zlCt^bnPEaX=%9#hmuZ@lehO-+WxZ*mdyAfmYN~ZwDkhRJ0XikDk;$rRt&KIB+k~R- z%4@HIRm!SrqzSvEMw=eVsi(d!%dDuRwuhsw(oRb)gCtgqZMN9rie_L$+RjUFy=Yx)Z@&8S$nB%<{tNJ@>ylX}QfQVND4OF2%y7dq z!V9OV`%X-;w)j?zamKOrtE~haOdns~}f@)gee(D1IbJ9xx^K6_tKMl2fH%CqN(>yPY{&m(^?N}g-dv2uy&&6smBA zEM%bwt}sB)iBK{ztl?e?IKv!TL>mS0pbtGDfOQx|f(_gPN_vPv4OT%77yO|I6p#lU zZjXe%`GW#lh{Y_nPyv6iA>gFw7%z%ZD>wvW4%dN13@%^+O=KVzqD4doB0w7!iNpev zSfw-yAP;OfKm!FZI5Q@XioLm_77uwy1&onyf`r^6AE}fwHqwAzXd(k3SdevW!IEGo zNE|)DfKEiQRLB%lS?6wg>o zqttpb^{={X=^$LvQa|`Hlm#KB2e9B!Q2r{hN?Y)z4-2qL!fvjteK{*yg{sz}XoC%C zD6MHrt0BJ#zz8X@>rfc+6anbP4FNEK0R+H?^Ju^b31G@@d+Qf3%)kgOn1f$6tEa#& zai*2C)Yk3eZMt^0c{#<1Al1`&o{LRw!Ap!B?Up zTh+4GwH=BrUb3(PuSkUjZyX8&jPL^kWQ7eXXaN@>@>}2X_AiX!01p4d{5s zTlmXrTU!*^8X>+}(S`zs(}Nc1{+IW>h{G=M%#A=ldYY!x1frvde@lfK}<1q83Aep6?dG{jY8TYcrKxr=w z(14sD(>EwWCh}G6k$@lkfC0uGNFW#>=>)tLB3a0R4tPL=17GFJS>7^mmEz@IfmzRw z95b2iWoG51vA+YcM;x&r5X1f>!yZ;>9sXhGQ?wZYrx-{V8i;FF>xIwu`mDOP|67!ZIb<3Rudz=J>({f{{uK*tCO14J4P zk#e8g0F@p}dw-zmpFsNl2RTSKLhQi+BWQpFMo=U~xZR-<6ZAk z;rmcbe(B*z#RdKb7l=IsKm)1#fCG4FyZUw{aaOasBsy z0XTpKcz{2VYJu<+3)p}PFkCw@00=Pv&QTl$U;rAR10A3M^Cf%0C1eU90~(M8Xb=ET z0dPP^7XCsfeKAyY?T0Pzmp)w(UZvy(G6jBBaDECvLFHEvQ}siP1&3!Lhim6zj?yvX zF@Nwhga2@UxkPuIW&?+IcP@|sBsXw5AaUHVTQneX0+9(C&;mC=fkyBGFVI&4u?`5Z z0|DlNLnaV62yi6FG%oN12oMwj@B=Xr9YVndlILic*KlE%a0~!+JIH!o_z$G^iLz&j zm>6lAcz3{sa7N&X2*C&&U<58;Z~qVml9vMRHV|LX0#XKK|A2f?!B?B64Z9TsiKrE9 z*oFf1hJ!dQg%}y9fCZMtKnj2br!WzQRS**eLQ^zhV95&RrYxQMP)xh zlZz%0H~Csmaccj-1vC(90s#O#@Qw(9j6JA~%(!JC2@xdOlcpvRUl0Q*Ig)w@T>m8l z@Yr6;n2s?C5kL6@ABh+8IFJ2Pj}BQY5Gfh<5DArFQISy%gW#5ENr*_-Y=`(d<^gRl z)CE?+OBTsXk%$mm`Cg~CTRgaB3;=?}C6W+f04ynSt0jX#F_c-!bM|Eq+W3?L(O#B` zl;_B3JZY3(`44!&0#x}AN2!BJiDk`*j;p7HMxdDd$7KV+m_X5m9bgKXDVu8k_z%K( zj$OH#LWYY$7kyq(hB zP>L2Br0;28mGBf(s1zhgpg&Q1FR*jOXaqYD157Fd!{KnL`K1bKR}4Cyi<+uts-Eo0 zsj+IQ!w3`!_oiSNrvrhZ&?lmHNneS!d_!EJ^a5_5>rN@*IQKcU#06&1A0%4M@>8<~oveX)&QpU2mmIFEX4=^Z& z5CLhpc~lu{^S|ZF`R_YKXUii03hXAS<#RC73OHveoLUh=~A_ zMro=T05hNgLdvZypaLnND_tOEQ~G!?$pZD437Gb@KLG&2=K=$eTBa}nlBWZh`VXei z0kR1c!uYNv$pSk|vnl|1=O|W$6EaP4`U!@p&A3Fx&sDa zd|ybmKhdip+FZ{|v3Od&)k3{F%$(O7kuC~jiikoT#l0h|Uf*kD3H)C1)xih%xlu6# z2#^VcH>8Y^1{&ZT{hIj{5fv_Q00_Gk3vdHaVR~;=$6cwsGaRusY{S(Py*x}GJ1ohH zLdkZLy;ebyxMT%>IaGTK7;JT}N3jlUzy`Ev6l~>IOu<&*nHLzc%H|PQb43&wl3J*` z0R$`^&ilx~6UmhvAD0Zw#OlM_0>tnr9h*F3pxny?FBY>~>;`z;rd4SK>1-an+|8tu&Du;GvG&gF!ffz&%yv7(f_B6u zThBqEdN9z8*+^XM+RkbF&#)8E@+|%v^qkPb!&P@lw|NPp`^?WI`_NF7jnm7S(n_&T?R3$;ghKRG z(?jcW7n}vrJk&{@oH(4*P3_b>ofNf%LO%V|xFk;|P@PJx)myz>OzqTPZPHMk6o!OI zWz9mT%GGJD)+D+fF$30bEze?&6jo%`b&Wz?wAOj8*K6z5aP8MQEZ0%JPIjF|FSOT( zjo86+(|^s_O%>RQ4cU<$W{cg}m3>iFJwu_5 z+N;gllVsYh4cpp-BNHtlvHoq_x1B#tQzf_^8+61~X$RcFE!@LR+{JC&$Bo>{t=!Aa z+|BLW&kfztE#1?N+ymKcRY2Q4!Q0!--N~cddD`7|!Bf;t-sNrH=Z)U!t={X+-kCLC zYlq#gQ`_N9-}N0j-)-Mvv<}+P-u><0{|(>)F5u>^4Qh7X+5H9it>6m|H~7uq_o6Zn z&KQq_EeI~*7mndGquUuS6BN$j_!QyU5>ANt;U#Y3+43e;5KbpPQX$Ub)#2jVVhU9- z-!E?CH$EroQ3W%O<4G0cJw6~9!xKPG5q=-nV#mC zuH^l37kM-3{E;wvvm$tsL!6F1s*EFgwT=tI>es{)&+OZpPV2RfDyaVHeEuW(u_>jV zG6nM^ranWsjymh`1p`0;1KuKxT&h67<=#L@n zMI$ugekjI*AHps|#J)M1kN|}&6+6HHfiMxy-e3>5;@Q^%DiB>MQST6D?LxXgTd)qM zshgRwQr(XJ@CiRFdR|Q8Lhj~LBu66`=zc)zo;hGZdp6Jk8qfg=3tCqlzFzdkfL&+zDD@s~3OdPf5WFkb5b z00*qIAwOT>LGq4a@)nT=DUf9UHv>AL0S7PhThH~KPV*CP?!)ry1amABZzwk(^tqGv zhEt86SV5BKy9FWgHOFBS5e5jLV_6kQbYBG_2X5kK5bI{2G=KmdSNBq{Z77xn=7w%` z6!j<32D_yLRn_&CZ}~~`^RE*2=;GqnLiRj=Feef@0JQdn(*-hcizxvBJD`bj-}F`R zTMYh@1|6VZQLzFm^;>zjck*5ZgeesXfD*AUPJp+2g9q>@F$W1S12!oz=n-10wqceu%pG64h*osknv^W zN01>!jwD&q&(&bB-F=fuAS<~iCoH=#wHa4B-%^xBS%DmS!}>SQ&O%#ZfI#B7O1zy4TvJO83@EE1qW_v0+=OT+VpAE zsa3CL-P-kQ*s*2LPD%DA)~a2-;!gUM_dl&KW$z38>-rQ6NBXilhgpnt@#l&J{Pr5ZzI1!{Q zFw-$iLJKwYP(%||bkQNfY$-zGpu{awNV$Y`K}j*RQp-viCCX7xWwHyj=|oi12pwQh zbyZeXtaG9}VO(#<_SPg7(1!*Mbyr?{_4QX^gH;sNl{&?eQ)4H+N?Bx;HEv5wh4qP8 zX-yK~hZ(#WX^sUnKnzX4_)Kf9JzF#a&nncDaimjKFeD@Zc(AWpdh50KUVQV_mnLe1 zBKBWU``tGzf%i4f2nNUn34tGC@TdxKM-(Vt7V!FrTMf1d*Iab|)h)M*c(((|o&|Co z_+*q*R(WNXjV!ojm?eyP;U9K5Kw*glu)zog$c^~AKv>|R0FVr5_~BP2iZ#!UK0a6j zZ9dB4y?JN0`f9AR)_Ut=HRamsm-W>Ktsgr0Vl8{X(4YXUKvTa5w*twTx{U=IU!URhZY3*QFd5qmnakd1Y-Cc_wsSKXMln} zp8AA01dL%M zV;RkO#xRW$jWSW=8r}FtIL0xDFO;KM+E_taRc}{euQ=RK%XFD+kIcDv$f?w%ovp!W%1m)%> zPI^{2$@x!!9>tvlC1^nndQgNu^K0*vXD(4fPk$~cqKcfTNuu;9fA-U%0p(~%J?cSc ziUccc3@1J}bx&S)tx7E6XGu5uQJBV5rd3p^M8Bz0ubI@OsA(ofH?-54234p-#at!W zUivLf=R_gXFdB_(1upDqa|%=O?z6@rdGA9Wo>I+`&!t>R<^UHZEbCP zTioVWx4Y$SZ+-h);0BkqN!4s|A;?+bCRe%3Wo~nw`&{ToSGv=sZgs7DUDOiSxZB+y za0RfA0zBdr$5_TQrg4pJ9NQJQSjQ~$uykR3V;~1v$U`QwZ*#oklO$BhOJ;JD zoea&a^|;7WrgD|7eC6sM8ObDha+kgQWiSsEYf{E?nazA=G^bg$THdlq!~AAA$63xR zof(Z^v8S^ByizG5t_S|FYcwIk$Mzz3wn{fCmg{18=>+f)-?f z-V0}Vp~H>jeM2(e`RaFg|1I1u#NY-1Xn4mxj^>B&IO4^eIKC`K3@O; z*Z|s;=Um~Sl{(b{;0Dlk;Q#_?!yK~EEe#xC-6}3X0&1WG1sq`MFQ!2i3`n2snTO)Te_3c-Heg^DOoiuYfFcfdDD^ zK@CceBNlKV1_{_g78G!Uzf|4~ZGU^*=T3V73_t|4Jr2{oDKbFW;Jxz$yUqdw`jCMb z2tUu-f`ZV1YHI`NNC7kWEC9Fx9SDHVDvTN!0MH|o7JxiF7(WH@tio`Ct?Mi|Pyp~j zK^&oh6o5C+0{#HzTL8~mxzZCrAPhqNBEStpz$h|8*igX711$jvo(?Fu&svifz(E4w zfe-wwl2JE2_=59TLD1R)8Hhg9GXgFAJM!DY7T^H_2rVyg0r(h0H3Y3WKnoQZgVxiy z9~448+{5%DLI*>_CIUp)P{0icE!UGiCe(o#=mHh1J`3!uHjECO!-2^Ntu_#V|5L$9 zgaH%;Eiz$%G33P1!jUPwLzd%1R7}P3^1}ub#3XV>)=)q%{4CcqfY9o|Mf5C&p}fwj zLS9TkBM?Q?(nMf%0q&DKWIO;CfW0v+!_G5;T*Lz(R7Gm6#w@e9d$XvL(P90n$kh18unWgqyn$%!tdh~dEtr8T?5qN4m~t#FV!TLpJgt;_#%TOUfgDMa z1UGEVMlRdNTS7?GP)J&2$Z>SYjC{Ti?2`@btagh-&_M31K$-lkbnJj-OaQISz?<}}xv5BEOh*OSHqUB8 zvV6x;?8iIQ0nTemxtz;2J4uvuvrP-AsVt4Eyh9@pN349vUgUuu_<>){LFVHC9CU;J z0$@H3xH_Zkta!u&9ozv02ulD^9}a-bkL1T_41*O&i?F0i(kxBSdP?_tB7M4zo03YE zte3u&#;eT1to$r6SVnaOtpf<29+-g`n4T19$H+9pS;T|gtdGx#f!?`6e%!|~e8|E8 zo!B!?>YPi|Y_B4^C@jg#?Q9mHnxVZUjo7Tkh7`=slDvuxEiUMQ9RM8}NPy8KM$cN$ z_WT?fK!EsUORRHC7(4(sWX9?Y(51Xi?h>M&>duge5beaI*Q6J}yRA8Ni_r|NIrxGu zKm*yT&tGuAxN)$~r_I8X-VP98%l>H-6073)$tl^HNaR42_6W}!16 zI#aNKR7)*YQ*Et6)vQD9muXrSI}KGwl@?MxRa&jp(Mr|KTGcw;rUY$G91>Ndm{nUH zR$IkY#L`s^($OfXr|*OzU@Zz^C01!IRbxFYWYrV}Wzq)`(=BP%7XErxqKH=O0x?#b zR&#B*YLzP+4XI5b(+Sa5P6f|c6&7(7&~iOjeEqC+jVl9XsFTW8MO{!m9WxfqSA#uR zeZ^Ec?N>V6Q9SL`dHo=89g2FT%X>vwgxy!7VxlXFlw{@Sd2Z{>eSew z%A$CMiI!a=lJymnRkMplS(~*ll@+RqRiT{?ikU^Rn!Q<}wXmEGs-8umqy34W9a^Rh z$fBL8q&1^;PqIUszJ#PD0;(Vqf^ZU;M2N z`Q;?~t>1OZUjPo^B-`Ih>fhyHCjm}i1rFSfGGPBTrv;8+1$N;5pgak4yF)ZVHl47;Uk$d8m?g*?lKw9VI8iQ8}4Br z{$T{(VIdykUIAhwK4K)UDI#8CCT?OUeqtz&Vkw?tDz0KHzG5uSVlCccF79G4{$el= zV=*3MGA?5?K4UaaV>Mo5Hg01#eq%U}V>zBJ`SG_2tP?v5_DSxfzaApboxSw<$XoBXKF{lC~paHv)h;;w} z82Ae?P*LR2&Ueb^7};lt4dz#+iGbFXg8pcbUWvL$Xpbfc*i#@tA%HHRk}#M$4M+el zum{`70+s#;Z3qAc__-`thory*0Z0HHpaBGMla)?TZ2*97sk&U|=YMEvpMz=aS&BI@ zfSg7@lokjxAOI}j27B-V1xNq`QXKo!00uAsU#^S*KmZ!hfdp_9j}B?Lj%%vuf-ppY zkpO@lIE(>KgAPbN&{=_qPN@Xwg8p`vPG?RRc}_g`kqCCqJQvWIiQwxWKwmCo8_^5^Q0XLVY#1=QF(80t zbb*MT2nP7Q06>E*2<>x;8lMJgp(g5($b=54f(;-KHedkoIp~2nkJ|==+}>@=7KlK| zK7>$+ht`1sc$@e$f*ptf4mgnk(19OFf#CLn1aLQ~se(*M>$Prc0(k4z-tTn&2NqEa zni%O6zyqex3nSo*i2#i8Aq>ONZ;{B37@%&O20Xg3ivcGK14r<}`2iXLfQev)4G<5^ zY72QW0F*Y5z!{$^_=0nk{)mp|Zy1N`=cs}NVC0j?j_r^N@0gd^mI(8p@s&`F7H|XK z2mlz^fWE+SF35@CxEP5SQHeQdfgezSzSxoy@sq4bk#xC%87S(B;07$nZ-How2%iXh2=T>6?53## zF9&l*FXk~RlX|9>HE9z#aT7WD5S#!2Ue*DGKm(bUh)J(>ONa8daDl%aiHH#h4_N?F zR|p*dk40~ES%2kG;f7?5*ELBMR@rqmUx`@(Ax1C&7O2k{KxKi*^~R-s(H>Q= zJ{m~&Rbc^bQFIvo5a?OYc0|6GYzbtHad1!{7d*A`iO}bi1ddr|03GN71OSdTQHzKQ zfFJmERCo3&sD$bpZ6w!VnxT;jqapYp zw}Fmek}ar#M9&k(_y?IUfUKx_k9c$qmk7Mp>+BJc^vD6;{s?U#lUu(fW5(Vr7@o>_?r|T3FbZ*EjOBp|A(?)=qf;a zy-5sr+W`JwUL5&WppUNtt!Du~&jjhV4-bJItbcqx<{Zrqozd}Z?Wq&gnY`6$o!8NF zzFCplQEZVgX&6`l1K@xj*a3at`vgdx&37Hgmx%Q?2pIsL&jI_=sg8;0Zi8q64M>6D z(E$R$8HNF!)rNfJm*eP}9#pX&?D-kC@1E}o9~J-nrKybcS)Y*z1a$|U761V3k^avC zAMpVR(5_Etq#w&?`iWQv0~kE><^VotXaaz9w@-fjmtz77>zF{Gs|E^y=!1q)m4XHj zu4BVS+rfqf?YTi?$|1#yrqH;tS8*f9jvhaP3@LIX$&w~dqD-lBCCipBU&4$jb0*E2 zHvVto%&BuH&z?Si0u3s3DAA%uk0MQ~bScxOPM<=JDs?K=s#dRJ&8l@P*REc_f(ejDg&#rwt_wL@mgAXr$Jo)nG&!bPTem(p4 z?%%_YFMmG$`u6YR&#!+!|Nj2}0~nxy0}@!Efd?X(pn?lB*r0n4*d+ve=@FFTxn3j5E?$qm4J>n4^w6s#u|q3-TDG zkV6t#q>)D=nWU0SGTEe)Pp0^zlm`A&2^&*lnI9XK{F9}Z{#8$2OfyYIpque{FUQ7;}<*jw+s`|{gwVfo?t! zuuT#}T(QL$vqUjX8e`nC$Jp8%u*3-~EON;QjZAVw0*Ab^$|#e}aLoFCT(iy5&YZK% zEyGN+&OIy4v&k}wx91&&e)ZI(SI%+j zx8u&>>VON4wCNSaZadJtN1nU!$0xYE%V_&f`{RB)|N8LGBVWDs`zb%Y=*-_edC-ju z?mh9}Q+~bq=g*gY=|EG?xcDNoU9$V*i;lki_q(V5??lIs_2lgPuY9c|9R3Pu!0zZT zdIXeR+x`c@-er$}2b>@U<%757Ic_Avs~`tED4-2`FoYs36$nRY!V~`Jf+$=e3nx^< z7Q!%w1X7_4YiL6Nz3_%Q+#wHp=))fZF^EDOA`y#d#3LdxiAr1|6PxJ7CqglbQk)_c zt7ye5Vlj(a+#(md=*2IBF^pmyBN@wR#xtTZjcQyY8~)qaEHi8`YjT_;9qVYvJK`~q zdfX!)`{>6%0y2<-93&wNX~;t&GLed0BqK)$M>odmk&T=rB`aykOJXvUn%pEOJL$M!Uf@G}NFeXx-YD}U+WveRjsaL`>ma?2BEo*7ZTjDa8g<2FVTWLyN0yCJx940Y~ zY0P6HQ&L;%B{Q4p%x6L~n$nymHLGdOYhp8-+T12LyXnnuf-{`r949%;Y0h(^Go9*O zCp+8e&UeByp7NY0J?m-Dd*U;n`rIc!`{~br0yLlk9VkHyYS4osG@%MzC_@|S(1$`a zq7t1bMJsC2i()jR8r>*IJL=Jof;6Ne9Vtmm{%X>bqBNx`%}^CIq|%qJi$fG)sY_vM zQ*wc*Av9%aN3@}kb&Q0kAi)9)7(fuF2=%5)6_1Dxl2njn!3HouLr^gkl4^9o2s^+6 zO`^I1jhN)AOC9TWG86zF7(oFot?61X#1RI-009k&>Qt-h){r1T2P>dz71*GH7I0xD zndpK&z90hzR3Q+2wQHBi>R9b$h#MR*f)QFEs+#iDst3`45fY#wx>D7uGA)RQHZs~O zpaBLp$U1Y(>^x1(aF#kV!#6(@E`yN$*g95 z+fvSYHbbE8?PyCo(+(9RwX3!6ay_*E4gs*>2P|+w2XsJ#1>oVXANnn9h3nquWC#I9 z=)eMuzyWUj77qdlz;4y6Ujf`J3j|Ps5jH>o0`T`A(+xucG@yY4%t5Bw$bteizyJe8 zxUmHha2NiejQ}t}xn>{$7Pyg#03d({I!M5QvrrA?X2G}r&@TbJFxoGqpb9n+z&dui zUhcj($jQM_CQ@Jo17slwG5EqRyr~+lHJXHlt6$}dK0hKAc|Fe0^8?(&osP+2xK*8oOXa(6Ejh6UV!1~hO14^|)mhV<5{ zGIp+z8*LovD)|dVHiBFa0$Tnk+hDr_Ca{4Kyj#}7KmjyJfEU1k02vs82CT)<0Cr#m z7_is?Dd@qQ17Q%(YGBM#m8+ZKeBuFr(!x=xL14pQ(1tJc=O`29y0W?%#j^!Gvl zpaGi;!dV`$fD86;Yp;*0-5480vTyEhOWDm@MgLOj zp#{k;NWF9L@C}<=y-|*Fx;y(>8&JBf1(B}{uJjK(SG%?0{=o|#$yph^J3|G}u4-A1 zp|hIYtv7%3Q8yA*4gPSPMA!B>)qQgz0sO$S1yQ(K4RUFfXWHn{eR&PGAoD6jbp~Ci zf*}Z8X_k(`xB&2Xfi)uZD!{o*2iH)t2j15f#Js0$$OyzkH1(<@J~#hRIARTAfUM*B zLSJtzmeKtWb(g!Ynq4_+VekXx>YNcqt~BPCTX4M>o#Rz_JfEv@*4A?*sjkH~qZ4m? z+5E$>I^e27ikn;vO`fzX$581T?&Py`KDE2Qw&?pkcFmstAA4^|$c?@D$ts)n>Sc88 zb?*J!gI_lC?STwnV15|Hz}5Gae99?5{FWzR-N)a2*!w!>0bCmoEHDE8tML50M&I-` zgq@9>VI`gF{%xF2abE(4Ujw>E^K}`SQPz^NU)klE5vbS2NmmCp7U%uL z%$F%}2mz9tJ*eT1`CTS301Mne306S@7=a4}9s6mX2iD&|G~WyaK#%>y7<9l78!8;6_~5Bvb10hz{;Vd2>z8iHbGgxrxq9NOi8$rVJr?U@FYmkSU; z{gIshy-`+OO;?lQ;TY_n5$FI6%)k%mA^|L0@wL>@&73b%7S!EUAmn29i6LW!;xncO z>oFNcOqv3KRT^*rtrnU-?SKZX9hy1fK@ejV ztOEhGfG*1SoIfI@suY*8C1gXMihRMILrSEVD5DWD z<3wWQlpx(XW@JZBh{9E&M~b9`oEQPT<4B@pN~+{avSdrTa;(qv8AP#V^U^iTIOY9W@hGPs6=LGdgf<> zW@w7$Xp&}Wn&xSuW@@VDYO-c)y5?)bW^BslY|>_J+U9NIW^U@{ZpMWkc0e06gl_^T zatJ3|6lY<4K?~>rB=RQy%)w-Jok2WjS|!JHMrT@B=V1T<4#dDoHYfTd=W;egcrxd4 zkSAN5r(qoDccRaBc4tGlr*{@de6j_77DjfmXS;ww7leUQ=wS*hRzdtHRsOMo7kGgi z48I)s4a}WOi0VP4YN`gs{-&}jPP}SE%mHWV zzyfr^90;ipwm_K{#2hGqFUkN1Z~&^^8Ocx;Knu{? zt~x}l;>4!zgtmGGx3PEyWsha9bh+BrPYn^r}P`Ij{>V&rz#1_l|4;;W; z^klkyLAb%M*1*ZBAqxPhbQbKvnt_q2z%;tvqeAP$!j^8w`MhF#rHC>K7P*0_Z>uB)|b2Ko*!m0VF^T%ofX@Dgd->6~yQQIG6$Sr$M-Z z7j(hF_G-C`XsogU0O+g+Ab`V8Dgrpz0sz1&ji=LUfC2>mR*4?KsmAMjazTYDEz=&v z(I)NEQUn_a00UT<0IZV9qO8iYENg{97kI&y3;++jE6#$c9fR1f~_KiZ2Hg1ayKyB9d7R zKp4rbqxtrp$hE2S%CAAN>Kq7w5Rw@;@~!7Ks|5bOKzRae0_ed066$2Z@78X?0tl)R z+`y$uXZ|Lt2K4V103MmW0Plsb1ge#trK^1&1c|mmRz+;M8G#Cn0p3z4e99}v8ic*t z03*^bhuZInZb6{#**k_~pHfz&HiR1xumPI^0()-ra_J58unVvj_mbHUe6Ok^YLx}t zc-F7GA~BgMG1_&n5jgR|ZUL&5aB>>K-ySgzqi7iXF9x5g&jxXonb{EAR}r&l87J`) zZ*dnpgbQbHxlC5IrhrKXfck2{m9TBfu58P`Y|PGV=T^aFEr2+300JBU13c;u zFZ>n+7TCb`HUuYovb&z-0k~QWD8KKdfD?k=(K?2xY4Xkk$kTNc#vMQ^9!WtO|l&KeJzz?`UU=_04-mC}DU3$i^ z4uBrV4las1TL(z33I8VD<>Nts!Tv#T6@W7Kny3s+a}Ufwo?7spCBPPN!2tlC3rMOh z`=TkM@-AyYFK?{|)Bw~9fCdyW3y5h9Bmfr38a@uE7u=)d#;B2{K>xmT4aWdND>OqJ zfkV@1L{Id+0q3la^yF3n0r0@Uwx~S+06phvD;q%#1alV$$;6tEF()S zfHs5+r)n1P+XfVB6%4?mMrQ)_beryJW$|kGy7fT>fD4RS0voknouit~*Ko3RfxUHH zuP|GOa$otaR$E%`PU8XSKnw@~lyU)253>6ruBFjH45y-IAFLZ7K%lL0xuRC!Cho-6 z@DI!u->P)O9)uZ0bqYL^UcYr;|Fs-ns)_OdSQi8-XI(S@bWcBA-7c=1h8Mq@Fk08? zZ=a)Zw*YZpwQ(0j03a6uFz#fXvx&O40`xCkXR*)zDz>&LV)M0M6Lq{o_d!TEbptd^ z$1e>}HC4L+uNs6Gj9GO4o@=Rg^<;JS3&TLaQAAWX-a#0+s>*A9vB2)q^?Qo3;8wvG z{{ZQY^zI%2S^@SP-vEIdgdV~GuQIrUXX4tKXbUhc0mJ|Y+_tn%eSQ+?x}KCgF8fqueVWqcomGW zE`nZuk6ESZnR5$h3>o;pQ%It?f14=li2v+&(E1Q;}HkH^3a(3(Tn z@Qq`#fA^{cS9T1*+-yA(l@>Xea;%BsKvy5Y38!#FP^nzKx}~dnZ{MK|7lfUm_^4-9 z*JZ&B>;M8BFBQ{wowE8tfIHY`d33sTlk4Gq*J-rFCk})-qg!MZWIGjaJG*;(6}-E+ zOLcQkI-+|EYJ0UN_xFu6yb13uMX*}ikc#&>+{8njX4 zx{0PM$$R{YI^v<~A}rtPt;?yu6Bx7^L>MT*4*2wh&w#LdI^vS@4WN6kis`*wNxYl9 zR9F0=$NnnLv24_{ECTHJuycHro;-)+x}8mYq_6NCZN`E z8iXDr{MoM^sfwpVFuUU?_eNO00Iz-Di*mN!z{M<+NJ{;#qj4gS0R{yUjOcTv!LA&>0yWrCrbdt=Nt#4i1?|SJE5dB# zuyrFFEF6017+bI`OO<+!@bwG0;1(G?2vlKUq(hsYiz8lS0mkjym_X-_tWxr1%AXPU z_SN{8Xu&KrW^4(48+UHqyLtEa{Tq02;lqg+H+~#>a^=gJH+TLVdUWa2saLoDejR&u z?c0092Kv`DUd{%)#BllANK~v^H2_`uqkzWu@y{-vtD$Yg06Nakro1tX4q_nczWfZz zVg|ZSvrDzKHaoAtjrN1Ei!Tg3fCtCKTkWyf6#Gdi{4`nsGtKhqu%L@vNJ>8)YAa~I z4;`%HDfPf&Km#nQh)^R06-4c>6IpA_wTQestqaf$nq#f6Vyurtu82f&Nr5`x!iE1f zi*mLXH8Mj14dUZ5A|FiyvO&f)G!n7{j8I_=?&O@4&N}V96VE*L+>_5f{rnTqKm`T# zNc6%($V>8K&_Mw7c2K~;Dh}8|%N}X7t;|bhEC_)gYIrFkHnd8?j4J-JGJ;f%2G~J| z018ULh)*?QLxUcEWN^b7#XGNxPGt>s)KaNRG}n}f)#$R!HbNjhsj4vGhZ(YnXbTvA zKp?Ui7@dhCY^x~m+ED*ewu&w>-EzjIc!x)z&j{6;iD!(TnXO8w)aE zN^>{Ws5L4L+OGx%e(<;0h)#u6BcobSDd+n`jBF`Hol*W5th22@K014nP&gj1uVpikjG%)U%pia|IKYK;U<3mq z5LHSl2o|(g!3%my0N|+$`Ph~cUQLaH7Q|o$H)xP8{`#DO>B@PS z^n-;Z-~c<^fe~2XEUX2wfAXrr4UK>U4ItnE3V4AL2p17Bqz#I}%MS!~7ZE1eY6czX zK!Sdt0qjksgfc{-3Kzt}C{>|g`|3&7TA%;~tiV&CBICyLb-pU#uU7%A!L+ECv<})J z1ssS$08`*ZIQCDDHArFZ2x-3Mp${+uv)?F5SxQr$5|yb`lc((FMB zrbS0Ib#hl0Q>Fl$`Ao%Wpo9HuoPo?BOIi;85mZ0RS`d4n0TCL63mZu14mxlyd{zyL zFAzYa+PTby86ZE$+(`Kj!~$Cx;h=saPd59v&2Dm%p?U0GM55WhAFzOt3LO~7K6yyU z7=$L|ir_{%I!y#v^IH`4AU91qzO~&^qs;r)50KYNpZ*l6K^5vyiCR>nDyL9rND^*D zc_2;oMyVFU%^bea1vE_c3tr%!bD|oljewyGCGCwHvTy*i3gD{50mA^yYJe?xRX0ub zjT^k6Rjk_eI#ji4rjE6oEYzS_t@Bw{ ztdh+WX6wh<=aA?#EFw);V6l;q+Fv zg&Fjfw!szdaEV)7;~tkcu64_3jR{E7BG)?1rJr=2<12Hf%(Kwd?smD`UGILkl*$DP zT@PCj@@^Hp&N*-W*6W<-sZ?cQSZaFdTVMO$7r*(fj(GLkU*ha1u>KYBfC*e+10PsV z064&P5!~S0l(hgbb?}5KTwx1e7{eLX@P;|uVGn;8#32^(h)G;x6Q3BxDOT}{S=?e5 zzZk|bmhp^fTw@#G7{@u*@s4@iV;}z*$UzqJkcnJmBOe*bNmlZbncQS2KN-qVmhzOT zTxBa?8OvGL@|L;WWiNjj%>H2(^O(t8W;34|&1qKin%Ugu0Dh{XhR0NJo-y7fg*7v^o-EV*YyV{j-_rR}Q31b5s;R#px!WrIhhd&(R z5tq2Q*&uL&UmW8Z{@3`%Io@%Pe;ni?7x~CZUUHM49OWrj`N~<|a+kjx<}sJ~%xPY8 zo8KJgIoJ8ldERrM{~YK+7y8hNUUZ`$9qCC|`qG)+bf-TZ>QR^a)Tv%|t6v@KS=aj3 zx!!fJe;w>$7yH=BUUsve9qnmX``X#wcDKJB?s1p<-05C-yWbt}dDr{i`QCTG{~hpw z7yRG}UwFeG9`T7+{Nfqkc*j2;@{yPPSznb-X0Ip2BDe;)Lq7yal-UwYG@ zet!Q@{Xe9$de);J_Oa)(>!aiP*Efguve*6Y{hRyYtX?C&e@^a&FC5#mUiG|J{_?+j zeBuBo3hhP8!u;2igf^_gN z`7E&i0uJIFa*Uf1UvBm zYOo55@Bc6`084A*c3agYGxPzdYL4%w#?LP7(ePx!C^ zhv@!^0T_Yy0)YW~VEzQi1+c*NvcLvl01X0w2ISA9Iv@?8j}ZzHijt5A`7rCgbr5;7yx zPJAyD6u^i&@-2;E0Hkp)MS>gd(g+-JFCCEtfiE)$lZ#>i23C_bSyKVRvNRPE4r@{} zYtuHVL-+!LDfTcAL9!ZM4^~vb5PT0{gmW)vU?pe|4IDxy1AwQ7lMUsv{xKc%CU4U^ zuX8#6;Q+4a{vOB(_V6DrBLyAwxB!5Kr4V$HfUf662J>( z!y!o0II8nT&lF8rA`*3=12h15+K5W4U>S{|5ogFSBElXJV2Pss1qRY71$I<68nFvP zqD}*7C%UsBR*_EI^aUshP>aJr(^OIsbPUi*fMUP^urMN^w1l{*19atEIzXBj=K#Vq zP#uvG79eOKiUqI$Q4L}YWXgL=6*(exQg8J-?ZFMufDv%R6wts8UKJ>G6%9-QD1I@m zbd?R_)GdhBSd+s{aaCHUH93%#PHdH0vsGJj!&>DeTDKKk!}Y-$k+8M{Tg4S!wY6K* zm0jC4PuA64<5ga@V+*@*UhfrO^HpE>m0$bSU;h+)@OefXoI$8OV-JR)@Y9wX_HoImzHUp)@h#>YNJ+a zrxt06mdXCX;H*~2Dvn0AR>&-F;=)#J$Chl%)@;ufZPS+C3c}*N_Q<$LZR1vM=az2k z)^6_>Z^5k~*v)PG)^Gn7a06Fx2bXXQ*KiLPaT8Z@7ngAx*Kr>gawAuACzo<7*K#ix zb2C?SHw|8w*c=6HL;iG|w|JA6I-oZ>s8>*|S2wWtc*|0H z>tuNgLVK0tdArwp@60Xg?0oGked%m{AGJEdcR1kJPvp0KxA#oR7bw2Bdb@XgfmcrY z*L|e}cl9iE@vMLiI3f`EfCG3s=odH~cuydBf$jH3@pmKi7diA-g5y_sH#mDOxC&Yg zdOtneRA{ zWjT^fnR(MVmjf7;QyGU(S&Ng`mzlZG{MgWn`Iy7Gh~>DOQMj2|nUo9dfP*ZiIi>~rqC=Xf^*N}A8mT8bo}c-cliH>&dU@xWq@mcP za}s}_+N!&nrE^-PZ@P>{d8)}8tf`u(5n7PTIgYntvLW_1dj98lmy| zlRKNMqdJ`<8>a(1rXhK(UD~qe+Nl@&pU?TMU%Ig8c&QQFIu)C#f46>9o3E?cv31vu zWjn1Y`>%aEr;nPWhdchQ8{4l{Tc=@reOsHi+gYTq+PYVpy6w8SpPQP0y0NdBshPW^ zZQK2D8@bnbx3inJ8JV~*`?$k9p=nx`+dH+lJGyxruKOCL85_72TdrsOitD?g85^{n zo1h6C!3lf0YkR!OoBhn&p6gnz>sp%eTe+7TytO;88(O~ATdKX9xX&A~BmBZQJibkQ zsRP=*3H-FH+qp%1t@XRZ3mm>3+$GTb@N+xJ|sOIef%n9K199#8q3a za~s3u`M(!@y(d}1TfDkOo2@e(qyb#Kz1zmQ7qg37$zS`AlbpZzS)hA*%s*SrksOo{ z8lKO5z9%`Z5B{3Yz4^y=I?bKAvZp)6@p;Ne`MFu#q4PY;p*+AFyvwl<$Bp}$Z#j%v zySY7?nMXUwv76Fe9L&v{(v|$9C*9619n)3Z(TkkQQP|LF9M55Vv|n47NgdGDI?;6! z!qt4u&HBLq{JPotk_DWsrMtHmdDlfc$$?#&dA+I+9KoB}*uQ(msl3<=9Ml6`sB8R} zyW7`|yvSo+T%VeW@0>UKo67@Rd?!2HbA#A_{J03w#Ug<<0=4;;OZyx7!Ugvk7 z=X>7ge;(+AUg(FO=!@Ryj~?lhUg?*f>6_l^pC0O?Uh1cw>Z{)B{fpCnP3yOw>$~3T zzaH$vUhF;1)vn&LvVQE-UhUVO?c3h%-yZH0t?bR7u?~*zhf3D?_U?-c-tyM({~quI zU+@Q?@a?T__g=9KuJ9M1@f+XqA0P7Nw&D<<@+;r+FCX(WU-LJg^E==3KOgi%U-Ue;@dRU-*Zg_;q9c z0FEE|lVAClKlzK_`BjPeqhI<<=lQFDl%^m1o8S7kzkagc`?(+d<;VN8Km5zzea0XA z&0qap2K}dhWc`2)vZ}7;pZ@FL{^|b<$iNTQAIaKZ`a>2V){*f-u%N+%2on}0v#yH6 zhY%x5oJg^v#fum-YTU@NqsNaRLy8oJq5$O_c+3>fFh* z=gylzg9;r=w5ZXeNRwI|sIaNigJhISol3Q;)vH*uYTe4UtJkj{eTp4B0Ib=wXw#}) z+tN=#Hr3+FolCba-AZf<`eDnruiw9b0}CEZxNuFfh<_Sh%($^*$4uecolO3DZeA}@ zA8X#sxwGfbphJ62Oj@+*)2LI6{6er&<=2xd5&WXMw(Z-vbL-wcm2_g>z=I24TM)MK zx&?;CY*2*;8nn=Z5j120k(O7k#r|NB7bReX1`@dm zCtz~^IAM()Noa$aQ1?=q%UY&XyWc%P-q2GqecM zphE)uURy=7^Cqw{x7Nz)^wZY4$`jO7SA7z#waV39h+lH=FhZk2dkf8<97ViO-2J0y?1G!vdM?t-aOcmtULI zikYwe`V(QDHFpF(gsZM!qmirFcUlQX3r4_z02pKbAOH)D;DWU|L>qhiK?)8)00g*T z2R90m-RfpNz46U&ZxYbC$O0O;zyKZmAOWb`S%VZHgAk%201Y}}%uW_C zl>sbe16$LKy#-KP-}?TG#BeEY#l1*zE5V)O4h>QqiaRv8Q;HOKcXxLvQYfy)i?mpQ zqTzDB=bYdC?w$L;bDw!HTC6po|ofgOm|JX^!O)z4#1z zV}e`fO2lrX8_y|s#ptoMK?JS!=rEGp zqH&ePxN10D!UI6CP_AuV48OfQC%$f}=YWiJ1D=mZ1Ec?p@An_SzMiyq7{7n8>X3S+_?VUxHWLmNM z3a4)3YZP$fIgZ75I7Zqw3Kl(+fKy|ix;l@}^d_tA8X z+L`c!OK>wAtNicgVid(fX;CiXV6U@@@LW^itD7&<*9$28(g2M0onFL*wSF1@Yr@jE z^SyPy!jS0buPPWdO382j&PG6*Wc?r6WKmbEqa{O<*-J^J(R+j8`Iq&nO^OP~Y0Fc> z3Pq7-Wy$@`4CHQT$`o)3obuivZao{Mg$n871q&p{^-a$YzfEEp^|V4!5}kV2py*h6 zD3z+xNbXsq>G1n_K4-Oz+95Z<#j+vf6uss|j!v_Yy~&cliX64J?9@p%o6!gP`d#UQ!jbXk8z8D&D*P3jAXiAE zCjP502Pv(TwY^9UjR_eV&zld(;UE2_sxj7BKXVVlN?!0Dj~cQ?6HhY6 zy-u5m3vkP!!!j=8m+$NzbaClZ5?IlY9#SE44S}7pMfv@m?8WAnTVelYCcrdxpXQn_ z-%-(TEQI?45uOpUS~??4k0hSU-HhF6c&IVm5~b59wS?FVA}4u8ce=vp#96fidS0sa z#6^%JvCNkD`_5srTqg9%I=Wg}XeH~>$mo@+*^lIQ;7c%uqBsJ8n4LXO41a}~T#R|i z@3%iN@(&AilUsaX5=v{&Nlt&n;ctY7wV@z!8+#WCm9oW*VjfFlJLNl;*ka<;yR zJw5IxqeYp9qCm8E6a}o;H-_EVV;|z5w@#bd!%$~WZ{IO(i!2s_h!gz-jPhQLIs#f+ zq}JlqtcFA@aPz$5`#JFHr5+3x-8rQ(cOBwZpKa}XIyTgIoPV#`E>BedNJgqfrP==s z)SXBYuDWG+EvB}>X|tN7q=i36CTxj-t6M4a5vqjH4I0-o7T$(8#)ad2?Ij-^gPnSJ zxDmPCm`~pAGLvh5Y|C?nzaD;mdQJf^My!Y~NgTgGk_)xWm-zH)6fvb!fCTt>Glb(> zL-SpCKpYU5+;p?iBL2P8_31wI@ZK2_$8hV7rJ=h$yy15|Ou5vHbX==(shlJ$GIEiA zy(EbtOdU*})~NvksIs03rG-m05x>Ryjtof=J>S#*nrxFeY?f^0pY+#fv7V6(iVB7b zr9u7fWRzqIwcb&qYFoh@Wql^Y;B}4guToHC!NA1?wEfF~qyY$fq3dr+ufK9UcO%G5 zI&`nC0lduG0yjz|)*qh0s7TX-uDFZ{tbG4X;?UzAe+|9RP?~@T3EYJ*3_nNMu6I$G z=w+#Pbt!t0AOE6~scBz3AvsAiBD7ibb1k0TQOJ5xr~#I2#ooGL)dzD^cZeL1lViD@ zkID5%rVEiU<`Bz%7PK?eXWK^Z>98?RsBZx(84L*nE=bnvrsD~}3-je13YXmsXGe-y zOo-^=0ip6naZ{s;)uMvncGqwu2YJ*FsVEf#jOAXmpAMpGBkZ)H(#-i{ZLL;3XFhtk zA9Pw{H1#wlZer9WaZhH0(IMl2GCPzjcRtY`e<(HD|;Zy6-^H~aYU;ssrOST8V!LBAOP>Xcn@UoMbMy|oG0t7L8{HEo~(<8udd)mbpBE^63?6ke=jddV)={OpF~H}6kYBlT6}SW zK(^QCNkQDcF3TwaXhcr8DM9)KZu+D$HUWktFMLQz{De~DZc`QTQsafvUaO~SnWel4 zOo{UL4W3C&x=qVPkiJMDO)vE3`z{ze8kmNkm&R3>3g1dABF(5L#V-)bXdc6>+yYhy zrn_>JD{Q5IM9ydt${ZxcYtqjgCB;+D19h?xr+g-rLw*G|Cjs(gjd^DcdS@<0W;$*G z-}QnzZr^z25wGfJ?|Z*o@y>1;BX~QLjgFjkM4EGPNO35XQ^bOMl9mJN!@XY4L5z`K z-R9&Tf-T}R?#giAK|#JWxtJ@tC3v~mWO?|)c?7H^xCVJ7>3L-Bd0NhS6nA;lWcjr1 z_*BCAj6V6y>G{KlF{~^39C!I#2KijV1-u3Y`z!_g=>@{=1$mJLqIU&QvOVjI7v9xY)v=*wUxi zI=$Goz1V)G*zvB|iLAs$xWvt%#KWh=%eF)ty-1hU-utcuPF5NuTpD6f8s<|PkzN|r zUK+DfYDs3Vvr>|>Tbg80_Qj_xHN7moy)1L3EIX2rftdwJzb zc?4N`I&XQvQF)_5MYB&uYkEa{dxaZ%#Q|MK-*830aOI#u<*-lXs84A(D_<|V{n%aQ zG+EVm;i|dzit!`XNyYN{_Nuj&s*SsuPKmYato6=pD64O10ljYq5uG@kQzg z4C`i(YP*r^uq^AI!_ukl>nft^it_5vK=q8i^~@RdHR$%A73=Hs>$%7qUW+u?vex%( z)o05z2zNAyjyLd&PztWW<*pl0$ zPqzfzx4_9;Ka%4j(cA)%AxJn#>|@BHNcX@q)Nt+z?*Bjadh+%E)Z>4J_+PrezrXuO zxBu1iv**Eo>wmrQ|LftuCw}-x|9$I!rv3Ni|2p3OQ#W^a&-M3Tb^EWn{a4-mr*3X; z{{Exu|LW@M`syEDUS3`Pqd$NCT>LMc|5s<{=cngqr)OuUr)Q_fXJ?0JC&#BJzfbKRW)u>*&8aJUlu)JUlo!*x%pZ+uPgS{a5Ym>~C-X-2U-%du@MfV`p=7Yh(S# z#`5Oc^v3ei^3wm(;y+qgSeT!mpPikZo}QVS`ZhT^H9kHuIyyEoGCDjmGCVvoG&DRg zFx1yS+}%0SUo$qCHQtvw(%sbC-PPUI+137!+S=M$TU(o&nrdnrE2N(%}K z^YV(aa|+WlvXj1Ke)^mq8Iuta86O%J5gZ&G7#IkL2m1NJ-MvB`-D2%r66{?P9i5ZC z%rcVrDl(aBpDT;`U&rT4W~{_jFg4#)o#Djncw?&|L7 z>|*ceWM}VaV`FP=ZEa;`Woch5%Wo2Y! zq@<)IB_-dyc_ShsA|N2Z!^6YP&CSWl`Rdgxc6N4VW@bi4Mg|53IyyQU8X77pDspmi z5)u+ZLPC6ed|X^yY;0_de*}R*0000oGBVQtn;;0JmkoB>u4Qp-C5?sdD}c<+udy!inT}Dk!-JvR$H8Q{sm&H*E_ua9IcPHd{}A<=*g$3 zk$5_#Y-J5@{UMDm4o9{dmz8=4aSV^UHm9uyGShq&v38!Lf_#BQ ze?>A6o2n8CyM?UO-zO`Ut~*4l2Cw#aMic+TVLranw8UKJv>KRgu=_F9)$uneoD(6? zB9_U2y7AL@-GX~c#G``SM@ zgK=e0js6^`=jNOjD!svYpwoU??S^YmoG=TABlV{V-Yp!WcZ&y zMJckyP_L66q}yu<9oF=M*nWj|?pnSJ%x)MYxk{W-nw>s=rB>7=StKBM~X zs4{r6%}DEqUDHbLqGN}7bPLD(!}cHL+3Q_k&WE$aZYtehP$kv--xC7g%H26%JW-#0 zA0czTTC%DU3mF~=_1pQ1aq@7p%h_pvxmqyldqq}!inu>BUl7~1d-3M!eD7z?)8mVg zQ|hb37m-gO`CgQMZ2$3&xqV#g)<+>HzcwD~nT3=tBZaddl8Ick*Co($F$=(RHcHK#ABnf!uU?`%WQ&h zk}*`)6SG+%d|F`fsGQG5VlL);T%po3ZYs>z;q=;!=XB&Mjv8@+G=R;&Z zzoU$`a%!1rBqupDz)jFYe@ChD&}t)Q(<~N z>)Fn`2cV;y46nLKS?DZoh*_TWX#bP-L4S}Dvp!O0?RUm0;^;fi$l>@0?q6)tc?7on zu3xrG|0Do+7(|J`PKOamW3dG?FQ47AaQxN`NU(XYqvuUs-pMGOOUf)a<2^lAJDbO> zQub<|>urj?WWGs3>6NUTx(0t(uA)M^tW>&YDbn0Ky59;4Qf?Z_WLKr~RfY`F%1PAYjAhUo-0_7hfv^w2t(14_ni@F;Owz)E7wG3la)aEAbt+{IMmaHVvQ_?0!HY@UBsmSed~x+jPs3YS zu8Tdak)U{q=J$6X;`G*g&1hiL22g6j*v7>L5nmv($Ny)h-z~5qa!FD*kmJ`G)I+&NoSkk`ezc z)`M3O>D8e|g>!Ac87Sme8Hob|bEi|DibMVrUIJI2F1wq$PO)tK$sabA2YE|S8_z^FHCnMK zS_d^3p&^ETk=^`Wd3gQ=ao`uLIoYkF2pVkdgm(|S2&pTRn@L`?9lbKfl<2%RQ8NQW z-(7%}z*kR4CGCoky|*q+rXf^#ImBZ2dS6B-PY&5q z+v(yI6Y9Eu=PFb^zKrQ}Sb2K(f>F#^`NYck-?=T#ie1;QKAu<_c0gB5D#DnAPsXxE z)-mG#_JcpP99CSI5QxhR`3ZCyGJOa^&T;6&G5Hzxt#gs9^2fe)!QOyndJmq+X`$TA zg&9-lzV44kIo{9bo`H|J9~>FpN>N^|Rf`;Z=9C_Hhx{RWDdyDE{gcbwW%-*-_k!EE z`+d1XoI-2-X~X9A4y|`1#Vzrj$cXGmE=giJeBC!h+NTc}KiGbQC7$|1-zk0#U%Poo zV+k4h#J8XEgiyJ&gJ}my2w%oMy8LnL0vMmmeKdX#7cl>L(*lR>eXK%-!_0h9As?%@ z-wMiD66rBMX=!)nTMRmD%YS(rUI53`3zBp9=L`(eC2~!;{Lp`)^=0mDevlctd*B@k zr<~;r5gB@6Jfg;aI?OmXULkb6mATLw6%w2@{LVNGbDc@TAvW~ff7=6n87 z4QoOz2JLY^U0mq^dBL#eAq~!R4Rh4M23fzR1s$vfqeQ}Y;tbko%@!^sTHvs7j|feQ z8(+AXuoTcdQR5KUi zz$keh#^I=6R}nQN`t^E7N!lvS^=1aCT<#HY{(}3|tx~#skNT*kd_{_RYN7)wK9wB?eoFMESORw+CNb1b2uP?L|{Ip~Syb3AgPNL9` z{_@-(;%!7oC_vqosHN{E))s=b93n9W!=#HNxHY>ciM75?PSFc|UG^z6!dtuTOSe~Y zWNLD>wcJ&h?@w7Pd+(HExOyEawrSIM zIb|{YDU|cjrh9ex{`X=0t-i+nat*>&GayblDSPSTriyNhZcIS!An*QuGj6;@3 zhW_@&odw29EU}LaX?q^MqV*=r$E3(CCer*P-h76;{L#6*mnHeovHZo|e6I9@2KoY3 zIpSh9^a5)1d|Y(te?W|UdZA)_p(1Nxff{=8CfYNH(K0B~@hQ@?Es{z9KX90+V#D@g zojWuqbo5+kVg6a6<6V){9h!^czkp1@e>n`|{{dp+?n>jy$`Wi#p~8iE)Fs~OrOAqg zspus^QRw2r=n|}jh5rL$(#!MI&~S1gp)g{pJG9JNvf+TAyD#0$$vnMY(|4<2P9@1@(KFtYrrY zgF~R>4a$aS_Nz^f7%d_l5Ld$%zt#VMm>`kX5X06m-`0qX)~JrwnAO&}`__2F)?{dd zAVy=vW^=emTdZ1Jq*GfMQfn@CL&6y(POZIY6;hhfUf$7Ox!PWR-_B>(5Or1`03(ju ztPk7-w;zN3r#t*>JKB#s`b9bi4LgTLIy=ZAf$@--O^Ewh=QMfOcag3+!>(DxamPZ& zbK6;0U@!W3EoKug+NwzRu3`7SU3cMGSJ^c9=W6%KefJr8&xK+4l1R^-FW3_f_MYwt zsO^k__3TFX+>Q4jFnU3Ly^zda^v+()wO;IpUR;Vke9=Avqdp?PK9bBnvd+GhaY$r* zM^^^e3*LkOtB-mOOsm|FF4_=t){sKp^p$+zwdeq^(Ez{S01ri{CyY2+4btfgc87vp zxdvUR!LCs7H>E+D&Ozn1LDh%Bx1xhm%3#lUaDW;liVI}WIb^gpWb!Zs`!%FQF>GNp zY-EJi6hGX=g>D5Kc6=Ciq8M=!MYoATccvck${g|O9PwLw9vMaiJPcXFKvuaRC#ON3 z7)ap5aIn#6xH34hb2LG8EXio>i{Dsk=2&{?SmxST_QO~%#n*h%uZ2cmi~YX7kAVcl zgC#M+woahnUt{GHUtKr9*4l$o{5rzoJNn4`z0bybDJJ?wCkBlshGW2Vn1im=V2`Z< zPqpz{QIN?d(0CeXt~OdD3YzbnTw9ymc$nN2oivAzhWmka9{>lLQ%9Xszt*NsCZ<*& zrY=Ok9mW6)bBCLH(Ose69@f4g9=;*i(QTB`4Uwin{?m}GY4omX1jRSZ^(l2+pe78c zw+Xc30()(Oan`@#iOmrD&yaRa2@8MkZzgI%2vAQL!HhYN_;HS^&2ou%vhtH;YKL$!UCn+{3WjyGF1h#?^2gZYOazQH--!(VCGkRI` z&!Ip@>+|X=GYft*IGbQfwFOK61?#K@+pYzh*m?WM1t*6E?_TsKCybW(;n>~<%QMKc zS54s=#Ikn5cYX0A<&rHHFf13X9FG1a9xUgypm+xP0z-?2FX*VDB^ra@cR>;#A&S$0 zNa#}JG{Eu^{3RFNW&%AOhL%maSpB$COSxJvw%TaCYWI7g`Efzc2_T;fc*_Meb^;+% zR_nV~yB=5jRKWgcNQ3KZQ;%!YlkIztOIhnHUF&P>>l=^jo0J>dVjJ_1 zNd8c;)ihA^44?=HbWE<}z&DO2H%=ax<{tY{Xa-$2zt;GH5RX5Qs5VjFYywO+5n`jQ zq9BhguqQRx5;o5fJEh3AMHLIwt4SW7aI60#_y?AqaX>xkKanfwU$&HK3 z%k@(p7if$G_HsG}ygLJZJcHz%q4%6&{y4*aI>UW=jxT;r@a~-G<2gyrIa$v+MbEhx z64)3QC{KOFTZ=e7ot^Yl@37qj>ORK?`2!TGXE+`&noa)jfBYl(@sGUInmX>btr|EW z_q-YV+y{N~P=lwtt@QjJ~t1O}DtH7_}=FHCYy(-C+y{ix}D4jY4Mnm<*u#rzQfGA(Nrc9}ZN z-^<}sX&jo_%n~lU^5AmHB!fy9d|fw64YAPQQGRz5=P5nry1tGH$m05Cu#RM?_R z(5KqzlR?^v$|&uPdrl6n3noZ-ohZD6WG1r`8y$8QCdsdzwufS0%4Hkfy6jJ8iHB2l z6)Jw=F#Rg3(6u+7`dOUlLQ^h|jK{pw?a)l?(dYX2de6I0S_r?ptKZg!lXd!78M2C?O+VZAko$bv?Zlg?)dZ z6pjL~vpDg)5bojI3lVi$^1T<#K`WK@+cCmMNU!B-!s+Yf={`xnR$xf6s8?Xh33;u^ zQc_s2$W}A>TIp5GZoLv`4}eFRdxXA0ndh5ZUK~%QT7K{`pq*P)=w~6KK~=<|P<6nt~`DOu2qR;y3SGm1{a@S(R%+E8}v?GTPs;7LsPM1HpiLQllHu2X|5KDu zmWT0@)4;~zHn>>!F?f!VHr-k>5~JGxve==c3x=*t*>+fu!YNo@U&g$rxVFvaj2sNi*!sMUPqqGCDDgF#Y52=9K{Lishd+}TB*TK{u}XW3LvqDH zZw)dkI4$8DyOmiYt$5~J3uGaqHWQ8b+DL3Ua&Kyo`h)o-qf|a3wq+>&$k6?i!bo0H^qVe-;7JXy(m_ekXeb8E z5ucRYLzTPr+3=yl;-4h#4~BOEP`o}q^`K%NUX#6Jhsx-I`>##rGCs9?Mpo7k1I_M#MZV6o zY7MC;S1}{JbP_%h5$?ZS3Y0Q*R0pmcljp5fTWinkCK;*)@*k*)xu+D11H=tHr@e93 zFLi86dIIkA+{8Z?p8V{2ig4g0+Pf5hqVz)oSPKJ9977T2s4v1dQd@@AIue%l;rJ0&hU8N0r zi+h+z5?{e2t=11l)0cnTt%>_MXu)X3H-`M|HJGEUK|L_4pwa#B0 z&720SD_F_EMNXX`E1rxWMnti#LQ^~{uIBUfR>It9s>NlqS!I71MfSWa$hu~;4Hfec z)820b?mlFbA6r3bh`xO!YE-=f!M0YdCV2O zOrCwiBmBKAkoO(E3`-@yt;Uz;xgyT0NO?`++2B52UEZOxR2^H*?CZIb$s`-q(61Fa z&kHiS`R}UH?axeCJ6uA>R%>QgOITsPyw5;$2t{7I+GD<=CiqBu=&q<{#k$f;J3(W- zU8lL3PuEn&&Zufvhj?thT2h0}_^KVD+kH2lSCRh17#LmD{oSh8W75u)utRTn1yCIx z`s*_pTheGgUtQvmz2)NF(pL{6`E-X=s~R8u=`Rb7Z}uv!>3j{cN*Brt-#gg9U!9q2 z_o!`XigYMIH(a}3Xqm38a{PT~xJ8xR(j(*OqE5QDouAw~IeF-uEMk0w{kd(L@YuCZ zMDtK*vEzsP5BC-}?cZ@Jh3mi%KJ!Za=jne-_uM&UXF5#o76iyCM$~wT0r;P1gtvsJP?+CM9r-GJQFQTJnR(4*J+CFxis(+x>w)(zUyGj&1JhcRTdWjuHw=G4y=N98Bu233v+L4Fc zkc5dnblngXl^U-vbJW1Q6Ynvb*$r%{S4E3ay8p`M5+S!rs_E*ba@EJKfNYSEy}HPd46S+DuJ2%lR(C{qScaY+`E~5 zfe|5v)&;(F=9wc8`~2yWi0}&6Ol&nHsA4FyT%3a#z5ItAOi40+@hE>O8r_xbl;Oti zput(1D)%)k8Fy*l_dqKIv*Gd|Js?&L0jhp$J6XuSYxQlNo&8?}h2D+76-jVw7UNuk zMh^k;ZJH=6xr~>yL>f&suL=X1(pQtNJtX@mPu^$U%j_}cCQUr*yP`Aq_(*q=rZ@eIaR4{C0V zq(2w;5ZO6e6C6q0J8wrnRHbf793B69#o8k{-y!T3H@<}?*OA*hwhtC|Q!P~Ay`iky zmt(W0qKAAJ!k0RNvK+9JxelRF3M~w8EZNo{i7ucGGPHl#o!i#?R(%gWFeiJ>3}lMpi0Hv_vajVTaKKe%e~Wq^0q} z7(ARxN(EO9A#d0ZVHE&llh&S7gD_u#k*!op|Y%duRYPxN|4mB7{)DZ@?i+N~n|Y zO(TxT8Vzk*q**>1{a6((%SZ^?t9mv87YaGAN;Frk5if#~2V}X$^8wa2xE|La9Rhif z!d#F>J(S`;O!y#(cNeUW^qP7L8iAT13Fza~1P(}v4w=gYw2JKP04$-ca)5-l6!_{l zqc*reZJ1;mY62ZBOdvYkI=A7_uv=$hl+v#ub}c0CL0;Z1klT8gf;?QUR*=?oxWEu7 z3P)9~?eo3?Tp0rQ%-{SBesfsx=Gd?+9aF(S_<6|!dbgYXwHr4 z-n28(jpY4Ib(^wTEozW<4N4IUZg<4AsYwVq`)Agdfw>!#CuZ&&UjNUY!XbLS>Lc z6_9TlP?Z3dQT~gjHoYvz`dQwtHVDgIa20^>GtOOtn!sEdMsciqnj{=0H4~|+K1?o8 z&hTA2TAeucyEZ|B=4hSwjfi}O2JJcEWs!EE(Io9}6~$6eYlVvUju0Q}0uNHC>7d4$ zg$fP*H#5Ik>NE{*nR$T<04<*SEd^?5=df-rz|S{XIdR1N^K4?irf2=ENS74xsAliw zbL^vl_pYX>#iA#m zwhoY>mD?>1NiY*rf5jlXD6ONNr56C7A!1Lk6dR;To7X86HYpf;S)`ybzm!LizzhK@ z0Tl2EWYUxLs7aU4cQxWD@jv&R4t@k2XHVSLrRC+nKNsnc+E|U(Ql2AW5iMcXqjZM@j zd2dFou@@UjP+zcrih+lxL!-|9KhWVH zE=QdZ#J+4WwA81fPn^n47Og^k80^HX{dclXk7Q6rB$(Sva)x1@jd%Uyn&AUsLcH-h zO&+pLYgqWY&U+SC?=r5v}Kau(2ebxje0q=`+QJ<^b%nLv^zUOAV(;Ql+ zIS;OW1L4Hc+$ju733^1%L9cC>23^r{pzEKfe{Pi^uImSAL`49HJ za7Vqq=&L5o{bi|N8$26RAy`0YMVKJ~U(93>e=6OxYO8k7)Q#S((81KvZ;Lu=t1!(J zIAq|az4cOcgS^`0$iak4XDc9UgT`c43q)zWkSbG!FAjs{Y5}F;!SZmRiT@6@v)=P5 z7N*_MMz2COFsI`m3h02#ZiWdIyajj5s;0uY3f8!)m+lA?NP3L|T0t@q&#^KgurF_g zZWID)!(8W(mQj6!LlOrnTN73DgjrMyPMHnrtBe*C$TiC#7PIB+ls#Lsd^mWz1%egNcpFh}*MW(^5dQIG=5~Jc&-EV;I8PMts&yE`|)?tzts8S0uaR6IF0c5-80rJMQ`mn>e@7lq?aH>G!@$z?_ zTH5k93z${`R92o+=X4}MdI#-%K7-|?5HJ344MCJd?Wr1%bLu=)-P&OgXtc^Vk#n#{O;rpVyFwvklHs zYYm$*Lf65c{Ed=sch0WgD651o8}4Gl&8zxy7Y7@EGS*FB{mhngJcAQJ$k=jE^ygl#wdaK5bpYbRs@DUV z-RoWOBVCY#>fhroZ15Kc@oT>;@t~3SIzM&a5j(gL7aPcVt{*OjXM`sEnzp8jnh<%5@NjklA=UCF1HQ7vpdP8yyV;j%Y{EHNkV z?f8R9?~GKv$z{DL9It}Kw~;M;^rF1WI5SE;eXsL86wpu=P#1{7c!@y*RC zR2p<&`*A{*!zZ~#H=pUD>8Y^!(|x)B-;ti0wwIMMh6@Jef)U8NMskaY!JmG0a=wnI zO2byZB`JR9LHDy(>E2BKZ}Inhr0=BU+`i#F4t?-fcJZ5E^sg~{Tz$vnN&HxW74ZGs zU+wGTx*VeT=yCg$uG0cRE{xbs37E@&`02^?vnAju5^?wwkz#=ObxQLK{B*yJI1%_5 ze}_2FX?)ar5@mh*6aFz;@#*^X<$1}|viH-?;z#fFr~8(d_h1My3K*Z=`i#0i1fBS` z{lOW{U<5vsMy2&Rt!$Y4l%D$cK-m}wF^4F#%?16}Bv##e`@;){iPYCt-z#nYFivF( zdtUrH{KGVzD;bXe%64vl6vA!ore?OMoE4){qETgg#kx>w(4r`YIJ#of%P|^Bcx89Z zzS4*#;PF7>VzJcf^7DI@-CvH4PM^OQ>ltn~vnA^D_#E~(T-$@j_pco(G`V+26PPq* zM;GYiKhsmXp8UGyIhf9uOU%AcDbp-X)@^Y7z2bhj4d;>>DKfwLCj^#xiR5LkZ7>Ff&Lmh(Wvj5Hn&A@BR8y`EI zCY-XoDc6H6ig_ETa#lA&rg_O$D{HSCT{`$0hr8r3` zMMdW4L~P<|+vq%<7#j4%WL#3VMwjGBlF|YLyH~7LwuX9*u@3jY<7zxas^1DGS!h$W zRbLcB@g6?2vAIF!DqdAim`=Y8#y>{EABYPIhRQqHC?QxC;cPI4{gqM{*e=cWX!-yJ z5BCtEp>pn=9K!H-Kc+o~@&)P5&e(mInbPob|k;lJ(kq|0I7rpy2njVxw4}4J~59R(xloH&-Np{fPOXCr^-peYn5LENQB>SKoRZcsW5Se)?-xYV6wTBvY;5*LjMt$V% zl*`%4;v$IOyuZ`;uCsW5=w(QU(J)&LwOr~2L*;mF&XiY&~e##nSuO* zpL-fgPua$OH*EzMq4jm2n2Ir8C@Tv9Rp#ul8OBmxQRTIqr|qJAeD1$tb#6rqC=MEQ z&M|;9iEqt(py7SSMJ}ZS6nC6#Nt<%K=&862(!np2N)?Hp{nb>}%rGOof#S;Cc+862 zY~B#Ccy(Y)W9>9E?nAx>{nAi;n;O$cz3;5U@nVLh`DoM=q~k`GVR({9^u&U}3@%Od z>9I3B?+I`Q1hw<}N1ehxRpd#ct78XnA?iQJi00!2GE0Zx&O~UkNb~J)jk0r?1%gO{ z;`@D((J`iEOJ`CNrGi7uwlZk-Ug4}!!$WV-fica>F(fvmRpQ&yel42=WUG)+ty(+` z%S|e*14u`bG!ov~MJ@;VfYN3!*Q-$8!g<^@T$y}2qUsw)LDanDm!Quy$sxNk)=p7g zXLM9cH^qEQq@OgWk!aLQL3A0;fapw9@;zp0R(%#c?bol;#oHJpF%p%6%Wc#7N%s?Y zojVdYbFDV%`cXNoD;ZdV+?!!ZuMP7djNDOqe$J&I$|JwnnI+n;NJr4NIEOXFyC#5z zm}EKBqP!;x2n`A32@LvXHM}$s)R9m*;SCyWEuF%gCroQXI!U#^sf|o%U91K~2HN6z zNsQz&3)R04ApT4;cO%E*m_#{mVYL^M<}1LS`A2RyWcEX*iTsHBrR42MN`z1pyqQ&CXzf?Q6J5t7G#hI zFxxG^ec+{uU>*^Tu*J=qLZysObzr-hLDxT%vI8CtFycDnZoZ}k$wh=P59VQO+S9h8 zs54-Z-7k%DSd^oZ4lq$&o!_Tb}RU!Rwdsf(qxIhL{2bk zvx(Cm^)j4WcQLOmEGCEajFN>i$meltRF+P=3SC;iw*P{KQ8U0(trvmudi(VsbHYWZ zVY;bYh`#lALVtuuAB8Ffj=q=Ki{d3&L8v-5X`&{%>WNPq8MF{&bC2Q-?$04z(3+;C%S+Xua3%xU?0D^5%13l)V&iRLnI{ z!P38y$SuXvbW3SIkPm^HZK4N6NZ|p5g4k+JvCaNSk*}(4LTRB<9uXJIG9kMpwcI$x zFLtq)QxW0JxcHIYZm8JkqywL3yiGQ2f1|WH452Jm?L~IQ4n zEp@yKWTqi{7?rg#rVf80UeJKrhRRLqgi7Bu@^X@jz3FM<+ZeuEMQjE}FrTng>!FHM zJ1stHpc#Lre7x(Q0s@pnDZ%}7v|woovWHC{0x<0i``93;UCL_lO{qFrt#^o znI&Jw^bcwMID`F=WKKvyBj`F0W~0w?M3ZJP%Dy2CVe0&`^%&nu8G;fZrL{Q+)XN5z z8wka3Z2~t{uwbYsIfQyr%UB_sV!2N;)Z6NLgv}_CXj(+7xe}Qu;#^YT%sfXz?a!ZK zLxk#N8YXx{lo$w@Vs9>kVhE^)i>iJ#S!`g9B!tF(o%mvaS2VEMe?W8V{{o~yTfbB#FLl;!iBN7B5`XA|8 zl4-%=BzEGtT%tX$Mf2=Nh|nX1d?G)thd(w(^o<3naREUP-7%nIDz2hT{oyx)87=Yy zlNHvm?V=kFL<9j~o$y6nI0z%Lk#hD#E5=13EDZzT1Gx*hYl(w4Wdm`a!o)o z#z1mKL7JmNE@bwVLqlF5PO@7m@S-mogaUFMI#OgX-X9Y9TO~*Y`Hg}?NZB^5{+A2* z9l>?OM}7l4`IZaBq#bT!G7jZfI;239WiK8?7xv;?^1~@0L~glb3Ep2k%3^%|V^wY@ zL1dy-c8AJvCdo9-?lerNj3WGCj4~KxLReqbq#8jW9Zn)86tSBEz9d0hfGT*QXYqqN zteHV{;aZ+nZmGgS7{X&s!9iSr#ASos9YhDN!r-XEHbh|~Q5j6~gDn=sBFROBF+$=CLyJ! zYOf`f(jRI0KmpM6M;G{lVi=X#>pu41|(NWRtDf zi8(_v4n!327KjdnlnG*Ia$Cnx!aRJZA7If;LRn2dsDo0YgbKtWphLR30Js$#o0USs zQD!3+B_v`dMo49UR%L$bCzV#|ePrcUOy6oA=piZSHZdq-@~9~AluxzGBY?vzRAg^j zgETzD>J{L7h67Wb7V2e@c^<(k)abk+gd>PU*Hyv;2tER@+b}DX()jMH{94O zEP|TO7!diviE*T#@gYj8 z83Vci!nKn%xI#R+LOT}Fm^Ko-Sr<5J>IIBK!p#G;-WWfiC_%u1=~ zz$Uz%1H$YS-sFy=AT#)E*MUNynwBb<10&6YHFT22zW$?pcBsa7EZ*j=3ry+A_O0Lg zT!0SJ`v`;ZjDix<(6E|?{V1nHM8Ft~L3cTX{ov0;*bgjH1pra*VeC);Fa!YgP+;;y zETF62maggIV_QJw->xp}21m(a#mQn5Y@Y5z+|U^4+d$-271A#6_O3$kZR-ZF@R~;8 z`c4cHXiK?N;`**bbb;E95(S0Yn)wy*o@1ov8n_s$UbsxLwG+rRaiz!99m*{}b0Ec?E%01vRr6>nZFPU9r6 z@+JcTKY$Xn0-80Fnl&&5k5K?uFa{6sjpRkt{s_a=D6qv~O)6Ay6o8j2Y!|R(unHs3 z1+TCR3ol88qG03Ip7gRsVM%nR=@52MV27)K8Wu?okqX+niwRLiv_v74ZR5I3MPFo5V?3l`$O0 zF?fuz9M|!!%CHgJu^#X7R{by^|FKfWzyqK$AQ!SBM~`kifFK_-BmZCrJirV$vLsJ( zx3I+^Q!*yE-cw{UCwH=#aD*p^vM7%-DVMS-=R^t{jw-J*E4Q*MzcMVxvMkRsE!VOw z-!d-evM%p3FZc2+mqZGmvM>)bG5_uU?f5b>C$lmyGcz}{Ge0vlE6hX{Gc{MUHS=TF z(m*tCGdFj$H-9rYD>Dt$%r%#@IiGXL4Fo#7o(rtAJHInLPmnst^GeJ!J>N4v=QFI> zb1fA_c=+>O@v}Y;G(i`1ga|ZH9M5+E^j0CXK|eG^N3?f1v{fneL=%L3QM5#FG)H$d zo(SqtAOuTTG)j8cv_|LI|}&2lY>bbW3COR6mDK8`M%KHCK1FSHHwo*F;ud zwMdh7R0p+B12ln*HBnRbSHJ!>T*q}zx3g0FGea9hRrmB$3-wi(v{k3{U0ZcSyR}>w zwqYlASkHu73wByJbzYbCPWQD_ue4xGwq;jUVjs3~~_i#9`fHfO&!Y@4%dy98cG_GOPYUDq>fkM&~nb70Rl?f`de4>xg_vT*A*OW!tc zJ2q5{c5l1&ZD>i(E6_{WZZH=&c!zgFQ}=wKb#y~^az}P;+qP=k z^H5KBZg)`x)IlX|LM7nAcbh~_p%oTs(Oq0o7O|B} z1^7V(%%LG30W>MNj*GX3Pj-B>cXCTLftdAK`}T#ucOUgQrpy7e@dG(9gDWtDyN+)l zoWy>Ag<<(bjHg5)jKeFO!85o596SRyu=tLj`EV;aS>twUXZ2|l`H{PHds8)J!#4}T z!HJE7CrnfXIKsMSLylj$S7dolY&l9OLNmleHeACqghM*KLXM-kq;IyGueXn*_HNgC za}&0ZSN5E%`M7}km_Q!YAp(`0n5dS-m6uma$bl$)Qz<+NO0ar#ITmD1lxCTNI*5ZP zG*=(21goD!{%Td$WdVz!r-TVpuz9_S1Wuc`#gf6c7=UnSmqlyx4O!&}VYlYe)wm zs=O2aeYigWy`$e!rGx?g)5JIYNmO9eGpI|vefoVuO0=IB7Wg(u{MZ-%QJ*~}BYuP& z|qAE0g z+td4%NrN#K<0qWh+N=CY)MnkPXw<0UD zs;%2UK1%5RyX$>RIRElHAgBMisD_7`aRjXIAX4SftYgeyd!G;w(mTXzGXVIqJh=pxiw{PLPRXdkpMi+GP z=GD6wqFug!J)UeAs$@Y)<@lv4%+jS#rBSNA<7Ds?N|g_i0_7)EAklAikp6rSlAkLY z1rddtHx+Pe*RNs6mOYzxZQHkTcZ|E6HPj+h*<43~{=aI#_>srcAz6(m34jfrz0cW{Z zju=Qjg47dll?}HmNIn`?nP)k0xJhTTMf#(v!Xb$)(#Ru`Oj6057F=-2x+r{7N&p|6 zvMWDi@lnHcm_ej45F67@se$~ECc}BKp#(n1G~-O5BS!H?!!d2F@q$gX*$|vjjv&fE zD*+8u&_M|;)X)c-baKin4{bCrMjiD?i8DIjD1tG@IPI(s&X^+7PeBb;)KN(-D^Ufl zgtXLEu~L=QS7D7+)>&z-^|w=dOEpScd7bdCUV#l(*kOq+)>vG5{?qkWV~ur{*=M1R zR@!N){SVpQl&uz6XSMCt+i$@QSKNxOjVs%6VdWOxb=hs#-FIaz7p`;R4OQKG@y%D? zefd35-nZ!Ox6pe9F4*9M5l(ole;JgLV18GKNTI#8(uG(s=gEpvVz>3DL>#V^JyV#)@z1r-v(N0_Kwb^dl?XRCjnjyF?+8RoA z?FNf(2aT>>6ym4y1Bqc?&* z_k?2St7+UBZJzk)sV7qS>amB=b>1tNTla#D-+FuQxkdi?uI*0$@A1Fh+kDKYCZ9s_ zyGMWd_p{Gmf2*$F-~ZzVH$M5fZ+Qd!-1Fe)s?X`pd+J-@0KX@=q$MzF5HukEF1Wo3 z{*Qwlgh>B97{b}quYenrV3op$z|kQvgRXPn0xQSBzERDBtfQdPZYV$z?$CoE7d_NorCfkG$g?2N_Dk1yYoytV$u<_(@Qfk&Hw1iyDTgBO4ibrjhrPf`)EpG0*#czG$!bTm`Y{x5rvA3AR6naOJDBHnXa52 z@^TqEPOcJy+B6Omj~ULE6;qt$WC#+*paylWlb!8!=R4sUPkGLhp7pfnJ@J`OeeRQ= z{q*NQ0UA(&4wRq;HRwSRnoxxf{mgUb?InQ8dI6_v!gS$=}mE(Q=RUVr#%(u7{b=lmsWJ0Rxs*O zk(yMcE|sZGb?O708da%Im8w;>>Q%9tRjqE7t6lZ#SHT)qv5u9jWi{(r(VAAZu9dAy zU1v~B1}MnQm9BNQ>s=#9tfID+uYL9FUjZ9f!48(Ng*EJ95t~@WPW7!UjcelY8d=Fs zma=u#t2!5(S)vjm?@+8&p}a;j3Hm;*7jDs~vT1cVAkmH@;MbYJUM7U;z)9 zz)qcS&FWhq^bU2wk>YQGAsk@|Png2oJ@CsCOrQq4bi<8$aD_n}ViAv+#EHGI%Q8Hm z4p(%=hWc=cVH{%_&zQzmJ@GiB`=l0^bH{{wagBi-WFZeZ!Z&7FiUri;a4K0)KPK{% zp&Vr?FW1N`LvnzaY|JbJ%E?pq@|VFJ=FL_aWml$>e(_5=G|Q^XVs`VJ;T-4EsuQjm zJ6W3ZYh7ElS)AK!f>Yt~KmypJfDvQK0LQWfshbl0IAsUT?6Gx4THu9iUQSjp% zfiS8ZT#=y-ZG#d>^|{(pfmFZ?UPIe}`BAmq2U*mEM&4kAQSnV94avgmo%eiq!HzL$ z7jM+09`3NvZdA3uA{)^Ng(5_O4Su{M6s35FEI6?URg8llM@STTOruhkcBr&;Ri#c!W{h2 z2Fa;zb^fetef*!d|NV^{`ihC&Yo#|m`AluA)NUM7!RU-?4y1wayde}yE>B!x)x2O9 z_yHPX>!=#R9Ma(tjH(pEuM!kb?Xn^7$j|yzFENga1GS+Lkg5w(p&mlesDe!#nt={B zj`vjIs2FbF@NWlsFt_xNV)*YivP_3Kf(U=c>>?!ftU&GXE~zA89r$4u!VRfRfgi4c z2CZNd-XQ~#Dk`?^4n!jHk}43sVfbK>1eeeRtpE()VH1=p5452kJmC!6FsZOWIivv& zFfZS9um}C{4@K(-CngAOL&>lxhT@2bf(8j8LvwBh-*?i)j) z8u)?pMsVADjvt=U3UW{v*|8l9ix(Bf7kS429wM6p2$B>LXN(a+kWmbkQBIfzu^gqY`qFV7-LWG*vaR4TVdQay=+Sc| ziI#rpl~f66_VGaaF%kh%sRptOCr}Ln0UWr{s5qe>($T53Q77wRA*IUa3=bXt36di} zGAWhPxuDIrMlVTP>>j6ylT>n<^sE?5vQ%C&sg_YD&7miOZyYkP3MufY5Qz6!lN)pmxG|{jqH_{u{ zK@tFSHfi(O)S%87=Fa?vVDQI$qG%Bpb5tG^2V=4sDKn|G5FVtFE|1C)cuy9T%?i4J z6L=36crGu~&>x+%9a7;l9YIcH;W~*@BMDLtsDU41;WKMLk! zH}x?%MP)emFfzRoEUjP;GBY8O3KZ0V`M|*&3Y0n+5<4H#s0dUlnn4!2f%2dM3$fER zE0Y5^gdEwkLjlu04F*1o13z15KKBTYKc!2s?Zt%by6uctpv4S2>!J-40TsdGK0DaMH@A4 z@YKOtl&}C)K*j36{;N`1bxkjoUow?zMs<;H2T`X|jEHe%LN!1h)vL77MsaafTXk3w z>s9w9R{sJRZ>NT;35)LYD)*~Y1q&g=lvu6xTC2)f^#xg-XI5!d5mgCP?bBs;6+n8G ztEjHy{!m!4wOt2GTl0lmg9ut*Cm)^3j>eT-z4cJe)m{DdUu~@^p{vlOi!0=`BM$au z%Jo0`HOkl(U?Dcd;1yrwRWBA6doGqZ8n(b5Hex+?$|km6D)v$K)toYRI5zfURd!{O zDrDhhWbxu;r$=UgBV}3kW1H_izyxa!WJ- z8@F-+_HiY*PBV8-Dc5p67h5rRbMHoUM;G-L_j6H~RYR9_0g!cDS6I@?r(}0_X}5N5 z_jYkNcXd~$fXa2p)^Cr=Y-0nXcDHzq_jr*vd6jp0nOCD$%6GpAc(qJ=!W89Z;>i2!qW`6Z| ze<9|6!^VI4H-H70!Khc50C<2AIDw~^egE%(75IT6*pD2TB?~x$E%<^(cY;-vfibv) zJ$QayD}+UOghTj)P56Wdn1oe$g;{v6Q22#mIDT7rhH1EluO^0ZIEQt3hk3Y%efWog zIEaOKh>5s}jrfR>IEj^biJ7>Go%o5NIEtlsimAAYt@w(uIE%G-i@CUqz4(j4IE=-3 zjLEo+&G?MbIE~eKjoG-3-S~~+IF99bj?ws5&B9I-mX7s!kHeP;?YJ!PxO_C2j|sVu zIR>04D4Gz~SpvCs^3jkXIg-U`S>^ucEAqG=RV76wd6PL=kP>m3EV;viNs~LdlucQL zV2PFzXigL9E;PtKn+Z`7caTrHmTg&b6iAg{7m2X6l7!J`D7lw8_?C&en8ij;eR-90 z=#!@imYE5Wh1r;;d74w_k`uXg6LXHlbsWhl>Yx%fp%U;wQxqZ(!r=j~!8aP(y7C##*cqKGdZk(VV(j7wN}>H| zq#arz3Lr%ZWZ@lDAqFZLqW(=fO8fvDrlEJ4C!$#yEyiFPu)!%>x~ZLdRWf1@WRD-n zff-zZ8OT9HxFHZ6*{D^TpWiv9xk)U}U>pAAsnI&E8wCzTVjRF@AR@pKxPc$CVGi_6 zta}=)3&JRTdX*M+E6Vz;)q1cATS_iqM#KRTs&WoQLKZw4H8!CSPDlj^BA^gb!4+EJ6J+KAjvx|5K^)Y<6j~b*3VXY`yGZ%~ z9Ogk3kj4?(0UZ*-{&UP=7Ib7o9)KF`+93KsBxuA#?t&;Zq#>kQ^R$7hbtb*ndqdp2 zAe2Bl^qUa~f-&Gg7IY*`7$Hw+O{K5}p@3LVGkmj>pn<4Uh8$@9a z;9wInv#twb6|TV<9^niWLBUJoG)_CUSG%<(+aQjB86F@OfNBg{VIHyp4(uYtN4&&O zd=3U83YvlWWWf_Q!4$TEAJU-`K*ap`p&hzG79^??(qSH0{0#8G6nM`xq?@{}8@o3_ zyD@yt*_=3(BNo2IRj`9i9^kO4!wPif2$X{vB0MIv;XMX|MCQS~hoUHsA|d)99J&Dx z27(3xeIali zJt~1Zo_8SLJu-d56*Qw2jQ!9N0t>ET9#Wy)3!>hi;ob!z-#y_048a`2;l>Ff1{h%z zgoGs)oggm2(~I38JOeZ&+^k={-ATUW(;^1cP8A?x-bJGdrJ=Q9zO_F=B$VPsT%^J~ z!_fX0q7lMD%4Ojb&LFp4KIUP5=6`}Ew1KD-0@oKF-c^CaBh(T45Y{ z+96n8DXK6XxFPJte(XVk&g;ZYh~n54LJ2;h8idpv7Fr;_e(dR<8_J#~rr`;09o_LA z-o>Hr#r_)dAl*g&>J9(!w}KMp0UYokA#}nO6k#R!9z99{J#!l&Y~Cl(UgsSGqgNpv z;z1MyqVnN?*HE(0RFq3AOPaiyl!+J#E`|0 z*^vhf89Hi*E)hdY{Guso$S@H)ZF4X_pn*_U42Ea6saxbRrOK5oTe^G+Gp5X$G;7+t zi8H6pojiN`{0TIu(4j<&8a;|MsnVrPn>u|8HLBF9RI6IODwBpQe)DGCx$xk^oL2Gp zJ&V$iqD6+U_?c?Bsa-iw5g1;eRL(8f2W{V`Z2PLAnr-t;)m?dn89!GG846tcAnx45 zck`Osi%1;5SXdZFh@{ySjfoX6V${m-nxBS8R?RDisG*W*iyLFTjXSsQ{@uKL`~D3) zxbWe`iyJ?VJh}4SM^u&N2R-^cS!mOiX6v@$g;Hg~$&v+*Yb)D*RRY$&DtdO6bF%T< zrplA7cc6h+>K=e&~lR1@e;)Gl*D78f4{R&nNk$1yqHZRG(M2yjy?X^5FE0!6P-7s^rxUo5qM%GbnVE}M@kWFl1+viuE=Ja zZoUa;oN~@dXPtK5i6>D?oY4VK5sWd$XiQCU#)4h~Dkw`AbipV7P92=l#glnXN@=B* zUW#d^nr_Nzr=ETaYN(=)N@}U5o{DO!s;m9*baNRfyY9XVZ@lu(OK-jQ-ivR(`tHkbzyAIUaKHi&OmM*lAB=Fq3NOrX!wx?T@rW)= zOmW2)UyO0a8gI;T#~yzSa>yc&OmfL4pNw+KDzD6P%PzkRbIdZ&OmodP-)wTkI`5nu z&OZMPbkIT%O?1&lAB}X0m2O?A~)Uyc5C)>?1Pb=NmX4R+XAc};fN zW}l6A+G?-O_R(U$4fj)R&rNsTcHfP6-g?sM_>Z(&tdh4yP4twmf&rUnnuHTNi z3rLKiM(@7=4t(&!4^MpY#vhM-^2#sIeDlsf4}J8~PfvaI)?bf(_S$dHefQpf4}SQ} zkAZ{>xSzi`5)6sYe*5mf4}bjf&rg5-_TP_x{`x1+koxHVAGa~AZ+`?VpaBnvzyvCA zfedV*1GUEx0RnJ>6s({HFNnbmYH))b?4Sof2>!wlig1J^ETIWch{6=AaD^;vp$lIK z!x+kNhBU094R46U9O`g~JnW$lF=&M#THygg4B`)uh{PnCu!uxtq7t77#VA&giA5aZ zP@E{mENXF!{=(u>yvW5cigAqW0%K9kNX9g(agC%BViUbsMJv8hju?Ss96jPhH{$V* zb&Mkx{b)os3UZKyv=kr@`A0qWF_4H{q!kr8M?NwHk&FanAuox^OuC7Zl$<0aBN<6Q zHYAUM45cJFImAP1a+R!XrH86GN?69yjk5G)B})m)IofiTbd+T+b!kgFx^kGrEM{-O z_)B2g(THXwAm5@!n2m!CAIHLr0C1ftk&8s&kz| z*`_;7Da~`X#F@ctBszI1Pj>2apZtW$JHeSqX2#Pc^faX??|Du%_H&^OW#>Pm2}w)l zb0q~;s3Rdd&W37qqv?F;9&ssAgog8(A|2>OMat2Xsx*@xJ!w5bip+98@|)9?DMn{% z&XwwPr)z8}J{@UJZ`$;Yyp*F*Z(2{DDs`!1^yx$;S=3XO6R1+nX+W#V)U0ZihfXai zRt?(AsZuqfErse<&x%$xCiA1QU94jt3)#s2N_Mi8t*m7)i`mR-cC(!AtY<$9+R%!2w4^PqX-|vV z)T(y1tZl7pUklsV%67K2t*vcui`(4lcDKCkt#5w|+~5j#xWp~46xHxjR4RA5%x$i7 zp9|gSN_V={t*&*ii{0#Mce~u}u6Mr+-tdZdyyUefa*Yec^OkqL>}{`m-wWUP%6Go> zt*?FWi(m1s554K_U4H)y-~bDFzyvO^fe(z}1Vh(%{C%SD6b#`AOL)Q*uCRqKjN$Gw zxWP$$aE3n&;t-2?#3U}UiJ!Y+4j<9OCvLHeUku|I%Xr4zO|go7$YL7nc*i{Mv5$WY zVH@9=hdBnak&lezBrE=T$tdpKkbhWYCQEtBRIaj>Ni5_i=P=4w?y{G^4CXMyH_KYS zA@3fD<}|B$&1`P7o8Js)`AM+MIz&R8?~La>>v_+7?z5k{=RZ2v`OJSVw4o1;=tL`e z(d;9ipdStCNK1Osl&-X;FOBI;YkJe1?zE>r4eC&fdeo#YwW&{y>Qt+G)vRu{t6vT4 zSj&3Ww63+SZ;k6*>w4F`?zOLf4eVeGd)UM-wy}?m>|`r@+01UXv!4y^XiIzA)ULL* zuZ`_&YkRX5dw|8Z4Q|z9OeNj^cDTYky0Y@vKyv;rIcTZjGRuB5oQNHq%f86FlpL*2K{yML}B+F_0(#^N;pKsjlKvz53|L!`o?_K3!UpEZ^RTsY#zVLI;HzTaEiUs98 z-;;m4-3P9Bz-vD6iobZ*m42~8lw%ubSp3TG?vje(Kr!uL#NAykc+tm#Mj&hZ=5If` zZa?B3{`^QqOW1DmRXjix785<`O^NXInJV7@U-0~>x&cgc^?hYQr<8?A6b z6iV;(fD0b?1Xag_lwbuefC!r)4V$qE zo8W^kkb!bg3a;P^q0kx0M+1eB3a-!!pD=|OQG|Wq0yN+Vtq=(hpaz@32r+O3ksu2G z;-C(ukc5bU1CFo>h`??H!_3$AqId2d5AZ4-g&YAPF9K0ga#ylo$`KU?_bN2-?7jZ=oP1L5chj z7^%Py>Q{B1@Bjp%baJo?<{%E^kPYup4U`}#SvP+PScu2SFfOo&bbyEtFbdrUe^nQW zh427HC=Cw~3rVUzzK4Pi2TqB7jQ8bFbebV41RzOqQD8|U=3T?bgvhK$VmQ?3xk6q z;R2)Z0L}1&DHn~9SPqg1B#np;(QpU()*d-H68jhqwPA9Opcz5Z7Vn@M1UWI3@BkKJ zJ|B2~2*HsUA$k!pZdkAhM^F-~-~xGIjuPp2G*^*Nc`#$}ixcPqeGm>20hErI64UsO zZgFs;#}69m5jLm|5+sWcnGzVX4d>Ms-*5-^)+G<{fi1UtSlJM=sFR8(dTY{wQ0bRX zLkaVsehh(rzW07w=@DEBB#BuL;}8g2Sq|Y)CQmR8VW|>u@PLkh9kb^VaXFV55s(8J zLGB@zEpd2}@|UUUH|W<27{LjGIcFKjm?AleNb&%(nU#`Q67w*IDgH4V{2&U8*_qcN zm)k&_4e^?|_yD`7oT}-Zq_ce|fe{WUfroi~vq_D@X`SGgo77km(&?MD;TIQJBc}10 z7$KGZXb=b?n$PK;m}7$i!VUAu4c&kxI(VCi*_~Z!o49$Hk~jvVSPA504g4^mwV4v0 zX`I>V5wggU+h>>WDWQtczr*#U~to*1DKB1xVJLY(J` zBjOMdHu#ehDx-a)5#q2KcvPTbIT-7~8j9he{GbYqd7bt(ikbKpy25d z=qC#W8k{pqrEk*;3DGAh;h+m~0ascMl&}}AVGZU$o2D>}{%^URkSUT%;0*i_4v%mc za4-w=fDS03oz?*vzsVRXv3u|^5Cu`CfeJNJ$q%-u5*lHbDajAs@CquJ4Vw^>4C)6h zS&5|wqWMXia8RHy!VTb%ArxXEOiG-?mm$!>mk$sH)c_qODyXdrG06$2DG`vVuoq@9 zAJ7pGuV4m>$q;_P3|Mk}m&&UTa0EpX9qsT6Wr7i+3KZ;YcIFAx2 zN%1JCNfceGq}B?qYvh3H8Ls6zMmE@-=Blnzl&S(LDeDTaM^u**5wG=%MCccz_NuQu zl!lw2tosVE0V}WrORxoNum_8<39GOR%didWun!CVu@S3MwL`HLYq1xLu`DC8w34wM z>#-jTvKPCtvJ$c-YqBScvXV2hv68Ya>#{Ekvud-luoAO1YqK|tvu-o9u9CAo>$5)# zv?;T*JR7t{YqUpev_sn}NXxWM>$EPbw5;;9Q%ki~Td`5QDpsqtTg$bcgSD#CwP7o^ zV@o(+n<~0PXpE+|Ys$YzTXXG=HW*aL01GjgJw|T3#d&{@k(?4{3DiYMUgG;!D zYq*E2wh;uli_5r;>$r~#xsfZmlS{dkYq^(;xtXiEo6EVK>$#r`x}ht&qf5G_Yr3b4 zx~Z$W+Exk);RPPiy3Fvp;1avDnk;4kyxtkQn<5b#@iV~_`V&;?Y11$WQ~;Ag-18!GhM6#Lu1Pa(h|LcsFt6T15j2dchk z6}-5SzQY^A56}qa;0^y86>>lgg~|{YoWZ$)1&FW;*x(J@APbd{zwEIIsh|p*&=D#j z2cf_W-rx<_fC?Ino{caHtsn}4u!SBm!Arrx9z4Jm93n+*s6cVS;QPQ3T)Z!#2-#2# zdEgOwPz~9j2tdKW4$Kf;{J|Kk!~Rd9#9B5%iszLU znn8-Gu)@eW4wPsOkC_r++!STp6oQ<@9lXRpallW!RY=?tAgsfE;0@-`2uy4aPTUYp ze4~&|6@<*mOYzAnfdyBp4yw=xSRe=Q%G$XVscED_2KA<2{s6r#Wn z@#_)Z49*rT#+{7FW<175k6fI zOb4Hk3hOWqq!0?BkO*qP38XL%>yQd7t(gzt2rT^oBdiLr;0m7Lz75d@dC&&|ozvGm z!RtH*jj+?NAPRNB5_KR7uK)|G&&JRG@YM|4w@Cu$V zXC4jGt!kgNw-P*7H(IGwC4PgkO@CmUR%%QLeW{}!Yf(n=o z+EG2#jiB4noz+`i+6+O+y^RPcI>#e8I1n3X=Sa zvcM3*I|t0*#?dhjQmD;FLf;L6(HcFS8STKKj0Kdi%5>}sfvw%H@Ep;x4LFGrU0@38 zK*z111|gx{rwzh>;2i2<4xAvw2u_L%jw9}&9^2r09y0nFjd z57Gb!Mcvn#T+R(W&JEGde1Zp0nl3i%Bk z+8`0?tsegM(B8|8$I)R8=6&Qo?hQ(=<@~_q^}OED0p>9r2;<1m7!9Q4oaRfeta9Ms zl(-Ew9px4t9d)eXwawv4p5^M%=3X8hah{eAecoEdp4bo#{`v^B;Kr~ZKyZ!HD$UX^ z4bw7B)AbFczbXr&5DKl($L#>m4O}_)!wiQ);OUtsw1(?hUH03XVVtu3+KS zU>U5>(O%_-e&rYp^e3P4E8p@jAM>ziy9^Nv zJs#;wg%I0-&#ny1>2U9O9?6qj$rynU*8s=UsTkkzm@b{&4KdL;9^{{V%bQ`x{?W(6 zTMG3s4qnX0tQ^LUj}ecc4WszqUY!oq5XXKniUOYznh^_+UkQSfC_kRiWVY9v0= zrj4JhfpVzv^W@RoJ8TyThH6*unzT6tv1lBpNFtqU?am; zPNiDa>Q$^+wQl9w)$3QVVa1LmTh{DZv}x6@W$X2zwvH0>m_$X8p|?K%MEiI%*NEsr zbB>Az+Q!cm(pdaf6-~U@t~tB|Rq?x4rzpj4ejeP(#xK?2Z}mhCbVb=R(NOPBrd-)_ zp*h1vP4U|ncXH*+^)kQCc1PkSZ?Z(bj+_(`Gk)s4jic?U3&BO?`WD?geW03A{&XC9yZ(5N^y~h9~NI-rFG|;33)qn;eg$4>FG}qX3k08$85op7DT)XcyiBemQ zzt;XcEWiN^l#4@&q5~(8wt^ILNFs|g@<=3;RB}lsn{@I?D5L(A(y4=DF^?Zt9xINZ z>im-EpazX9jhPUM0!k<|gBnW9yymFJLW%tN22DrK5hszNyr3i$zubhAAfRUKuS9dm zS)?e2?tH+{8;Oz=%{s8DN0s4>x+}b+=5QsR?Ysde9?I}^$vTO;90&_a3RBLTa*|7B zxc<=ltGt2ET+^j<1d|99ex!k;sQyM{)TluB8`LF3i%NwuI*7s$Jw(E3XO!oTvUR;e z4<%~ZYnsK8)(19uN4|k(g9}$(397TUD;FEKsA5_3@3myNW!72bWPLys1|6L8Uw{J^ zcwmAHHuzwK6IOU(CeOQaKjJVQ$kZ>vC5m5aA}R{LAO4Br7)UlB*sC5+jOwox1!;>5 zsgX-A${;~&j2KaKrfb>cl~8_w5^<7aMwC8I3^`Nsn$aw!RN5Iw*FeA_l^{8-qsbgm zs>MPPZ1{m?j0c{5+2Mgc#&*krmaQffw9^hn6q7!?`RkbHy;NC#GA;^iEJRU3C>~mbH6US?9QhA62gVuyL2jPFWjK)K2?Nl-?!^W@BZZ+up+~*0(gr7&iTM z)Kgb|b=F&V{dL&c0((}7Kj)G!FA18Rs0Blph~F@O?|1CH_F6|0oXcCVnw*j{9{Gpm zB~>0QDod{{zfy!MJuWha5Q{icX>e} z2zY-Zm-vBYt;!n%B;Wu?^Sq-Rq;qnE%>MvbH;su-B6UDTHbAuzN(e7_{-c}k2C}=^ zTq7rsNC&xQCXofT;~NEJ;bIUNJsL5PdWMUj?!a}e*yT`%JLF*xefUEl22qF-yxWXU zc)O?F4@*a(p_mj?6w(o8Zh0t-{@}GZ{c)lm)H6^OjdBKO#BF*GWXN==$PX)~35`YR zLLge9j(CuQaE!4SK_sybcKIod1gXS3dh>wjyf074smlXpA+&*{=vGlA9#K$n5=0v1 zjC&*q7{$mz(ADsRbsWeT79opxsAG}-Pi$l+i>R*=sptXfOUN7_phe~>Ws+YE;{wOn zK}{-AR$?1sFMat-Ud}SOIbJw zo>C%MD9tSVpbci;`JXA{e!$ObOD&d=7+HzA9!>je1n1CRM3RWolNA zsl;Rs?snL#SUXY?Nt(p;J%auN*-W{*(BhbHX+#+Va-bm+FU*2Ll^RGT+F`%hj8!6I zcm+H%%20NCNv!GWq*+DcqpqHiAyO@h`T|OnQQS*G^#F%VM6?b0J)mh+mB<~kmLNZL zBeI=5NGl&eQ=cv>D4{4{J-z|5xbpP@bhT?w1-j8(f=!DLB}nfg0@~LCm52l(;W%2c zk!K1tt)7XbB+>y_zNwbAcb#EMgZcnQHdVUQrEYbtdtK}n?5PTbnr2f`EqR5cVzU5; zDm2ywQNYF-BALS~U@;1z_Uc!=k}p`pBZp}4LmZo^mLHf=k90uq0ghmfEKbt}PB3R{ z1Ia^Yyitj2)j<~6ApVbQHCje5;a9)>9f*Gc3_Uf3QM>~&-{CS_kM9zM6R>avkVrT! zL?)szkP|IGv_Xk6jDZnZSWYmiaB7R53i_4J8m`9`MUA}Q>)sk zJOP`lGT6Zo9*Be~%v=ZRcA#2DvDMT!QYhOOmnyC4hg3u3&<=PUR;`pHym1n)J)pt- zcyNR#Tw&?OS7ei+JlvJtyo^o3K zYN5T9&#Mpx{xjmy4$_`#(v<$pvZk|>dej3OrC1v?yk`yc5t!1HmTQMia*kJ2E)|7o zM}h`22l9-YA1D^usb7l)RDdcR%wR@3>+uS<=DOIdu1BwbeXQI%cemosMk+=zje_gS z-WnZrM=$1T6UO-gpx9eEnjs6#@&g*)8i>GmU2tE6dCft^t)pH3a+t?l<}+6vq#^bI zHJIWXl_p3RLZJ;;XSzI*xQ46wagJ7ibkrzOiAf34^lQ#B=R5yiJ7j?fqxjc*-}{Cs z*g7#;Y&{;&z|+A!hu2Z%4(B?jwAHa*%{Nl|#)zCc&#mnx^fG7M@o>ehI~Ae#-jpunA^Xz5 z!~D}S{pvTL@Li#gR-b}@^Lv^4)4s8=H{&}%1WZ5$TtEh#il<77-t(Xc1iuE9iV1|B z3k-|fP(FfbI@hQ`5DY;P96=IPv^Urioh{5luJDlcQ5ZS+s4h%HHC#hBY{N(6BsWYz67s(|tV27zLp;pGwQz(`5EVT% zzVYLP+51C6EJQ;*L_|zPMO;KiY(z(VL`aN8Nt{GVtVBz^L`=*?P25CI>_kueL{JPx zQ5;25M5^Ji0#r;zRa`|@Y(-amMOchQS)4^$tVLVAMO@59UED=p>_uPvMPLj@VH`$c zEJkBIMr2GzWn4yPyv6G%MQDu1)H%gwtVV0RMr_PRZQMp~>_%_=MsN&AasC{~S$sxm zJV$gi7&TZ&a%@L;d`EbUM|qq_daOr#yhmeP$3aX-e(Xmk(MNm?NP!$kf-FdbJV=C0 zNNm(ce{4vHR1$zxNQsSB0NRb>#k}OG+JV}(SMvnYQ zmTbwf2+5R;Ntv8Unyg8iOvsgVNuAuutboaz{7Ik;N}(J|q6EgAVuIx&$6i2GOO0lfUto%x|JWI4pOSQDcupErNWl&pT zyzLzb5ZtY}ySqCr#S0WD?(XiA;8G}79E!KNI|Qe=yHgyB6^C#+=boAOy!W0Dcg=q? zPj>Pld-hCb_OsXeEv4qQ-`rClTCQX4q6_#Z=~$ zRpt?t>4udT*FMrkjm~GQtW>D1cBrh4sjRQ5Y@Ch{l0g;%RJO@fciy7IVyb_XRrd^3 z_Z?IZ0#pydunR=Y7!yLC{z z3sAd{Q+vo(d#q4<>QH+gQ+rucgS`c&pVa^u>Tu-h@a*b9adiY0bwopTBu8~npgMBA zI!cZ@YNa|_r#kw$I>x#>=9xOyi#j&OCmixmxa^P-Z!{X1W=p9wh2%9wDreQ{ zW*I#-!PpwYjT(%fXA7XSVmGs_XPUzNs6vQZqJ~=UU;1SoH3h=8WcD;<P0Eoo`e&uDwjGl$Phv(JC({A^$-r_!j! zWvQW7{8{Tp!z6xQ0a1&2e%6#-Q_*tXz){ zu+K5Jf!eO*Is&H)I%jic;`2r-^P210-Y?pY<8$6BF~amZ{+&AHVH(Dr+JcP>UhDG? z@j5}4v!3)zE(1DYD!MFhSlx7pA|PCa34vs3G5Ac!lU!F-evx8e$ya>Q^s{av#xl(q z&_1!*H9ZUsTl*`9w)2fPcf5A|*^*AB&bP`hS(Z@Y;Rw)D#3z$5^_B>bO{9wYa*T?O z)80}7!BWBcl1t-!R-j(lXQ<^gQlbc02hhmPwG`X9RA{J|Q9S>~D3OoXt7Bi?IssVu zgy@*eOF<(X)Wam>Lu3>Xb!@`bhV@LyA!;^=Itt-3Q2@I}c*UqNS|0%Y5(2D?JzPxT zi{1dZ^K7-7ej&YhA%tANzSCgLk&n&?sZku2+7cm|IBMJ;ksf=7$p%rK8ky7_fr35E zZ7G5`3Ze5U*Eb!Jmr8?PY8^x@=*Sh8TD(>zzBEQ|v{TGMl+Nb}1h*;ecB9vq%_G#X+;_}gQL^O3uSCigQb#VVM zQoO67>oAfgU@f!-plCzz1t;A1o)#Ph&`bw8w2YN0=mCOEi5Xxe?-feVQxWC4OtyPW z+I~hb`2a)?BYf|}3ZzT`u7*KAh-3^=XzB3|TbUft2=A$Hts@b>!};a;%fu6A?6=e; z`3Uyv#$E3a$+|-N6R|7S5ERqFpfZFC{us?Ikkw%b$YtGIy)qgFG>64!Bg;8quvU7cFVnmC`;q$6G0TbJ#9XL~5$nQ1>j1vB=c_;GXGl&= zR^|d$fo~>GOG_&!tJ!F<;P0gI7ra6y#Gv#DMy?n{SkJx@CJ6MatamtHAsyr-Fr(#V z<)L~&kAkR!9gap7Q!c&-N^h`YGAQsta4L&1b`A5!jx78ZMJyDh<6}+xRiHo@!SllE z+cxIEcTu!lh&oYW9EMh&RW`BjaT%(9(AppcaqY@UMS7`M(n?_(1OaTc|3KbHGEpEe zem3pyGdgBp3lWI({)^)w1(NKr$=R@t$N(m%BeLF`sM{jai|o6s|`rA<^aTn;3Tv|w{P3zWDmC8LN`Uy z$=~s{38xF%Jf{XZ0YEn@k$PPrpDuEJ0U(%@ixCovU0Tq(#IRB4zWpj|c%~EU0X@jd zC)`op*jmb=dBb5M_dh_Mefzv>7h8C@2!>BaR`&-&mjbOo#QMLMOP}FChhPMygY0#~ zh8d8B%ETqm!WaKKY+?STe}i-iK@e4AFohr-!;Xbie|ZykA1?Q>{(`x6Pxd*S4hfyk zHvW?1ZW`}9U0^y>UpZZJIA0^tTuC_J7@aSEbiNI8zPBR2`|A8y--9H24K0sQM$l$x&S3z5Y$`{ja`tOT|mJu$mc_!b6ilXUC_E+&?j9mHeE2!U9etV zu(4cmC|z+mUGXGc@zq=jj9m$xVVCF$F3ldU@A6zps$EIDUCAb0$v0go&Rr>AT}dKc zYZ2UNINfL^-QJ)P^u}%s&TfpaF4Wy4jCpP>)o!faZfuio?3-?c32xU#o9fMUp-B*yi6&*%JurbzI6Aqp}ub zvb_DumwZbkeKI(Q;u7S4fu3p@9}719Qu7|Gp^tQ*o~m^o%Yt1RhI}&JG=curv3YapKiRo3x@`p7@xzjo?GvH!RL>O zf-&Qp-j$^R^@5Lepy!0<+pg+>$>#e>PX7hxC-8@t9?8d!yug)LpGBRQ@i!7U<@50Q z{Y>PG`}y-q_sbg5%Ui5q2+ODT`|~tLEj?T^C|v^r(NrW+1pkaWUdR<|69K>yTa z@nt4|D2g9uEYa~(vq=8Cfae0;k$cfl2EH$$BMRT)RH|y8OgxJx%lt3xYP0cQo~(;i zM%`cxRxh^YI;+V7m2xlk)h4IS-gs7Tj`cSC1k`xuT*|)#L`CACeXjqEM!hqBPom3Z@)o*r-%$EgXg6BO*iJ~USG~T{yOuYNqfd)BBzhQEE73;7OLFYZk?lc1Y>PdrNO-z1ym5ZWZL) zvK=FEJe;2>i~FVM+XtGAq9i4rkKeY5$L;-#mYPmEo7@njoAA-wbY{DnQRG9O*Wa&p7 z5lhUWyS~>QU5Zbr!jD4Ht8{Ds>|X2|Vsns0LO)7xmbjuF2Oe2Z)np1&Q!B3aP=!fEkl7|)R?RPi2Gr6x7u5H2JVH}r7 z{t3r!2W44$4KpJmx$S@3uQ%Gyt(N@-w~c;j-DUiW!E}s#v{f>?Qa%uSy3W6C_*c&H zUG?RP0)+Xpe?mgh-kNJaNqZdxd})6?so(5+IuEvN(;CzaZ-1eV^?aSXq3!;B^JQCA z?_M-pZ!0AY07fxg6&VF=A3#AeTwvTHJ>Wn%6a{P_jNWF_$znr>Y4*l{B%?-A(xt=l zVh?A?&V#31l&J|x6yi3Z#;~{PBi*@RXA1a&S^J^r9lT2<555^ztW7^H&2*G#kuhed z0u`eky$K?X8E(1F0IS(_pw<}8PX6!!Czw0VjEokIUty5L=`zmFfR+@tdN?T9%l*|Y zo0j~-)dltg(Uk3E7`bQ%=y*z1k+4Su8wxjwxJm1^a=sEq5 zMvdWl(|gGnxMOX{%xQQtM#fS}Y?@Q7Wq31ZvKjcxZO84+c(Yd47zEpo#+|{u**j#6 z!lSkm?gg5eAlrSO)eKp$65iaaY)0`D+e!Z&-n_>(M#-lmHTSC79Qek!;@`(f2o2v4 zR6{0N(&MQ}8NPx!HYQP!-6vcPtpbvDrVpaW(+Oa{A{q=vc}|#}29A|S5sM+SlK%0` z_g=n|S+=8(_9Q(iBYdSI>&$BY$Fq6hQ=5??3FdlUZ4g{&Sr{cztl$~P#a^&W=?vtG$bQXmz2Y1$!fnmY9>&hx$a;-WU@HP zfQgb#&TgypRWwBSFDN-KZ#=e}NZtHVX+d8|m|Hp2n=#IDAp< zw4<^@JN9L|GbUn;8h-EOTZlag&m?VJ6Q_`YV6v15(-5cn61?$4HOPwL#|a=VgX6IR zt@Ll7VZJQkbvvES^eG{y;SyQL6a5pr-=!O#dEePibo*9j?SgKq#p6%RY1`G>_WA2w zw@%FZ9+@2&ZmSn%AQ~nRJR+%4#5R`*Og;{H^Lwwl(X%y6LI1@`E6)mdWr%AY^~U92 zsdiC}(}q9PWX~-~gi{4!HWv`wc+oxqc&EP*R-*MIft$9%oL!j|2qkXbz1XkqNE2E= zcE!X2Q7s%`FwkI23kOk9dmBF~D?owi16mJ8RqB6OF^N71jVJ%S2v=&`o*m@wpTXzwb3Yn1t6Dh<5^Kl3|e-czClDVXDB<%bcx*=F~6U*Wh-zuQ;2pfw@dk5Rr87RjQG!iP1$W`0*#j5!?n+Rnitl zZtep~3Axd7Pv*vU`n$JMVP!H&F#!Kqk0MzpOMf3~36QBwdY&9%gBf8~zVB}*ykt69 z<~g4k0W6?kfGq(Y!SA9eb+jRFo z`o|$`x^P&3DP)FaNEFwElzTB)))9$!P#Jb;u4J*A4DjCP+{DX>4F6yu>%j`50Ts|N z`)+|mvXV?mDx?iy%P&iCZBQ~3priwYX$;hq;GiC0V6@!9lvO_5wWJJbfnHzp+(ycQG$O`55 z(2B`&7wiI;DF5+qGLUV)$Q#dugZb0@SRCLPTfj_&IWkebVm7kWa#ElW8R3S$4gP+t zCU^m%K8AZZru!XH7cf%?kWEg8DjOazMwW`HAJKZhMaoG7QFD*tw%M$}H&>+hsvXsbXnDzcq{%EqZL(zKLYNa}m1D9o zk<74EX|c6;MGYX7MTL}M5QCCkAQM=q0Ya-l4Ykx4!K9V+0Fs}YXbXg4GOY8JS;~%u z@|Tf6djfbbWa;_(8MVls#RssyLYU>Yfu}_lZhZ_c3<6Cuq_`!f0&->?R+hOtz+pH6 zrxKYpH~}99V+mR(3OPe7h)~O#a|yjSy0zZ${x7@wEMYVjK!MwRZNE|m&%Ld{ z;=OSCnjhqn!|-=E(n3)X%7%5|8@V^Y6kiJ{S=4JP0l;|9A3fURC1K>h-4k5vQG_+X zOU~^p8c2n9!3R;u&F}-gSmXjG`Y0sKz0DY)wz6CT2s9~uqGIsGT|je|{&(uKCT-iC ze%i8ch}nEb07XC31%zMueJBMJC5sK|asJ!e5D~=4{XamD9`=m`#lzD6=|_+|WY#A$3c_b>XBvAo-)?HkdZqJ= z`BHvM`D>deGLScN_~UB(a^6O^KZNbMEUW22bND9=Y6$qrbNCZ> z2;@7GK4q4SgZJ^V@;0)qey@?Xvz9iqvczvHss&+`VwzpgyW&1!G%?49{S+uVRD?c??oD`q(jXw$NRpi|Bj3w&BmiZubb^%999~}j zs&-?eg*)j*v9G->KTegEHY&k$lO6eWIs)zmJ|FRk^=Oh&^+>E&II(u=or;C@ja*gm z%GvfD+e6^VaA!_`-&&o^7h1j#p&5o3Rxl8$kf9YpoX~Tal7K;nakD3`PTyk2Wi0)f zGU0sSUvXqqOAKfI+7;a#z0pn%Lv3f&fevlqZ0(-RJM`455o^OV$|0HkSF`A^hepLFdDu=}xh9|8YS-C0s>YhY>RNBXx&)Ni zq))h{khVj%>R3@7%$fq<@`F{5!SK(F z?KCR8Bp0MpJIvaxuq7Vuc_LIm%R$b|zDwrMFt|DomQ?+4Y!WI__Vz4Ek zNYpNxs~lyaWhiLotk6CrZx^cTY0x#vWl+_nqH(B*EN!oau#XJB5rAGU`|WQyfd^>G zU`k~HN`LQLTM_m}L! z?9j$up)hzticseMKP(N~(pG&T6#e7@vasB%V$8iRl4_RvI@Z1`>A5-%%6^t{=w!6S{&IMiiz|^)&-|mZGhCB)74?u6)b-#!bhIb|viX2n zxPGugt6>Fh^S7Kdt2B~jd`j0ah>~Ex3LXua4}+F>pJ2bNXoyUc5tK=n@4cua-+hm| zS!4etpN_w0lLS;+b&auid)5soB*#sgZYFhdLxJ({=Q|!gw7;0$K+303zO8LB6Cizq zRhR&fqUnwO8G0ZApdGGJ{tAy_aWbCkA@CjEUBZzypMnklIo}%Hvvxx-Uq**3lCs_7|7^czdqcI54r!C0+t_=vB5+!5b~&9q*%1* z*gl`H_KRhyB&@f36cw3HOG1#Xman9~p2B(*VWA1vUyApn$xa6kJ{u<~Z>CT_q?&)v z*^?$GBT5ElCS3}q#XhX2EoWr3CO7^~FK?|jTh3^2P4ZpN92Fj-ST5^)NS6PSKKYP) z?VI=XkO%b3M|;f2dyH6K{Xy$j!1`Fg>sKiHSSagPr1V&%=~t}(SZwZBV*gm;?pNyn zSPJngi}m|K&<10Oe|+1W`Bnb-tKP4?{jt2yuVVDEV%G21cM*npzp9hRs%yXMr^jlb ze+}AGjpk#eF>Wobe;w;n9j|}A=u^F{e;H{zy}W;;{!^p5f0O-Fle>SdT6==0e@pCB zOR|4!)>Es}Q?nXwTfKjK`%`=0+f(EAw(9nd)u+x~|E`m#E`5K^yoyoE-4>WVkgl zfHvoOq&{G@U97HDjJET6Y&KwgwWD&VgJ%7C;yPgRDWLG6W8(FB3NLW_I$(-1X`1zA zhFAPIEliw-KX6XzWsdWCmgwEQdEkP5V26Guwd2boByh>ye~~C@DeGmqFt9FJoVqx0 zwf$vv@^J+VcWpLseO0_{w3BN6W#c+u>_@O&|xfWI=G7>9(Gh1H2S^ks5I!LJ!q&ph@umA zI@{GhBtbDB^!Ee?-Gq^!!OnrNop)X2h{2bn-91>6{MHHkAoSdne#=k8LIwjmNCr;DclSKAu$A>)$<&g~B)5 zk7<0im(q%}~-IEJ^= z`lwnx`L;vr(u2!|lxz zk&8(W1cm7K3z4hYK)zE?F*@o%XVKhksw9JfA~)`1ifKoezUu?KXsa6LFE2kXRd|b zcQEn*pUYiDXTe~KK);)lWm$$-ilBgp>mz^XV9Ma2m!}8&>Q_oA0Ff+Fs`OD5y9a^5 zAW^y%H2}L8nLe8fip1W5-G|P9n$U|W{*2v^ZM~Y;^+8~+d+P5Jx=VzQ@s_=^1A)0tG+~2Pe21&mea@IJ1GZkkiDQ@I;;Eu92(p8Oc zbUx#bZ8VW3kMWFqaE|fK8zhgHP6Xgh2<?B-u zXk1TQb?ST}Tyq&9|GwrnE>5)WF>m;N-D^FNXv1eO=lh1=StrqEz|H#i&7hYTqOA}_ ziu5foh6M3;7=cmxc0_0!U?++`H+?6Dy^DA^j(;Ql4Ny?Ew4EqVkzsKzA@Oc6<+D-7 zUc6G!yZv-afzzF2hpyIwSnG|9gWNz&#T|$lapqw`yadTnQL0hqQAth^$#Ge5PD^NWSnayh4(WP< zkzPO%DYGwnF(k<@`w5K6E;?QB{cKvOtFo>}*cb1dsyYXMoYRVZfd4loPnq*?Mn#hR zX700b&dq`$<@z=4V^DSkF~m-wFqTam4V#OVU_IBi_(H zINZ0O32H8OIJ1^1qVFXFT^J|)?$Z{!t*)#9EIbj3+y_jcy(CKs!;U(y@5SS>5q-Dv zMl{tj`{uF)N3Yz2E}gQ2|8rQ9S6LcGK92ft+LAnH(50-37ChmWx;$_0Wt8fT*N}YxMPw(u9H;jXW5iGN+*_19%IZF*8>ph`95S(?l!n zUy86gdyJyH%;$U~f^uBkU#Q%02!*!*WK)6@-B5M-vN`-KJ!C}P?SO}z&{W9nWY(UPW7$_S@aL?i0MJ2(ltLR|%(nUNN zvdxM3BB~1zybTO#kqSNkj>5&~*?@cdONE;oZf2r-7>|jaAtq)S?G$cEDgI1++isJk zx~20%qBia3(>_~Iw~+vgZ_s8a90t|3}1>6)G{Z%%xQJqkO&mX!^! z*i~_>X#X}=LRj!kQ~Ze2NR0p5pC-29Z9})@X1NXQqUL7Fu8TWU8uYERnLtatBI=46d_SMsRcX=7nuEf%b8@OMvCD-izuL%tOZ!OSDy(?T^odX3 ztIGIn-W|@e>Yba=m+MAeoJ8UUCN4?vzxj*YhEH{yR^4t~TVe=(@fa8ErmPy)EG-aB4_(C!Th^T#6He7L5Huk7ap!Tp`K0AMR0PSU89VAl`%0G0-Vs z`L|n)c)cb=4%H}@Xv0M;%`NI^rd%f#TnMR{<2zVr=jAw+$7t;rI75keyyfWE2k4Yk zJy0nmBeU)PbNKh)8Xc-I%~|N7F^vHjSeKQ{1|g3Kmsp%s$Yjd33|koG7&wmbcz2u# z88VkA$`B5x0LdY-7J!kRiD?ZmNCj=WSCuq! z0)-uQG4~t!YOPekWsna$V;MWehZqzURy>|<3R>ilf0uFTip0s&b%rK&mx`Jvi_VRlbLP#aBFv*fn;cDhqCzE&OApg@>*kOO zOxeo(V@vm;j_%6@&gYr8JQ9~24}-HUgX;`qu$zE~8{>DByEz=D1YG7HZ|#%A^y9Wn z)OC!>8Z4z6gK0dGnYavjGqnXtEbTL_IWkO*SKnH$SVw2rqG{L$uAXCXizjB-H|rQ@ zG}vdO*)LHz&T%=dW!|b%`i^-xUvat2%{U*DVupFRu<$rQ$z0Ri#5l9uuXX9!Zrt=S zZ}!)G3OruCWO`bYw0tI3#_K#Ul-PjZOuVyvoioXVztQDT_~?&QSbl#OIOMagXC**M z8H0Y)!~3xhNJX$swZRiAP5OFT_RWL$2LnoCKs`GoS=g~IIv0>|I}H;`jwX7JisGmj zuD@o;t4I3-#V+N|;F88{+Y))FC_0HpZ;1jj(7?FJ4}|h&0g$og^0O4&g{Sc(LAa4l z$(YYjY%)_ku^v2$P${%IDJ*OvFa(`NZ)R z@;-e_4EeS%B?s)mMu)?Bt2fP>`D%lF> zV15gclg~0DEzF`00x(e9#Yhv=G0#C)q$z1yL?y| z`I!3v%)xvK$Ab^!bDu10q7$i5YoKU@Q1m%~<~#sXAXQUzUQ?1lOZKzYhg2=4c`Y@9 z&zc07JfAVfOwc<3XaxX>(7#Xi{7AfvKE#J8xhB39P@P}`UC3wM$W-0fdEEqpFUg<3 zd{6xX@$~f~fSg`SIHu|~bGXYX_(;5MY^3V9&+B&+7?_s=Z>>Ut>h&g5UzPF?EnL|lS>tM(63JMjFPP?3 zTheHoF{YV)**E1R)L_*%7fdtPL^7vjp#lJ?9}wU`01W`!Z@4_b6JioD67YWs2n3>{ zqN1atV`5_B;NTDt5D*g+lai8BQc}{>(=#(Ov$3&paBy&Pa&mKX^YZcv2ndLXh)76C zNJ~r0$jHda$;r#hzkmN;K|w)TSy@d@O-oBlTU%RCPtVB6$i&3N%*@Qf!oteR%ErdV z!NI}B#l_3Z%h%V}-`_tlFfcecI3y$_G&B?p28V@(MMg$ON5{m*#z#aY21AlO{gRwK zzS+Ac*}5m``6P;leZ@|UhEItCq`pn$e@$`(Ts#CmCKNvUKL#N#2qno2E7O6oONM)l z=WTfYr%B>3&SI?oKPH>8CWpB;kF)LvPeUPpW3fn6@yCWj$MWp2d70m{vNCgWb8~MX}Z?FGd_jmUX|Fa$+ zA0Gd^o*tk6Yo7i;J^v4Sd3pZ-&&z)a_W!2W|J48e-M7R4`{3IG83x!@sD&^l zGyN$n{gE4vO{A3^pKtPBkwtcUd`EwhA>z#RDH_VQ^d{P>(e$aIA6qTc)WKgSk}T3}_cLrte(q;F zNHAKZmb754P-SN+|l3&Naek}L?GKJ;(iTo-{HnaO_(lj&jv!XF+ zq`ab|i{-SYpV0oac9`(vWZfwIAln<4Fm|c_pE7Hu$()raapSZMDRJ|x0&0b*+dhQ75rR_;D*Rx-CnieNU5F1(ZS%MrHb)2mS~%^}yJl?8|E#?$?P z^9h`+xSA1e(D)ZFyST&%j&U4Ez8M+8vwv@$AxwyTS~`w5^SaiRHwy;dXE%!`k?gli z7T+Cjmu*VN`M;{;mBh&Y`WG<>@K~I}aCct}^oFel+?_SMnyXgcZiNv!-ET)RR^9LD zzCl7L_(G<7kOif1h0J=8XRs+F^|V!4D{7KPO+u!`0aP)2;P)8(W1%bPCFNXW78NZ& zWI*IKT%g&cFF+C29_%!w!%71V#8Zz^*xl8bAQq|ko^Jj9zd0S}mzyOuXBA^aG2qpI730`a? z3E{k>!32bYg$wXOABSbUYWyQQFbGEHWZP7>Fu&7gz9Ioad2x|2J|S{#S(3dC*M z!l+6@II*Kbfifj~j;HkUX1p8yvT&8g8?aefF%3VvPOX?I1w?yq0u*n#NMsBvN9dPnZT`)!pKYPWt0^jGfLY+iov#` zVN{&fVy`P8`bU-dM?nxx3d|+;@6D+3y&r$d5s@#S6gdTfSP~wWtB30dKxotV%C3%D zjSxnK&Ln}GNW;~}7RL|$AcKxT6PJ`|{q81F6Us+WdbN7=8qoHB_J=fAiVHG50v<|n z+BAm7_3o<%Hu|4$*q&-Cw9E<@-6+UrTt!?xulQR?3K#f^S=ewWlGrG5k2lqjHYO8I z+9le79uHe&T4hU-&@R+{oL^*8WJo_I5dN5QagZx3AHCNkUP%e9R)!!3m4WGzJh>Li zda#b(>s)^{YoH5*K{0HQ=LJLvYHMDMZQ*#4DZx;@=x@h%_7}9ZF$on`FO+(=_OgTq zm%)TlCHM+(U`mE9ByU4DLP6n>L(JRuEq+bYKGDoeTxJR`mm+gCcilD=IWFH(0HX~K zd|Ri9GyAyHM`2bGz9P5O%8D}ppD!@31{#@$IA)882SUiB!nC=tqle>-BS=?;V=jZk z`14bB71bxGnyw}kC*TWnLqQvPP9H9ctf9z;30~1KL<7$R6uv=~bK-Cyx+^^Cr@>pv zWdMcOasi3whqm82&N&>Vh2YdUA)x4nVBxeNdx}tD#n>S@=u>^V@_QJi;o(ddrM04V z^a4t>TU%%fHc7NST9As;mPI?qsluyck*oJ6@W!O=JTEk4NEa4IydWjIDpT0@Mkl4N4 z(SXryBhg;PBT5!XMean9AQtwR5WG>3e<;1=3BL8w{^-U8N<<-)!{vrD%Sq-Gc zQNl7rm>Q&m1Rq4w1*TNszmA`lTgUV(PfkX#4iH?Cu!e6OW9TR$c@4}Sga{){c>mZ{ zuZMk5y?PRB|D!%vmNB6Wo_;r&5RMdwderm*dRTzqVeVPZ|JNykbS0=Z$a!))(59Do ztq=SKm@FSH7KXQvdGoc+pPzL$a2FYyA)W3=aLVA6Zw`THeq}EZ<>Z&&QUojZ8`Vwq zvJfi-D{Q)HQ2)o`*9ibNhg|E%9Y=2Rbq;rs;3vU0VZZ}L1lARja#b>VI^WnePUyRK zufPfG{H&K5SuCTrV(9G+64G%KfyJ|!gY$}27gt+8#2U|FcHU3-Dg>vqFF2?VT>kyK zd5A4nlv?MK9)RG-wXqqg_PmGCbsy<4`-aMyq31Q339&r~@N|qFY*1bKj8ef(zHM=10MmUTjQnxJ#LtkZS7n(~QN zOre^l2G%YHrw@YPd;8CTAYeE@BqrK;F8Bn&P=lrLYU)q}c#6Kq5% zp`f?B<$$fvBt*6iNW@toaE(#148BQOaN;w`;%v)F91lrc(J-M^h=MJRK@}r>Jrm+T zdBJc6;$aih@SzXRrnV>{aND$S$1T>EiLN!b@vJtoSRtYszVORG?5KR=rmbyX-QnX7 zgG(6^^CRTR^S`E8d|WpH5~abt%lE7}43)AKd3qno$M+4;;?-J;+XnCPnzBC*uflx2DG}r+Prbwjtpo_5iT>iB!2gxh4%}wwzo7i2}_^*k`qhKpOBHW0&C4#^A&IaGA-nT=<+==Yv2>P zq|%Y45QK=kgaFC+;sL&n3{oh53of-`NN)iURo`!EQJHxJ#C>nMFfT_aV?aC&aupMt z6BqjFhXj$~JZ(nAY<1vTF@V*@p=Ad7i?s;x1=2YYagjO@pDN6-0EB9z@8KKsds%~F zOBT}w*hb|GCz5Z|1d6fD5y~tSVPVUo70JcHYQX;1C>^Y*ONHjk`jqjmPg5*e;e*G<%~SU0m6s|+n<3X<9C0fWPcnZk~n3el)>0$w2LwUs!ml=KnBlcgtX zn4mGH2R(DUXEM-+eF$<|DGhooHL|j^85D-KCWe>v`MgL+5^{km^3jqm(nLUINg_W} zL=?0Uz#BJ|14n+CiIJ&~Kl4d`1uITZH@Kiqia!Z`9CXQtXDUrZs zNmC`e5nI%dX4Nn#x#72$Ft5Hj8ej^P{s>O`KrS+k18%NZ6? z>o{3!$e*fZ?W=g*>!UmxL{}S3ZtHbW8*O;FXbasQMe1izdH7`O_V^ZRCWr zJ~n+^iLP<9(KNPQUbM{#X5Z9g--hVUi&NMFed2v^Yg{hprA2H0>EELN)VaFa+0owd z*Pmn3KK+uFZrZ+!(Y$+Iwu?fGXH6;jIjifzzB41X6I|X5RU(cOg<3y#Z^kyBKSB3+ zx*3^!q%^uuSD}~{-EbYP0Q5FwHg;eCE}D++88m25Z2i4|Q*>4*7Ht>ybMGISo))G) zMzbE0ur4CyUQkDG$!IU8K?`+2H*H4`l}FofZ10?CKc#Y02Wb}vdY`%&8=ph0rUQ)> zq%S_J{hdK4)moRdSf>J8znOAB>1w59Hq`jEkAAJ|)7s!qjR8aCAv$m?NkFefN0&(U zkh6Zj!C3!Zc|VM8t$Ss()jGS^ZfzhquGaNrFfNY8Er9qkA1z%SB{dO+uJPSvB3kOy zTVfJL?U65m%nB)+=fjw^=UAUrIS=~j&`0!Py|@9O5>&-u*tTQDe5^S>d$bgHBnOOQ z2L(dO#_aM@fc?n5&%aT_fzUW$J~naH7E%xTm?R|I=} zx&jyo6(2Pln=wE^m<9EWjg1zdT1!p!W~1TyPZQ@%U;2$x7NAK`O;C}~?3@DIOeQPr z`^hR`lT0}SeQ1+`29us-qy4dycLu`@1{8d0(ITDv zo83{|F>rL+zY{xa-`OWt(N@_$>(|L3{!*2Z2!sY8r9S4sj`%5ql93=uwTjqjt+Hi=Cx z{x1NfKw7`sx{zzQ0<6WiyTpqutzhfYiQF(bJ=0yg*Th{c-4F+X-OPh=34qN5bucCh ztKMf+O3@gJ|MKU!N!C8!BfCfB(266}(prFibpv=rH1=J19IZz3%s?*$@ z1VvEZ7(U)b(9J*~9ckPjqb#%bJ>tlM2?L!2o2VEHod$yd%!LUUiogRoum}vU+>Y?r zIuHk(V4ynf%^CjVsqM`kF1`K{+a!ME=%UaD&KN762@}24F!jrBpb0fDu6IDtIM4^U z+Rr`?Evq!FpQ$1yy}oEU0;v9&EDZV&>ChU9dPDl5L_g>mO}zytm` z&VzT*fi3EJp4qwp=v#fb0wfFTen3V5YGC?tY>PfUN_Vz~r{B3)pSo_{{@L?dydOPKWL1J>Jd9{^;Gj z7zIR6%Y;v$5$%eR>9&2H{R2cIKm#=}o1e)5EZ z@4!q41_}*u0L*Ui-FGh4!0ZSy&I8Tl?}*_D!5o~rjO+zJ-pf916CiA);qZw8@yOa3 zA$47@t_yh-l7sk*p{m_DDkWRDIOAvIvi@2!L_tQXuaI zKG93A^ULrC!2AZw5Ez&c%#5(pK%eY%;0Hf|+C%?xMQ@*j0SS7rRn|aEH4uzEUJj9v z1~mXtKavXy;c^ad3-D9}agb2^m4}co`8Qw(u5K81CH1({Llf31vt*6RX%uz zdQhgrFbHyB0T0jyUb^)T&iIa>7+wz;tzZYBlm?Mt?7;vC$Daw7{*qN?s)30wbBv$| zaq~FMzwKhb{UEaMRDB1o5D(?R3Uct+Y2b2fzYNeE%+DR57MPgv9dPoz(LvgcPte7UA4i^C`Q#+cg*=BIUHWuN1pP#Bo@B5= zgnt>{5TRlaD@QL945;B(peKk5THMjY#>0g=6FhNWo;65or`oM!c zv=peEHylVHj{#dMuoV#!z?7g(Ku92tum(wB15yBMMWzBl6)FuW;<>>^SOo%cswM@x zN>#B2xHMCNHtqD&N*nq%S_?>BDTV<+_(Y&jAW9(@Uqv9{+PcWStECWL9mpC{H{j$@ zfd?kIV1o}vIAMhsE^Zk{&?rp@H5ge&q1AY3O(1LHAdSM=YP*fBKK$e%hdg{?IAxVr zW-QS~UlyWKfpC#7Qo#&@0EQZN-r3`OLH=mPD2Uz=h>{BuumdMuP#8efkOp95T8$a% zDPNZaii0QO27<$0g|e;+Fud9zXc7x7m_(pO7y$Swtwgjp+m8rh2xy@PAbMP~rQl=( zq;b*}->fs(1Sd!)u=mN9sxI4t1bk*Wa>*yBymHGg$9&Luf*D5Y%AnDu^UOyl-B6dO z`=Jp^=%7v^nrm)O(yZ{kw+0$rG;rOZak``FxkJM6r?oQ(n80UY!22hIh_^QEzs7c( z@mxr#)$I^JjN1ckTeKag@4Um858Z!SgC}I-LH-8MrRYW|=M_(0A-sewy?*=e$3K7l z_vgQV|NqC#>7>&LM@2_wQg|Kg{2j~VE#z%bQNh**5{Xp(ZU86P z1%xtiALHT0NGd|19@_AL?G2=NB#_r%c5#9M(9cFCs3Ad^#5gHb3vSMnn*}RKx3}GH zZy3}denLPCyyOih<$E8#j3>XA3=x1=#9|h;xJ52@(TiUMBTfVu9b8!FIR{Lj0wvWQ zz1=QEP-#I?aMBSEI!_@%EMZG7&;dU7v5zCj#7`RWfZ+WlLJU~MKnBUYfjj~NXd8$R zu?Ix$&23v&Y|-_+hc7tFQ6V8g2wv_GmbtWOZ&M@)^uoAGR<_cWuY_eRWjV{kj1f9z zv<@0yX0yO>hf+p#qd?yN@WBw`WNl6xz!H^bpN|-C7&zhsVvaHZH~?lT9#BQOe6#^S zX5cK&qE->zM#&b|h=`gLqA-d1liq>wnFCluSfUlhQ{oCIs-$H;^|?=e_S2vL1n8G+ z`J5l%GAwDF4le=YOYmXxULjf=B-erl-{I#0YT;cnX<@YjMGFnes{tBfxE3aX;8;Hi zocaW!3ard7B25Wr1{Ko2?3I&t=WM9j7$DJ{>|_R7iWUzCLW>b3PKx%V;!Oj(RHio7 zsZWJ!RKGY-f*RCyFcX48|H9BVZZbsEoRL5vaWrHuKm|@22z#W(QGqz}1D#MvP=?}3 zg{V~pBOQn?g!2B@fh@&t3OS_50Fi(e8ZCQCNvBtHdPDT6N0AWlkQ6NRqqVqUNc6nb z)spH^sdm=0p9O7bMLXIpQMIZ#L8zj%8WyesQ?Xb}Kmu-Hi&zZ;12bSIen@}<6$Gqk zMJ?nM{WX9QG-?<(AS{divIw_)fDgzJ2r~E}lLtgIx+}mPPIR)?X_5f00_nsFFycJC z)L?7o+!i{CSV2J0Y6i5GLOJl@mKLaI7}%YF9n=#HHDq8Xm}To`NjqQy7udiDMlfkj zd)k4dR<*HXpaL@BM?NN!g2B`n8qSjd40OOGGiXF^S0$23KxB`589;Scf>aw}R{wPB0GViAadho5{sK z3l2l#u!kdZSAvkDUfcAh1ME=B3kNurRZMW2)x2glx7p48TQGwi{NM%l5^=LD(3Bra zka+AtCK15^9EL$h{8XhCG#C<1Rv zKp5c_BEi8LWR9;Mfb}*#Geo_YR0t(jkZ5kzA&J32g9IXy01`AJ9%P2!vR16rHy7L3 z$3}LtmCdC%Lx&Em!z!d8Y#d~;0EI{hTr?f_pzHDZ8``1G1kzwV+j(i?it+S4~Mu^ z|2^@34`kwDxwt?m4)BPldEf+BW5*Fgix5=rZle@=%2mGdR&G4wQh2#SGVXGYvs}T> z0eQ}|I>=1}Yt}FHp-S2;24%1o(hv!SH{SA>$Gl?%@AR@;eC>kI{67645F{M_p$LyD z!VwlY`p~!D^{EQ#bXUF%y2Y&E>F9jb|Jom>(e)6N9c)_?F z?YDQn@>{M89|+(2*Y~{-bYXljwVn2}Ul{lYBmT%RU;5`qzroG_{mw^!@a|7P7x(Q4 z9{>US_iqjmeBcN2%bezz@xH$Zz{dbR(C9z*1Hb`{zXfDKH(Ngee7erFy#j1N{)xZ~ z{J-YQK+8}-wL8GWP&)SGzQh>755zcqOF$E>z!hXc&w9WU#6a?sz!vPE7_`9-^g#Hd z3>-8(71Y3|gFzn*LjM~{M0Cu>cZA0-@fK;M$9lBKd&I|l)W?0~M`(zZYW}oFRkX!$OvMTOLp&5j zgDk~vjKyqp$WmO#a@51wV?Ib^#fWT2GGx1iJji(T$d5b@dMF2L=*N;Y$&*CMlvGK3 zw1#r1Lw*X#akR)-^hAMdMDSC?K+MF7Q@{?~!fVV(Q!K=wY{;SeB%d|bcR)*)da<|6wJE}#nrUT$V5yc zOwH6h%L2?y*1Ss3^v%u`O{fgcE^^1We9hCm&B@Ho+6>3Cq{;(a%MGMW&16N}L`~K- z$8uaqrIgLz^v>^OO7KL$rDDuh#KyynOY7{(=tR%mgiV<&$n0!Cie%5pv`*Zl%RJ0a zx1>(&6wm*R%Hae_0o@{QG|%&NOv+Tw(i}^h)KAG&NK}N+{;W@hEY0LpPX?vVjpR)N z1<(&|K@W{b5yhfPyi5drPX!gjgPhN=B+80R%jgWl`?6l z(ICx55`9M^1)vzDNq5vnHM~uB1k9RK(i2tw%SGf-!emkvwNKIN&U`B)t^fxRHW0>m*mt_ zg-1|@Lsi8eQ9VwvYg11})mc45Ry9LgO}Z-dws@ciYjA^o;nh!+3||FS!9ciHs62o? zQ(9$KK$X?s#MSzlxN_hGKF|X`*aT~!xR9s{ddP&m5CL0o)5`eP0SH$HY9XAs3J}t# zWo_1Xjl^hGLU|<}ej5fi(6x+kfE)hUK7QlYV4#O!cmW1LgKijC!>3xOqA zx?(L6!-;s9gmRdk6+nhz@Pu|1R(SQ;5PeqPq}S2eH%|bN0iXaDr~ww(u>t4+N$}Su z!BoX)Eyo}<<*9%fUeJck=z%dZ; zgnj$hQALcJZH$}62}f7~1pt8&NP!D@fEn0WqD9-ZEf}O_LAJddXdx0vpg6UvFMYdO zdVmBypoEG0ggDq4H^>Cf$=m9%21STGG=Kzd%LP7IAq$WL6`?e-(p!Znhe$|+8n^*P z@C&Z}30Dx62QW3Y72VM-6#loZK+~-pO2B|%aXCeB08g=7nWYD=;I~#_0VtCQ6ZkGu zdWe|-i-NebjNmMDx(Kx32#Hk)TW|vmm;em$fCm5pIv_XFrQYi864Yft?46vf`KzC> zhDDg%5d$zOFxdg{fH?33QqY5s86LHc6i?ZpNeK+Q z2$fOEU{v{Eps)j7V2LV`%whQr*siZ1EC z<>{b0cH~FCVpo;qNv7mVw&Y93SF+diU*)D3JbMEzMe#0uW<6@IYM4Y zcI8(#3{95hS*GP$w&h#4LZ%ul3@Dtiumv=z0Rj?VC&8Ctn&1&8wmlOFRE9Mv7$$Z# zCI)z8Sf=J`Hd9>2=4{sHZRTba<)>**sjP~iD25K@H1~fQ}tVnhV00e?8&C=%C_vw#_Y`2?9Jxv&i3rj z2JQaP7VXg{?b0^w(?;#oR_)bh?bdef*M{xbmhD9CO3kS4L!Is1)@@w0Mb~U#O?*S# z-tFNgZsmJb-{wH*1a2zr*y48X=Wad56z;{C?uSg$>W1#@*6vJ&Q5&Vb(t)JUofJXvHt+eSZ-?W-`kc~Je8oFe@0rC@EUxbW7jXOTKm4B2 zIR!%gu1*7$(gAny2Y7b@D3lXL!I#a+)zgaaPI6#>-O*z zSMf9haUU&J^WN^&G8{8as!ia7hlsR1^#j_ z?b0H5@+S|i`+iX-$I$S+aOO-=DA)2We=0~ca4cWV92N2z-%l<#^D`&UQf1B{_wg9N z@)K`LG?()^m!)B71y#WFJlFF*=kq@I^FIglJ(q$&C-g!$^g~DVL|61hXY@vQ^hbyE zNSE|Ur}Rp<^h?L|OxN^H=k!kZ^gwTgB%EjbC-!3B^diRfI?nT4VD@Hr_GgFoXqWbBr}k>M z_G`!XY}fW}=k{**_HPIGa2NM+C--tU_j5=0bXWIvXZLn@_jiZ)ZO`*${&(eNkN11W z_k7p)edqUn_xFDX_<$GqfhYKazxH{j_eZvOgJ<}Lcld{g_=uPIiKqCAw|I0%_=Hz> zJiqvk_xO(o`H&a+ktg|**Y}Lq_&Hv9lV|ysclnox`IwjanJ0IYPx&fdd79Vxo#*+U z_xYa(dU&__o1fvF5Bj4=`lMI-rDyt)A9|vXVWV&Qsi*p?xB9EcdU1bxs9#{I&-$+i z`>+@LvETWv=X&e)da_shwP*XbcYA?1`?IIsw14}$xBI)t`@F~YxR?9UrF*>x{JKEPXhxqK@ z{!d^52DkxNSocgQfe>hf@wfl`AAIUJ|5HW(hgbi22M9_VBrM8h@F2p33KueL=GCDam@;S5tZDNm&YU`T^6csJ zC(ximhY~Gn^eED#N|!Qi>hvj8qAFFPtcvi?0280A<`Vu$kSo}*V#ks#YxXSKv})I; zof`Em+_-Y*(yeRvF5bL)_wwx;H803fB%{1K|u$VM#&2ZxVHf#1_|U|c`i7&A%`7$_#ucP ziU^Wh+?jYHiYcnNB8x4$sF!ycfky)fDbV3a9R48;z|8%Fo;2JsL2O{EersHeYuoYV0Z_)`T=JL(UJxNw6-~b1uJlZ zkRlZffW|>yHCQOL(Mmflwbic0lBAGoyDhifdiyQ7d1Xr}eYGAW$O8kg;7USm3^2m6 zx#+>bstCjC*kOx3Hc>~vbm1K^r5bZf zav-1|OY_1l1y)hlRJ0UkWAy=+!ud@{2?MzBv{q6Nz_t`ulf5|OjXVB0%Kehz56ct z_$^BMg1@!37DuN4Km0>|6YO>+F8te4tyX4 zBPhWMQm}%GLSN$4r@82bjs+taz#Ci=Iu&HAC46u|^XQhny!|h9X|Tmh(3L{GxnzOc z+rR?^VZj~pu!lbUArONYL<|nkCB=KmycY1b0lFkv184y!SVD_DC`$&dNZ{p?<$yGl za1rEr!4*|lI0YWgc%LxA0ANr;A+oWJZhRvg<0!{)5mAHei=Grb@j=nOqz>s)00wYa zo)nZ0i~nPZ9|tgj6}bLj0}@I>6cbp(GPcB3<{8`^GpWfIKvzW#_<}e{vsx`vI z7Mq|1D}v%oXd<(k*1RS*v#HG>_Um)o{3bZVDb8_{vx4rLTRGFI&ULc0o$kb%9{Kpr zdD63<_Pi%P`!cUo=Chyv{3k#IDo_!UYJLMfC_)pe(1jY4H-lj)L?bHEiBhzp7QHA& zGpf;zaCq)lQeOk*n3nX1&KCQZssX{ytm^0cSO z%xP1A>eHbTwf?9^^`TIglGLLzwW&^hDxwZj(wr)!B}t`fRb66IslH?(U3G|683NU@ zlC`X6l}<*&Y7m%gwIN#NDpx1vR<+J`u4la~Uh}F~q-aF0YkjL!AwpNb(p9W}1*={6 zs@TOcwy}Wy>r~?!*^j;Su$C?CW#fufxNi1imvt;?Ln~Uc0=2T4m8?x6JJ`q)mbG8~ zYiZl6+R@Uswzi$AWIwywm&(?&k3FqtuL|4Tx^}6zJuY&Si&5eV^`^bmtxRNlSg^YG zx7AfHcC)Kpg)+ChkWKAyXB!jgPPVSz4K8uFtKRjpSD0a(3Vh=$-}%zFzV?;Wee@|@v$(}Bo-a!_oZ%TekRHQm#f$G7;vDn1$3Ffskb^AbArraC z3vR_Q=t1KplaC%welnD!EafRvxyn|)GM2NfWtPeS*v39KvSS_WWiKw-&VDwuqb==e!~#2Y>js8ZPmPQ@rA)hB(F>W$}%3yyG4xbH+oisE?Dp}GHD)WN=Vu^02~Zh!te-1VGx zwf~&$ZI3(N^RD+Y&zvTSF8IL{-pYOV`_2JB%)&Fi@q#}*;$f(GVLHC@mM^tiqb+4JP}iKjj8bFcfB*govL z|2^sB2i!mxFCl*l%pZ&wFaQnRSjr@bzzJNKi?qTCh`=Pc zp8_u6Jb8i$lm`W{Kn<_}kqkfwFcC}OpZP&WBusz@L=&R0f(J}MB>pg<37+6Mk%GQh z03MV>OO%5mbik|>k`!oQRCM46CW;7>APV-N4_Z?^+yJpaLQHsqzO;b&)nNIt1SIHz z`?SO-#6bzP6{8i!2?);9O!`)&V)5A0vdSXA|xUH zNFfzkp-k9<9du!tz#+Ei0V8xnJY+%|xB)V}U?ikL4cveotluyUf*e@D1GE7e65$U{ zA|-MXC15}TxQt9Ff&)N+&nRL3vBV7Ej7ziv3nT!Bm_R4E#3;4_CFqNLw1E9dK?h<8 zDHh=ay2l4#poN`cDz2hS1j7v|NO^n!Be(?qk-`h0Vkk-h{v&{jd!UDmiJ&dcKqX!y zHog&lfB*r$#2Tg{C~jaYwuA#hO&oXvDd@omfdCDT;thy^3Jd}(IKnbQiTLHh7?$A~ zg5ygJ!wRI)6}7?*BmfAI0y#dQ2b^O%t|JZV!apiN3*3Pouz?2*zyt6>OORg)fQJKY zzzb{`A3Q(;#3L(g0vlL>JxakMHsT{jVm7`cO!iR3z`zySgbhl;I7&efmWpqwWW=n1 zjE&+4ut6B=q#GoFC$XCbq;5mS9ZQrCmn;5HkE@&g8^R=A=_vKmyW|1@ItF z&Pq47g1&?hODrW#bYKY3f=diS2f)CF{bgXf#3T%63DSa&?4?U^!UiM&0x4kv*uhKS z2T;NU94w&}%;jCaCTxmNFg%H8-b7#CA|DKZ3dmS6KFRuwVhzNEJ1V6IGG$EI0$Zj5 zZ@xrs?j}sk<|xsk1YE!qvP3s9f*#N%`9Y;i!~+a~P)u}S21Jr;#-@3m=k9catiTRm zvSv=Y3ksm2e4?Qp=*wQ_?bYuCr)tR4LpDX$N@`aDNWYIAS8f`(!@>1m8!S^yK;*)L`(v(z$QFjJamE$w1*1JVmKbFXYPRm zOu!w4VLSkWuChV(HR`c~sVaCtTNWiu_#>3?Cb2dnzzQtE8tecdEEA$63`kx%3<65l zKoWi{^hL}FxX&;Qd4va)#u2WIzX`i?;Hs$@=O; ziU19$K)O7D9@J!4ng^KD{w&?r?TJ7L*;?cZK*E;xs_>w|eFXXZ@+PnHE-&*ouk$`H z^hU4rPA~OVuk~Ip_GYj4ZZG$CulIg0_=d0e&MK5iL6nUz`lhe9Oj%5n@A;}P{Kjvh zT-i&wZ}}?4{k};4$}j)sX_mRf{x(Gbv&aDVuK}Z{l(j?xvqS;o?~~2%10S#iBX9w~ z@BKzF057ltJDK_ZYH*d!1pBtH2G{QhcW?-s@cw@A1h24NHZTe^a0Fv83Xd?B!SD%_ z@D0!K`))9mWpD@^o({_}3lH%%y6^?ZFbCVP3I}llFR>4E@DA6o68G>F+ppm{F%f6+ z54tc+9I=wk@DqP=6z4A&lQ9y@umz*B7h~`azpxT(F&tAO7kBX)zcCJru@IYa63avi zKkxus@fSa_9rJJ?6Y?O(F(RAb9N)1GAF>?_aU(nO9T&17Gx8swaUoYQCMPl{GvFdu zGA08tB%81y(*zY)aStzYAOEi#cd{$9-zPtE5^Gr`<8UdPG8NOZDyuOo$MP%x^6VM$ zCX;e2gYf!~)OpE+6wJ`!X;`^Xj!RDA#c@%Q7X`avAfol3g+sL-HEiG9AzI zC`+?B%ifI{nL4jCJGZktzcW0?vpl;PlAUu=4TF&F*gWquKligg|1&@bG?2xtJ?j*X z2{b|{v_da5LpQWT2U&v_^i0Kw$5gaMUo=K%v_=QYp-8k&QS?TKv`CLMNtd)q8wzxI z^hc}2Nw>61zcft8bVYZxO3M^T%QQ~sv`+6dPZtMG*ECGsbWaa8Q5UsQA9Y3iG*GXU zP$RWdKQ&ZG^-C-DQm0f?OEp$!wN`I6wNQ0cpVU=zwOEfeS(mkPc=cC@R9KreTer1a zzy5Vepmkb*)LO%}UEeic=k-F!^;~yUUF$Vq2ex2yHDCAjM*a0*C$?fQHcuC}VP_O# zGqz+;Hf4vjV?XvqMRsLxHfMKsSEn>)t2Ik|Hffi(X-msxhc-oN_G!1aYri&Iq_%2H z6l=q_ZQnL-pM-4BHbm8SZvQrL2e(D+Hg7MKZwohaC%1Cv0&y32LLK*VN4Ippc5^%T zK|%L)XSa55c6D2~KwK!Nvor?+~$b$Oe&KcV+}$G3cIb$h#aKEd~V z=eK?vb$#3SJ>mC$2e^RCbbtGIJ&ntNC%A$~HOLsaMIrctN4SLdbb~v%gLY5 zxR3uhkO#St4>^$+xse|^k|(*6FFBJpxsyLRlt;OgPdSxWxs_izmS?$^Z#kEDxtD)A zn1{KTk2#r_xtX6ilE2qOuQ{8yxtqT^oIkXMp}7RfSe)NEp69uq?>V2BSd7tm1lia@ z_c@^#x}hIBqVqYDWiz0U&*eQjq(fb!KTxDsx~13Lq}SM`Z#t)cT&9~(r-!Tdd1^t>?O~AKk6r*{=UOuoqkYulsti7rU|F z+OU7mu`fHbvs$uyPqRn6w13*Och9t6JGM(&wJ%z>ce}R}+P3@7w~sry^I5p}PPwPM zy3g9VZ`!)QJG}E{2iS3EaT$^1RXS5Mwq4G?0n|9OF`S;F=!2 z)GNv$Fu)=G#0_+SCPu4M#K8lc00oK_`5GoPfZ#x;@}?2WZkusLnm(hUuHW#ohBnIRpX;BmfC~zzUQhvjo27 zYsYG?z$y(H#D`gCYR`czK_c#snwKDFpxm&|kjuONYeXLAV;LOVmAa^57_9NDktl zC#(T6PJj+|=ORF(c_;wUduba;0yO4~22vx2SYsL(=Ilh$OMF6|T!00D00Wo+ApGw0 z|35%T5jc=wL4yYoCM@^}!Uj&mRt$hsFwz7MtPED15dKLDBt0kwz|f;-&@d?#J)p6` zW|OBl83tH@L~xIT0Up@sxwAsS02R6h&KOVw!~hB%;z$8BAVsiYgXCCv&}QV!Nfr|1 zDF|`Ejd%v*!AYQEQiwQtCXleDkZoJHZ{fz3JC|-m~msrk0D2vJehK3%XZNWc+pJ?oB=CL4n&EO;)IPs2ec^-A;l(wo{DZ3Na@1R z&;l1(NR67oh)G`sE^R81m50*_GKoS6n&Py@PRMSm4?bOpxK@BxcPBM6)5rQ~*lF&T=6iq+W{Bu=LKshST z)PoFNw9g5ds?gC34T3K#9F^Nr)MJtUO;*`unQhkDXQ4&WGX*l}z}gNrut_#nf5dQC zf$-atqgFl`fRBT6A;H`SW395+D={SKK+s6#Fxq?Z%~#)j`R&)=f78r$fPo1n*wTuK zH0X{2_*_)hR>6H0nTU)fh@s=Y4es4vArZz%&db}GxL*}4) zO^OHW2>=0Zm>Wot0LV55071ftXLa?sU{o03f-Fffb_uqj>QBqD2;wlZ`T4|xD0Th^_6^-JhWCfc*w+Q0q zup9=C4G4B%1|$h`y-_L3(E|k4X(wo5dxLM^{rBOIU;gKpB!H|YEwBZeL*utmi0em_1;SYfrL?I55h($Ew5s{cgB`%SP zO?2WDOGXbV(!(%Qr2Zllv6w|IZjp<5v0`DYc*Vecv5RFi;~CMoJ2Kv7iUnEYV95AJ zyM&R7QcU9=@t8+Fj*O0YX(K`8c$h%ag^q*V;~^25NJU<%k8HFfApfWsL&l|$lU(E_ zF_}qCny8R&jO0MRSjjrJv5^Mpq$fvdM^RStAd@WRCSe&%Svq;l&&>|-GtS;4h-R_pRkxlJtfg3Hr_LjKC zHSTf#k(*rQE|-OR%}H?sc)7UF~j{yWREfcflK8@s5|gu+#PLv#Psa0S}nK1vc=35u9KJFPOm%cJPBC z9Nzx^m%_>laD*|OVGVDX!yWeUhd~@-5zBYN6*h6GE<9otub9OxcJYg09Ag;^xWp&6 zF{e^IV;%39$36D(kAWQI_SX2uMZQ#yg`8w1FPX_rcJh<+OJpNYxlKrh@|CfiWi4-+ z%P*EPmBEZAD|ea9Wj6Df(VXV>emTr-meH8i9A`Ptna*`iGMn9;=N7@)&VBatp8@_I zXa?h1&xJ-2p9P(0MK7Asjh1j=4ISw{2iDP*w)CYj4QN73n$zn+bf!TaYEh5c$D8i- zsm=3gQm>lTt#&nrO^s?ce#2*6k=IB?LRNO+2yXxvqxO)V`o?0$QE~g+s)*7 z`+3;!wllfSoo~pXTg2W5cXs_9ZhPN1;7l%fpSeBoI^$d44POkuwc80wd;-I_Rskz? z?Guc*A`_XQ#e!|I2})o*7aaF^pe;^vY>Qmwzt(tBqZ`TuhPy-tF;0f-2 zf(|R#zy?O327zn06^nqw4dfsRTX5ItL>DmAonGL&`xx&}mv7Y9e)BjpeCLH1OwY0V zbGvu95g{l+CbFA}5`>@;@uj)Vv3q%_Cq3{7?)&DYuHVK#-n*Z80Rjp(Fc3r{yREpv z@&=}W8>k|?e5g(86`+Q#UpEgFNIeN8v0cp*`11rFK97qZ-;@h}&V)Do^ZSDM>nc9H zfX^-^HXwmT#Mk=R?SA(YTzv5Bcl^}0f$7jd30r)k4m1M+-D~fdPtKeV z`aBRXq|dsj54_3``?N2<;^5`5D+MnO^g7SL#Eq2l?*; z5FibZoe>4zqF9=n$GXw zixWnm<~EQ6bM6DxurNX}7pSil_Mir2;06?7_c*~0(%=Cq;0@@24jw@j^56|B-~rO0 z4;8_>6u}R3!4@C^4P>AO?ttR1ixx705;_69j1CQ`O*u6F(FI#?5gd^Q;(!Xdixc92 z24nyY7NHeN@f2l14JH8*>EIA^AqM|#64XEjWB?9Gk?lZH21KzJv8xsM;0ET94_MK< z?l2Gcun!-h7AYYUSdkAHAoLbd+O7+2Oh6K?s})#a06LKs;%4!3;ouyh0#0xR5#R|i zkrS`$4)cKaaPbB%@wz7A4RlcrAYuQs%M?)&7G;qZiw_=Efe}OT4wA9t;&2WZfgi8y z6Yf9`RdM%<&K;G}4&u=ufe|6E3l8P*1{(6ZB7qLK3@Qh6IcNC2!;aWVE?M}D&MgTF>fr*&=cd24``-f6rcvU(YijN24HVsJOB`~ zix$}60oZc(eoicHaT3sAE+rrjs7)<#&n>ZQ5{jZ=Jb)24Zz`wlKu+-B5)bHHAtK%& z3kLuNNZ}fR&iiCA7rqd?Y>)yf&n(L_>L%g!20-bghbsvN`0g?<_fi%55-xGF9FuM} zVRHaJ;2E2;U=RQ*z3=v7lPHyuEQ4}4Z=g4SGZ%uBV1|^U|FuTYQ9CdR8Ro9-t12ZvI*mMOi=rY(PiWGw-(Z1}Y#8 zBH-d85+XM~{hBG0p%QIM@*J@xWw96B2M+|czM2S);YXAWh00T%*FKp;SN#&^=6>gG64h-;08Rw z79t@cQs6E5bU8QRQZsc^JM~jTbyQ1r08Vug>y#a_OAi>}2z4_9{xncY??sKmNGU-N zN_9zd)KPiVM}d@5{mxP`RZ}^206Y~`MU_-dHQ1~R2DH;Y@6$o_b6xd9UDxa9JU|Gi z^-O8C^Gt9&r*8m8VD+$z6Cxr5f=@vm^twiqU{!EC1+M=>LJF{p4-}B-+`tISvKDm& z0(Em?v1<@Mpj?79TP5HDOn~+5v0Uc#2Ql`#92V#v!2(3IJ5f-~1fh0+>4jy0w z_+bAgVFeJtc{DWp@b$X>R@OAF>qQZO2AGf*;y?l}0AEKCyTow-)L;b<7U>Xx5V_G7 z&Tk5_OA5?Y1sL{XVIXX+OJg|}TQ`pZL_lPl)BzAc1Xy%hjWrjjaS6w=2dTC`byIEG zmPFkaZdvzRktqORlR=h1K{tvGND|ic0_+R9rINJnDn|Nfo86AyUg_l zv@3W)Q|U5e1WYm)BKF^k?K62d1MoH%f;D;NfB`T!22(@3(8dGc?|74UdBY9q)Mi*W zpasH~2CoYeBI5pLb;AShVD~x{cdzSSud6dE00Ax_0~}xhXkhI~0VK%L4V{;Gm$NGz za%D&Ny3R2jr&qhG_j)xqd$H>>O$SY}YjzREx)w%nbAb&uKzOf#`u;vQli_e9MIZq1kv}Oik5;6dcz0Crk zqaa)X5a=LE&X{NfB0F6`Ao>nBB)~Kc0_oh?jBm$|r9h3rSWFQB4VJhdsyHD$K`!xk z12CW`M*iT9r2y%)&mgW?3T(kJZ*~I!0=V}ee(nYY8IA84m-AQ(_V|+fcyBtynS&XX2SN**IG)u?@w_>g`54@+ z7-+E=91$V~xA7oW)`%Cv0tA|j@frINKr3ds>E1vJ7N(mO0-+VUAgZmL&$*FTSpqUy zq7MS^8d?f$Zvo>#{TR875yBHdVg+7CkJG>bmQ)~YFp~>Hjb*w-B_IxvnUfoDKno!_qkkGmb=m3exu}i$pZD36Z6OZyvI1P-4%Q~9 z33{lf+8_?ZstJOg1;P_>IcHSiP;v&H@mYO*b4HW84{s-rotmPd+MIV8uBloI%K8&d zS(>GwPQh885nHR!dY{YLuk%@^2V$`cVqwghAmG`uH7=tMdIOHFqnnOL7G??A0{c3< zo-MksF`A4wnzIGLv)$R8<6s1A0z$r$s1rgC*72DK!WOV*PNiUzGkPe^cmxojX+#49 z&Qu^IJF4s8oip3EoB5N^Zn~#CDM-7uO*^V1$FY5R04iI#Ut0<|K@C8lCnOjC5HMSd zp}U#CTM8r_ZJtmH2)CNYTCN=+1E@Q{t>d~8qA#_(zS&!_uR4{qPKmk5l#SOw--w$AS_(7 zsag#NfXUgS#Sh}d{~O1vTEHKil)Y6@TYbRBnS_Mk1b26LYfBp-P~6?!9ZGR`D^Q9Q zw?c7>7IzC;v^W%ZC~cuYx_s~Kw{o?!zj-DznaNFN&c!+Z^GH3kn1oWwkJda9JEwms zAaB*^OVylvSz)UQ!z2kY5MjhnzeeAbTc?%V2VCvwdhx}~r~*H5#*MRYeKr3pbz7ei zxZ9AP-8UW=1yUnwr)Lf-9(m^IR5*qi?k?nKv))PnG7KV0KPF%@CtD(_9@ue5{l27h z9yff>D34IIZ@y}&@{W3@ud{nnWDc8AsQq?v_U}N0-yB_GA=hL7=Z}bVckZ1Nz)6Fp23zT`36UC>R%{Z z&*xhyMGIVmfHEZB&)nse;;i@FwG~3cd+64H^S$$Bg^0Oz%YOetNO!l#eHmsyRd&CW z@ivu?dFov+FwF>SMs8;y5S=u1Lt}MAXY~Vt9hTLJ0hv_oI6cJ8!|;0i8dpg7+F;E{t_gFFiDubZ-9IC_>T9 z5*T7&f-cO><3f@lPkscju>(sl8+9pBq6cFseADJ>ribGDuUmCqIKHR9U7hYBQT=#9 zHt97Sh^bAl*(}n0o@_!7hKHYjrOvbYOT=&XQ!?64={c4RF7 zER{zB`~8}Q6)|8DiD4K4@vlefM=GVl3L_wHscE&46{q0`!Y}i{3FB*?9(rd=R5_%d z^xXVvu5e6^&d%#2k#5hg&p{_=sOi4dbS)7KuaB)FRy@6QYaRFJK*pr>Ff^Sq@~8AT zWjGp{!ZJK=8!k&iU8*7LJ{t|>GsK+$TRvHYn$SHx2|z;tGPGCOo0%{a*DYrcJu0s)Ef2UDG(53`5s3n@m*-2@7LLL#mXC>#X1i)c@+u5a29+3WjE z=z+x!qTdZW&X@URkb`)aUT+pkzpRmlNS5a0DDx0tr}`u(B1hJXPV#0KKmTL_H6kSey(~rM}zU?FwMk!h2t?usHW^O zL~54kF-+;UMx0fx{tZ)8p7Y2#twZqF6>9~l4U#pzK3p4_?R%p$&PB9<$%2rUMKXCm z;9yK>`+XUi_L2AesmWAuO3afzLH(0eyt+}WQl*>@+NZ_4*a@+-W% z%pKl012Kd;cm}(aR(N6uW;TRt(iBSJz_E`7$^OTcbyNN)wLPjFoeCtiZ28dx=PYNg zC+8&boQ|hr=l%FemdCXy9#$6D zg71t3|7r6cA281TJ~-~EYRb-*N8q|UQCDlL;b^t?{b9W9mdC_&^>zr@ho9? zMrOK!8PMSDq%f@NLI_`MAC6UrWRNnh1QN{?&tu!qDQ=TH6ua9 ztqdz^YMjG&M$*Q^m%NPpiL#g_?)nTdkD-ZAqB)uJ*^wC@Owjc@6Br)7L0n9Bcx($a&SnMqwJ z6ts^CBddgM=?LORHCZ*YUs}@(7PL*EEO)-deAgZqiNKt4kN3)T_1a><1R;gPzog5* zpclAXp0IDh|2R_0dOt6r6sX$xAvt~X`KrTo;G$5v%dQ=4{quAX9&yUWdls3mzEghP zX&(*;*&z3r>VBL}MQD5MOk9;3(P>_#%sihJ@S(_sL!?5MO{#>7!EqF?)yzD|{L^YMK87q42nUq?!^oEoM3Bq>rNjz+7LT3`E{ ztA8t38euw3y;@u-3N>-G+QZUpKq>lsNv}EOKzlyh!Rg&-zs_a4_jz%0N~E$tmP^x$ zLcP;x;gc;(rG`<*V)wpqr4vtuu55tON?J=*UeKZ3Tc?$rzi*lf-#B}$KQl&hzWqAk za?UH+v2tiAln)Bx(J4W$oY<0OCi6JDDUB{3*^-u%HS;(MjU&&ed^#Lh%9P5pjg$5> zx(-y_9BWPtH}U@DOr6z*{OeE?l|=g0}; zKBSECn@x1RLD_$bmsj%tmR{Rb#+P)Y?BqX}d)`$33int&!GFG#xB0VL(y?}x|3bBE zbCntHi9XVQv8h(10?H`)`ow>Uib_t(8TZs2J79T`x254-kTVB;!1oE)mc{~}%Du zzZa6b&fMPJukq#mMs+SVpNHT-Y+?U9>f#H|ih1|2%N25m_2kIyns_)=3i&%1(*4U! z`SH{#%XgJSdI3GrY0DFXxe1wR7gjj5ZL`B5&(Fn=Ih*ubqQtXj3 z@{zLkk*{MT6)GZ?Mk7@YBh@gXG}xoG#7VAZFay=0{xHl%c$CRul-a0EHXO8J0StrT zo5w~wR79i5b}<>Yf$qH+Ugi{d^-w4Kn76SpJ61$=Fu`x4Xk=+leouSd^05^WI9&Vy zA$o!|7>K@}5l7>{HYs;BA6P7S7R$#SO(X?9RUPka02;C7)K>`2IYiHPk49Kve;kd= z*N?5kNN6A@9Vi6FRS+k_sF6hgF&GYE5w;lY>D>k}u@{!g52WqIiZBNvQvuv5PJMvH zjVoX(eZqo$(h@nzho8WlP~t#-a@t;We|IQPJsnpeHn<48xdOoB4)w1`2S~?&EfQ%{ zps-7zdm+>-1%$~D;B-$$E5eSo2Rhedj#Yp#&4GpCN!Vj4xEzqQ`b1K9sIfeXxP~5t z21D!0A|OoxoH0PI)FntSW6=n31l$=2EfYxrAm__CGy?oke&7xv6cYeilZWl~qGQs7 zG7nQEkKX&XVUWStd1o+)6<{9jX^esZ7Wd@bdLX7b^qEB}+6+3HMPi(NI`0^I=piRV zFCc>c1APi0^zyxpL&jTs+)y~^K^#B|fD%*S^P5Wy6hlLMUk3Jmc-DZ9Ru3AbhYXJb zYAkukE&)lGnS__X%-fh^uZ*OlEYk{X??PHMbu?pg9OxCg!YuluxCpU!wT{ ztUd1INdu6kH+S-T?iZn)S&lqJ1vU#jTN9q3olWe<4`8duMtDHi@A8Iyfe;~Bbs?>_ z1P10--rQ0C1xKWp`ct7;JoqZ6-avwDCL1h(L8A`BZN$Ja2SzgxtY3oSe53W^sGrSZ z;H&5VPbF^(P^=#|(EHR%mT~#Hi0U{z2NU#M2qzYU;vE2p2csp4kL3g8E+}Lha6pm( zKr@FAL@59UesRr|)^xFGjP#O|Sq) z%%ru@XJRVALbsm&HrkB_o^O334?MNxJBXeh6ZKghi@TndjT4e$4#ew4&!fPk3H>1F zSpL>AB%wYLzZWD-pMhzPCP$I-MhZw13VgT)bSl8E0MO-B0Qn5Cv=|g5{4QNRAl{x}T19e;mVq#n;`B*ZnK6d&H^- z1_XVD#ZPk9Llf#TtLm|l^|&YX_}Hih0~X(=f$K|# zjT_j*jVa*^2X^Q$Rst3zjMRvj-{}iCS0hh?8)rhJ#B)jB6Q6tA#=pP6pnf-sR5i*v zHPsF@3SfWnZ*9^9xC?bOyyj}ws*(^>B4)#GzSwV4NNCpWXy!&X-Hd6VwZx${ zSyeSV-ZwktG+S`BINrM|V7J;iwZ6Rsx za<#GCH$`KAO-&GB%V~42B1%4Kb-Qm%Lw?P>=g*>QeLdS2MAaUW^EE%A{j(E`H+D-X zcDpNft5-mKz)5>!ReNhfM{>!hOxyR(n0b3mzcYSH!Ueb|6{Clc8?dD1zJ z-8IYA)o)urdLPp9yz6^a*DA7W{iJKtsdLdOEG=4p&#C($q5G(+`vlp2cG7);-E+m& z^HZtkms8K5gr2*qo_l1^qfvJnYd5}pH%h4&;@k^O?0srf#-8ZKJ?+KE=_9D_22l4x z#d`@8`zWgWs3!VoPW$L^`Wd+UZ4rGW4M{NoW9csf zGCIeKxW`MB$8pxi@~iy|jmN7d#%oT;&jQ9PsQoJ+#+#jyt%1k}Ze-?bWZNmS2WKL) z8riYt+eJMwk~lFII5MC-5n(qmjx#ySJ*hJ>F`4-G$=&w7dUCaTV8MCPC1!Gsd+LYs z6y53MW~a}#@zlx0)LCxtLE@BI`P8}c^e^Y>pV-q^+;5(?c^^-w{~7DvRZpvrOaokI zptv(2$r))q)C|Vi4F2R4R@aQ+YkHW=EZO4>L}0d9ZQkfHRnG;Kzlcq z(&W6#*}NL=f(Flmmdb*T%Yt6gfQmCE8%v4&mJqC?H1)8wMd z*`gcnk_XR{m&(!`m!-E!OMbYoQqa4D&Xz)Om&16L=MtR!lU~n>F2~g@CrmCUoh>)9 zx>3ep~_po)>dam!Feuf>$p5-$Hb3QQd42z1${9mL^W# z#&q3gOW&s9-J)`prsdta$K9b5-eIHNWZ~UrpV~R9*`b`@5qP=5moFvg`s2IG50T&> z&!^TTx~19ySUH85GOD|>uDh>IcXI$({|x3u@M_sGv@nt$@>nq`wsaoh^bu*yn{=0EE&^%C)b0w$@?|@yM?fWAXgXZ zTFimag9z7y0sdXlql36}dxYv?QtdvX_AqtIKJonU10HUQslehEIztNdyFbaQV=YPx zuco&qjdnHN^(ZO%NZtasbPB5ubzHQ;oK2t3m?EqfmJ5u`M}ud4GF_?2KaS`=e(mvL zBNf1^US&^!^FKYMfL!C$69ob&O^U>8g)=*$vxR(;j*S!5|4L24$0s(pr+vW(1Fpow z7(jk?G!Zx&V?CXIrRZ!jaSmnU!D`wQc~Gxe~1B6!jd)pHrw^T_0LSq)TOX(6Gq z#07Nr>~+J%t!siU(Usxsh1%5xknhsU7qC>07jQM zPDCLTERE@3n37ZsO}so!DTFo`{Uor!jdw?*z$!}!MNeP8mQOt?ZHsdVjejhLdd7jO z#-LyMf2#BSI-SE!g#FZ1$4gPav9HJYL5ZKeg`RE?ZJmNi@<9~M&>ZW93eF0Sl@FA+s`iJMs5y%|0hpdfkJKqz`2s)F)OA=Z%uj6@BV zlMSN0i_wvQb@5?-J-kgC#t>h%V&%PG0XEOpqmBN3 zCmu`_JdAB^(c1^aG~9I*qL<~@rG+u(GN>y`h~u+z!iAiNL*q$hlbH>^?JA^m=+s(& z|F)-;C15jEYB0C2k}L7%eE0j@fm)$d6dsG={Gmpv!UtZPmH8tj6^$a5GQ)*qooek8 zM?(sSaHuX56W-HJ#rs$w?T#;FncW}&md|ZimC8RvEs1h}DelYEP@Nvl@LDvG{nCmm zfzBzE99|?t&2hEHu1-HdP^BP7%j`}xZT-}&x@cWL;izsumCtb$CIE<{l??Q(d5Yfq z@NyJFXBZf^qw`;g2pfi43#f+Ur;amJ3H9}DrqQ`Ysu$U5=C$Hn4_eS$rId=G^T>Z; z&-Of;$a$_*bVk|Y92P*0Qy+@nc1hwujZRdd6lK!61M34md-x*%^6x43dDz2mDqENY zw{Icta(u!>68M{?%)94?>Rad(aDPVxp_1?wf>=x2LzdLY`%0GFD&0el(ka)Ws@ikD zp|Ym^FDG{@ZCD}b`l%?CVU3&eQ!Pm}!J#igPyr$;mC! zIKFq#j|-N$4}ze?cic^|(%h?4f-(3cA%BoWt<4OE{>cazn(|7toU8h#*lAR++s;M4-?J=%; z1S2F0Xjnh2jLpj6K!_duK{}HVU7ksWqxvqEJM41e=K>!t6@7$?+_Nupsfpk?(=cx* zPi7w?^3r+hpCTgLGcOM#ndMo{w=8B*|BQv8(Q;UsI$%nf`kzT2)`@!#`+`i%E=lxLlbQQS)2^Rp_MEF){yJ7SF8Vvw zcKrV9R9}=9Z}g=(e*86tc|{RA*$ee88%^+z6@VmuU8w1KX)FTtRzZ=%OrI$uYZD0j zNfs^qR-$h^4d8b--2wHDU|y$xuYZ~2g?$#ChDQUy4V!W2am^rRa;Waq2&Ok4qF@{I z$l@d8$X~>u{hUMUyZ(GV4aJ-A8|X}i`KL6KRN)G^#m+${1;M}fJ1ofz_CKy_Mfsmv z%(pmy=~7Wxj-zJZ#_OQ^f-8!;IWxx*75O+ZkO7CqfWntrG&U$dbRw3FE2JXxvTgE z-So-s#}r4`t!Ph3+&%6~eiM3vwMcnjqZadg*8)H2R)!v3BbIxG_D{>6WV*XL76p@P zKJ5&UT}~t3CnfxcYJEbQwYm?6^2#G`MH8hZJl;whI1j>T8>L7I#w0FOxY5CT-5Cmk z`t{UEZ>ZE=H09a<46f+={>2Cg^Libe&#brXxZ74Wv zpK#q?-OKNVc|N1Agi=N%DTFg~UG7?z|J)D*O zes^S`txlB@YR^%x>#q*g+4};$D?0@MCq!1fFz%5f%tyYz;+cX4d93E1yeP>mCu`xS z<|g(m9Q)K4%m7GLQ!EeoL$sKJR~EAi5Q+GfGAzdn%Kk_b?Q1uc6i@svB(KyGNV(j{ zcvD{%UoHDoFAr63dEuI+X0fj**8h6rD18n5Kpcl$d`3pa4X83_arHZ2x9L|hr zBEL{4M>y$PfNx9Pw=Qm`nAOY(m0mm&oM=kH%ka{&U!^~iUi%r*_w;n?4l;`h#G92- zS;m!;*dK*5wm2nF#BRO1Gs`V<@)J@CP`9!xh;kX$MBx~EM#HoP8<{Q>k0n z%h-}y8jF_J5IhbGhX_J&Yg5is%@d`H^)pc?ZY zoj(bGA5$OZPXQo9H@`q3Zc4EjxAi8e>Xwi-pI%(=Fs(5DZ~d+U>DW)ljX}eBVo*@?~f4xa5&;_O?7Nw ze75R_2wsN%6C}4!>6IdchszB{EP))rn1MV%;asZ8uMA(GUR_+5njrA$N7cU=N=5K< znM0UmM4OU=y-V3lj+DgWn(~y+KDH5m;%JcLvKL_SHex2LZfjSi{~}*{OTqY77*nt< zxxO$kh}Gy1$3jiAPg;E*>s8^Jm}0NE4iv&1Q$E)dyA%Uu8VKMcatH(H|1s*H?ga_YyX08N9a(R^bpDUkdTK1vw!y& zoRZ^GSa;ZPp!X|HcIdqmslR+L_y!a50$%F~My=t`f?<2t+!$stUd#Q z7{{Sg_YpGm<%jm7u=}u#rAVEn$hi9m5~V0|r6|4O=@n8`)+j8ZT})zSOcLTay4(!< z`8ZndIL1IJW@Tv>V`+}wr%Y2nwJ;`I(?_QCeh76OLt+N^U>qlLACI*(KaPw5;uSmh z0L4u|7jZ02QwA?{9QT8?UD&`!dl|a)0fA1L7ZU?3LNYH)W$3BCUAk;>@#u-%4?SJ)RkbPc8TUk~| zyZxoJtnfr1ZM76Pv#gAEAKeQXwZWk@Uuo6Ie&fXVHJdl)hbjs%<;^Lix?a)Ivua(9xBxyFF?rDX^-=Ejz_#0PahmtFdl0NMAmpKe$7>C2UAr94yQfs zJ-bGoyrpv%HU4q zn+c`1HRSk%V#9+{A&&A>>1aO~Ij61SGchuxtsL#FJiew7v#V5`J`w7zywW5yd8)Gc zFiEsMF_o^^N<9&Cqf~XOG#iQ3<5n6Xp7;o!km5$x+zcFAtL8UNF29&+ombs@P`$*N zE{Ca_Fi-82jyK;Z2H}jK460rzj~{@?YoF#|OQ%k8Cg+8xvIEs_a+U8QRj+W=fiyF@ z^lBE~lbQ3=E5>S%ouj`Wl-IP8-n;Va+GFplXO1FOONEvHDkGN@#|pu-Fp`NDW_2P- z4dO{9v@(@j>d~y~9lZn(C5EIq?iP0v6N`&=rHuE1359=D&T*ofUSO#4(vX=T;lMQMbsQ6Ecxku+~DTXm5IJZKPwK ztf{{$i<5(3k^NFG$(sM$IV?A%U8}9F_BfBU)+W`77YoYJgy?9i=;)kLYBVcr?rGaf zEa>Fv7}n_6JLnLlF6c+;7@g^uJuZ;+>5xG{{_ z1$5~JPU;1%>jj_bg*@to;_8Rd=!f&@M@Z^Ns^~|V=tsNg#{}ueCh5oJ>BraTCv@p2 zPUnES-zkAeA!8J&wF-YSvcrR&?u43@P#2~}PAd{rnHP#?I&){Q?K~9%J?xaE9 zxqgyYMm<4B z)wsreG{*fr#siYZs6iFuArs?a7vqs2>+2>PXC|AECR@0s+cc&- zJf=S+O?OpH_e@OpT}%&xOb?SxkMc~9YfMkNOiw3G8J%^`&rB~KO)qiHu4v4zd7d0g zW;ZHkzf{c5T*iL|ncXIt-Q}76tuedrGJBZZymv7}otgc6Gy~w718L1cyyj>x&B3bX z5L0t>S9AX)C`PjR(+WCPtvPnLInIZ8=+O|f#e!Z{mzp;wyBVG7r6sefC5x#gtE=Tx zn*)2YB}cv`r|VAk!U`RpB~R@F#^Oqrq-7->U4Yg~kk?A+rIoO%m58a8sH>G&u$4Hk zRi*e&){rH}hUE*@1zuK5rs$_%qQmj5rD(0Cd97t$S|e1gWlgQ+T&-WLS_?eQjh&-E zkM4NUZOs~G&UlXQbZG_0i#C~oXe>q$Xxx*|05Gzm$u%5RVkR1zD@w+L+qfy4ulp{PEOP_O0#7qfNwZ z-=5orpzK0@4g{B@)=&1`T6X{~pPYR`@Uaf_K_K3ds<>lSx1-NFINkO*!pE@!<@n-sN0l}@ zWglGq(y1wb{~Q?=e(qQw>|{^8uZn)8%YV|;?bNBd-;9T@&|=kwa?*}Gs%bnyb@HAz z?t^vZk3Rf%>~%dQC3e=OcOJ-hE|GH{+He^5ah}YFk7hWJqnzKjIOn+@Px78IpE}Q| zp3SJ9&Mw-|1-p7!@TyZx-Szu7Z^Wf5JUA=r#OKmJ`Vv#kW3B2kxEpne^UfAw569QD z6{rUXlY1bRv;VoW zL-%Bu_QZM@V}X7&T5Hb~b49RwW%Dx9%lFE<*26Xn!uk&+Fyo zTXdz~8$SLB<5sZk{w2$6Tf}X&$t$qT%oW>Ph*svIl-V06lvt;(*#WlOkiqMH!KZ7i zAc{%P7VjTABE{31HNrgPTKOLc&nz0=<8DRw+lKy^k=wO@!P~!bZ??L9Lijq@&*NM! zWN6vq-0Hmj_0g61BU63d*vTSNZ-0Xk;4t@VFL7`xzt=S>hBY5r8r(Xn&l&3N z`=00XsJO6$fp9)dnsQH*3rJ#}uiLV3ns_9r+?NA}=5FT|#vWnddz**vujGFBvA{32 z?)Q7Mza>h31^Rvv@NXG$upazY0RQg&p_gJgH0Rxwjrnbk-P?qj+w8a3YGfFeF`mcC z=a*CNg}0zGJO8h4EmP=N73DErPd?d$OLFJCbc{DBfA(AQKLM$2?p?!Sp4o>OL+RIl!zwx?6wJ^g0_hVUN**&{4lF&1A1 zeS%+%Rs^n?wIKQI_~`1&Hv?Hl{KMJ;`ZGZ^t>Dsfzt+~s~RjPb=R$E**`;)ld@~*f0TxX7SeCW&wbkVBTc7K{zb}4F*M+?LheG{BBQFd^ zJI_ckq*lnJe|1cw6U|_oGP@PQ5Vlu{q9AU!p%0_-TrP^C3nwp*WlGa8j$>Q2HQ}nQ zUoKAIYyXDDNKmX_k|eg1Rg(Ptdb#A?D-cC#iVUGaY3ggn?9wzP!SAK-)ubuP(zP@V z%0B2>W|w6cd44a;Gz+Krlx3A>@G0A_IQ!E_r!U_><+$}zl;?VVGdRdL+sZD_4+yp> zF9-oqRuo1MRx%gFoEuaWCkU=ol)RH}rz(EGPw}}d)AHlzPdTQFpUdU1#y(e+q#0Iz zE+@@C)F@&_a8%ayQ&v?selyIil%t7HDGyp)sjBM%QB~I)tXIN{q3e|g^+>_h>c(kD zL+7fml%>v6L;IE0%?rBzJXJH{RH)jvA884>(e?^eT+JIh91FEUu1MZG&9?EyuX{T= zb=~*jR3yThyWbQIj~F|6rNGD&$4=@6U2TkLKAu=z@cRd5(7c&MI!Q*HB zjIGG}=BxZf&sKX6&=o)7NJPVg(44VQ9_3p!+>sjZaNg1PmG?DcENm}?$K=SAn+)>W zaB#H+R;iokwX~90BsI6H8+l*cKQ#6+yFC}|!Yw!cylj~;)Wpm8if3p+XMm=4&Fhb^ z$kZZzV**!xx^~9W$j>?!JfGzcur{kVdja2jbk! zm{C=ojlX6x@g23LxW?p3e1+0cop`53+i}`BHNpziGK}FVQbG@Vvd# zoXGWs5uR%?me!2ER`QAKl4;kkC9BO0nX9!fA+~fxaV)LxnnldrK}kXP-;>78?)!@Y zx}Jxhb3G^;-@_t#=JcjqB!7+9G{bi)dLXtvywdr?)o*T%m313K7Kaf=m`e}gvhTyT zr7ChTfvxCNe^M+au`#x6ny`2jhXHF(U@AeV0tlg6tm83Jjr)Umn5%sVu-`2 zUcX>Qzw|Dt2Nc&D$BL|D6v7v9gfs&QW%X0D3M4p8STPD^k8^+GjS0g!1PZ3qrn87t zIjCrwL8i8aP2r=S(7)Xd}5sd8MXvJ|N@T(8tAP#pRcE>dmzn5x$}w$NBCQsZcH zVt~X-ZRi)N^^{FDI&oa;*b%AoU*|GAdA8I860HXvb6H?JEe|ke)Q6jJTTun%4oZuD zNz3ClqjCCsxM)-Hn*=*0r2EH zQKO=*?R%##0VhU_=b~->lBaG7PHRX!v9IGpCmuN`YdyST?cY93c~v>Be^M3eSn1+@ z+mSG@aTYGtzCpw1S3|M!6TP+b*u;%t_Qdr27qRZ^H`@Ux2`hIyVm(WZd?AumoBu#r zo{u#3)@aUKXd_9zSaRIqRHx=2dBpqUgZQJk0_8ESZfi+5_+v&sY~u$s4=~aSG{T*C z4pYR3IL{a2jEtvA2E>O;JR9O{oPSVFXAKh!3%mR4JpCx;f;{1k#dM>0jw(oxrN{lVeGS_Aqo`EF=og zZwrkcEKm^&05IHvffxWB0Jk8h5Re8*MT-%b5d8ls0fCACmp~XG!2cI$XlPI<6cZB@ z3kwSy8yn|;!NtYJ$H#}kU_?Yjq@<+eDB__a9V!>%K!1vLB^q40B)1pC15#ac6yoe|fr!*7wyf~rC9JaduOSx?I|F<~m z^L487qe}|%ii(R%%E~@fR902j)ipFXx3;x?ZEx@B=;-R|>hJ0w8X6iN9v=B0MxQ_; zk&_dXGre<5-78BY-xuZ=mll_nmzP&p*ETjcH@CL7ws*F7_I~W{?f$2|y}kYYgTwzg zIy^c)I6m1uJw7}+IX?M+a&~rh{vQ{Y|HIY)aQ(mf@7w==Tt9L3Kl*w7^X7l~^}qc7 zk3au$`yY2t-2SKEfB*jZ`}giY{r$hW|6d;dA3Q!h{-1jMe}Ve{4+aWAfk7=_U)UFc zLBwf1T3<8}17lLmm2W5>N+1_8{T)jjwPqCR(vp~P`_+hu=gslc`+MOKx z6S01b<=96_WJ}FztNV}fJf+rJlh{^p`wFtPZnGy84VzZEt^O(NM8st}(bn)|Bn65+ z5zs2wr}J(QE+q(2VI9ZPll4b@)E+h}LBu`Nfqm1*OCitKl!;a@$u>8&GSJaTXXKVo z@pecbFRq?1_9c5!=1**o{&nQMMY*f}*U56D)8^E=g^+ch4=RpMt-JH?=iywH*>rc; z{h!Mp$O5&V?#KJ%2nMIcM;BgMu};=4q7UpPGtBIrpXBArxdj%1`O%;SRnk0kN^iXX`mx<8oS!O=gb zyj#HdJjY`k%U+D-bomx0Y=L1f%S&F3QlPG4ZaiIaP0QmTxa zp%9ndWKfaFln^oIl+NGeQ10=ecu-$R_=_T^L)KUrA<9X1a9=;6Q$m-hn!NI)w)6M# zNgYE26Ldg4b|ALR z2~0FWX?4iINOXuk&|7X5WvI+#3>QFWk;P-iE~id!ND+KrY5^g0vj0{mwP2klM`9sd zjEzbg7cxa_R^u+4+EfEbZthD7}wqcl|y8)hDYfosY56Lq56 z5)nT!DAm-T4-eB2P4>3$yzGaIe@FyE$O!3nuPJqXi!j`_;+4+fxK$QWB#zdCo?omp zU4DPJxAJygah_}PStTg*(lB9K)Uf};y6Dz0fc?~auGce-4pFv7hq}B1J9H*=E?(Cs`?kP(egM%#p9wpuc+-4iHYYk`D4&+Pp+SF@C#loE>VO)B#%OIu#ZPO}vnQ{>`vCjYx z>UKA?=Roo>rw%1|xY^h(y<8bvEj8&ZKng1)zKQFg7Ee={;!HtEMUR9%&3*=3c}Vj( zZbu4nqyRst!w9D4A#4Kf+@R;NVl$yH@QmGpiE|3myz8TvoO!~nB#OWshs;WCidbIK zv8O39(Fz3W2qXL9t0@F8v8TDylY2dstlgcJ(LE7Zo6?`Hoq~Rb2@bQu>_0g48T?~# z6|XWtz|X<=@n`O#@>4XuPxVdl z`@DbrY{I7)5Ke|&A|Ps~_l!IRTPM8FXr38#A+IMPM{J#sSvtX!@_AIPI~wDTXjGE) z>Z6cybP@E3t&(-SyNsh>$Bg|OYFHZV)KH?#>RrLca61z#XkJWGvtGhG7Nt0-L4TD4 zJOTG(=@|AQir6cpd=4WI$ca9TY6F>`Ikt^2ya!g*!(yKKzf+hL6*cN6e|Uc0VO)gOx)SLPS6eh}%an9WPhh z&Yu*{Z^DK2PvN?7}B;Luc2WknFsCgeZ((4U%Mv}WmS zmsIOr9?;UHsTZ`kuwz)G-q@-;RSXh%ogiKh-eVuYvbsAmO*+wg4iat6={VC*XEk^p zpV4sjhQ}3CTBF@G9QZu3Mv5_Pb*ekM`wX|n2-4rgrK|+EXD1Gx+*-rhEUtPrk)@6; ztzEK1+G9$->J)?wCFoEMxtnn0t+<>KBtC5CPi{!``>;;YS~ILK{MtLYFg~)PwoW5x z=5U^U>~fN{5$Co_T7YvCXGyQ`(&Z2?hZD((71^7AS}%n&@%<6Yx~5npR**hSxm^>Z zhsO8_mFm>7!0LwEqse>q$S-HZrR6-JUXvfHO%HKjxt$KhYf5tGw*Nx#H=e1MOZvPh z+S%ZQpl+;mC{{c}q?&9@5zjeT=Xe*)B{~kJxWerhgCTAGk|cRCGV=np)ne}G=j0P$ zRbiX_hv$oJpCa=XCoER+b}QUP<@5F?!ZfHNmk3QDOcj^r?X?zdQOPY$TXw5ao6C za+dq1@g(cv)syB|)~8z%y(DEOwxg%q>m_nby#Rgj!~8;CJsweGM%dbM3O;g}pty`> z74E~boxTtBn!1|`c*%^w?>c;~_V-)P%flmT$cWxoboJ34LK}OZRj9NzxpII1)MF&Z z$X3ly-9{Yr_7PUVzFRPMBu48r1cTuES9F%lqRuV&d8I(y0@V_UhHnzdOO!^E$qP#i zP#P_iyw{O$nr6Ja{Dg7&3f~95hI8)pmXvTBV3U}NmTCjvfPkV@)-1_rni-Y*v8GvI zKMt%DM?AfJf~|m%bO7#C_fx91F;kf~%^NJadcT6!FzV$nSRdZ@7A~WBIJ15@t8X}a zRyb!{IQMcm?`=3gd4!;Ngs^^usBZ)(IUdqZH3I;~+IF>V#db^gS=PnP8L|@J3B@VI)MH`PPGLk1ml-S!LQ4BAMGnGJ z$m3E+@x=AxGJNB*vf@6r#pN!?v9v|l|H3Z>K>Wl>aSB0Z?$~EdF?ppJEBl_%a-844 zDTOXE&Sfe7&1eN3x@lwBfQy(fWU(qsnT;>0x9iarZz)YeEsC^*t@S* z#NkIv?$w@~;j{xmis7*0<>=IX-R)5Hjx381avzX@Gv6LYlsKt2Kc+7$_G1gP5=-3E zMqeITc>eM`)a^R}MGEM1oY;cwB{AN6bI7D9nkfM5kGXE3o^wH=3l&s+u2*%g7bCU; zq{ok?XzMawkM94+6!L!nmOyF0VQtO#iy}gj)8GiD#bL6 zaqzSXXfQ=B&;_HgiW0R64)z*G&kn{#dKm@!x2Dl@PK z%3yLUSy~+6fL*7LWLcJfHiBk(CunI-*v0_t&|JvC07VCm+g6hBbPu~wfO08rd+BWh zacv1@mTd2W5VijBFL%oUmcU}u?0 zYtN;aX<3@4DP3!Mnmdx31__u3(Uyxjmy=1F;3 zxVf3I8JK>FnXVab0^tpspgWsj4%hZr0&yF*DVwU9o!b6sPOQ0|HPW3}bey_bW4Ae* z@f4f8$(+P_5Sw{k0#SC>77SJ(5JZxrA(U{74nan9($M>5D86^y0Y}bjM-g%%1 zIzHf;pxLpYRwSN=shDkT;bPLKL3YH`g>Q$i_%Ai6zq{QN&L~0pEx;_w!o=jSy zPMV=lDxMQ6nJwy~8Tt>(zy;?hAPhhRqHv-7Nu^Ngmr!b+FFKwQ8m8Gbq2;)x);I%| z0H$hcrAJz)cG@RNdZ%-dr{=SyX8NLXYF!u#oBo3;rdMjHXWF8Bi6qEV1e*Y(kV>ag z%A$Pvq)s}chFYWl01al4jIV(MknoUzdT4rDs;0V{B6zAunyOypr-@poDw?U7N}IA; zm_cf(n%aJrP?RLam5e#3Rmz?odY_0Yqrj@DcL@q!a8)>f2C^WiEUK!~I<4Kor_`zy z)>=Nd3ah*Ms(|XPQJSly39iKHnj%*uvl^(9x~&CTsX=P2zZ#>qDw)u53uY*$<$108 zy03MSt^B$Z{yIK>N~pw2p6RNn=owG9TB!3XukjkG!3wW+*`)7^ugA)y6?nWYu@6h9UsqI>q!%DDAOREh#u1U+Z-FmPITcB1ewK+SdEPJtL>aJ8vv|t;y zATffcSGHz*wrHESJ7=^<+pT4)p;4QzPrI&j+qBUdx5p~8>WZIuE0hz9pI`f@1$(z* zTeya65#^+|io3Xs+qkFKoa*GZmKw90*{#dS2ys4YK z%DcSY>9ZN(yf^{9vq`QRA-$RY2^OP^qRhL!+}pk0yAv4;wRZx#*89EYd%ozKzR%0E zd;+|rs=n|Wzw$f3pL@IQTe4BDn;dzzV#;(~7)( z;=l|X!4f>d4EnyhV!;%g!5X~59NfVkEWh{A49H;$(eM%XfDEEg36Jtu>;08y0#BNXtAhg3s{EY`u2{tUmh_nV_e8X|c#bB`va8Si| ze8*J`2g@MGeB8&$!VdnFaKvn&2#Ns2NW2LhWyUp(S_T0PG#tc3d=G*A24jp2x$p=! zTnS_8$2U>Oc>Kwq3Nkj%=w%*@=(&722OoW;aE&D5MD=HLi5yaq#D5Tann zkbo?*{05X@SmA)pYdplw@W_rZIv%K~xBZ;%NO{RV6-QN9tzV=TLFy%9UD)jiGC3&C8t zS7Fe_5fSuiy(m2zu?w2eOqBp{HgP;i<`9}K5~aX#RB&~JJ=$<13fYX=2?5u5JBm|Y zu~1dkYn$B=*=^q(9$o7F2Fhg+-p~j&{7Vb~*OJWAF8v1I2;U0v2{s(y9Uc+*o!|8Q z+X)d=B>55pz7PeD5%;hxOeEU%*D4lx5c`7zFd$GB?gST35F3u&*FED@o=z$L(uO5` zxa@Ezj@}F~-s`>44ejFEK;m!E2-+|ZqhQ0QGu?l+j8c+ZVLG|R1 ztqjyCAT6*43-;q9F@YYm2Jd_j;w3~A-!f5hq6E=TqqcTG8i;WwXKjUMB@_PZ`aXa6bSunu4xVD^Wv_H6I-Cf`?C>OpbuOc|(Cp7JO|um-x* zlUAdLId4CTa0F%W3Ad05Ns{SVANCinueVv(|Z zsUQU^;B*B6T!^O-0Fes{he`|#GB5{*gCYj^)NoL9?;rz49Lh{QSaAz9gSVUj35Br? z2Pli!9lXa#g^o`cCyr!f@ZK5@L|Pt%MutNaR|Z{0;lQQX#8gzQaM)-Nra@?1I82!& z(O@_<9G0wdnN{mnu3f!;1shiESh8i!o<*Bh?OL{N-M)nzSMFT8b?x58oA%#cZJQLm z0qjQ6CT)BFVN}#?Z#YMQEiu>|i_JvC%_^}0{HD#MWP9^|{stXd^k~whUFy-p;Ld8+ ztzEY+Wq7YH*9=g94FyC888p3nUphEaN-m7Kq;P0tkW>*Bkz6Xv!U3egN*p*Wl6o+l z84g{hF=$HA;G^!}F*-uZ(Ixq$Tf@gZIEo07Q3f}`xH_@oMVA`Ydz|hi4u&i4xa722 zih)&@XwIcvsNeuT@{mZyB~XA!PpJr*a>_f53uuKA7T7&~Hs<{)Q><&sOLoYX^6FHZ{d(uc%S7o(T zS6_uSR#{KX5u+S;ywM~K-bom_AwZ1Mv|^~On!$pDR2fj_ zsDBwyL{NkF>r>Q5MIx2qL?tEFTX0>fZi-#P%M+ta+e?t$Q=Qs&Sdm92xnz@1M%m$CPKLndV}%(nU69nVl^wXmS1n!iifbZJ67GIRL|)ta2k)RE!q(I6NYn zpt|a+t0*O_Pi}CNt8`)5<&Z;`0!*fn;^*XNe zqzeYGP7fu+Ows>hE z*6lkQE;yisEaNzEgsVwZc%l}W9-3hZtC477A++H>dhL%K)sXX%fPWOe&qGHO^dDDW zL@Sy&Ce>q%0F69*?YHN?d+*soyenL99N$;PzehiPy5g7|*UK>vdT0dye%n46&cMR#3*#zJ-xc3C~`| z3sc(W2cP@kZzARx0|(3?5t?`iBfF?VhW-JQ!&q-3*i&B)b+|(w_V88V<4XA&_p9-F z#)n5lVpiDazP4m;h&M`*!wm8|G=u{qpkU4iUBHD5PJ|W5iHO#800pc}BphMjz!;R4 zl`nRu7&cM{8p(K&*P(&l$|)l|q805;IUi8FtA4c1U6f90-FI zp*c<B>h-9QHoa7qJ}G_R!*tPRA%&|ADx*idj^*lAi-)> z`yVYIm8ft?lLIO+LKARckxvBkL&urgH97E2t|+4m9B2U*&cKD4;vgzP+(Z)?U>zI; z!8!~m!X|PhA3+Y00kg{w11Mq17FYodR%n3%MfHzcY6*E#1j{`fVM&(HnLWq<;l$Uu{d?gbi+K&_UPzzAg+#vld5pjD02Ap0E0 zIzwKT?%ctNxzfy6vq1+nJ4Z)*t*nS1Qw7TVmfuP6*+ig17o7B-@K+3Q{wx7fwu zMQnf3E3^KW-D<@z#<7ZOL(2Z*_mmw)}X79AYY1`oMSF`*~=4+v0=5`s~T_l%V##xYs^yLD62BeLOySg%?xA>C;7>|GIEeF ztWhJvxyQShf}w0=90o)p%ZL6kniaihMsIJ=i*+)joqXd)SNbilF&0_aEaqI5`N(l5 zBAI1Ol+Sk7pS&=2ZUQ*u~ z*vD22rs?bEQj0p)!>;d)Va?=cvzpJbb~a;GUEpXpd)rH9GntjKx)y{X5|dDb5$Z~b zG5+(~+Q^1?yye}ZO}nMu^R~1c43g=Iw8kaM&WgSle7xNTJ&;!WSXz^pEI zp5KjUYQGxMc{U6**3i2xK|!kRez=(NJ#vzl+~g;J6&wtb2cP*{zB`@>%Nd~Zfk!yu z7pFGP>Adhn)7j#k{>}c2YlcK zU-f^e95shWeBu?qc*M^f?>$Nt6JI{_H^G5o_gjt z-}%o6tYI_(2RXpr`lyiu95jLXw;NsZ!H2co`8(}aW4!m>hq$+eZ&>1gU;R4Y_4?5d zefrnm{`cQujFGSZuiU%y(EhzX`#oM`FHoDiyBj|N48Y;@KJN=aL<>KV!@cFhzY4U# z3&g;a(LZh5!2Z*-p;N#ud$dq8!q`Sc=l)@>b!n?@+!7HRdE6hU3 z0}ImQy|(Z|yCA&-tim!h!!ty~yuiXMq`%3dy)=ZwIK&Hq@`gIJ!#l*oJk-NIei<4l0MbyMi#^)PCY1GDHq{eMji*6hxYXnAbB*$`O z#$q%_v;fC&6h|dX$9IIsz+1<7^gwh>#&#@1dep~#B)NIyN8A2$EPV9Ge5$(WSMnS9BWw8@){NSf5io#e@$^vRzbN1PPOp^QhMG|Hny%A{1vp8K)` zOE3lyE~xkv(TK{U>WV4L1%V>Ut>ntC%rSOQ1xlC%N;n0roQUd3ic-2`J-N}v}acm#N9PYYpBj9`aQPy{qs15L1^*~FPM;D8zkuJEML3bjxbDTO0Yf!NUs zO_%|eNKX(th+Fsqe$=FzBKzsUXhLmWfz}cj`D$aL|be21YOfATWYJ zk^)G`mJ21)A~jOFAP+loiE!A20%eo!Y8cVv{s1R<1XhrRNr)jS=uR=Af-cB}Tlj=A zK(0jU&;JZiCxw_UX`^yGw?%M*B7lVHbcsxu0Vxm#FIa=5qL3ry(?0dnvw+YO3k$*& zQT-8$iI@fm^#b!4iIPChlvs&DicaMs6?1@4n?Tevpn`GvEbV{?)EQ-fAy!nz48WV%i)e#~SGs%iH;Ukv-FabN(Zv|Hh4HW{iCn%L04#)y|iI+$? z4*0OF&dJsI>52rAm~i3LaK+brJyM$fpqp}~o^!>4lR7C#5K**ZfNBk)bM03>kyCwj z*oPI)N`R?T*ot6ix|>*5Qu!P~omYukE`&`}gIJz(af$obR)|H}l=aHji6E`GrK}>< zhRP%cxQ~2s35!Jo)^t^a1zF0VA)39P(vk_9I9Zi7+M~6}Tf(avi4jY{5Ji|uUBM)! zvjP}6lzUNuta{gv1p>0ssHweGL^4YTz#M|(utv{hSrWF{5(f>fxHdsu}u=p8Ql zT8AQ&87L@ByoXA_5bP+}T4I0+QUQ}NrJrShTgs(<>ZM;2A9q~a$d%l9jHVV?sx4sv z6%Yf#Ojwj)gx)y=m-J-dN%(9Nnk}lc}L)_Kg?KQ)f zfrbwQKwYzyZiPDgvN_0ANMAXy{o)bK%SY~o-}pU4{}VnTJVD??UzBvg z`E$1~UYrzqYK^Y9a6sF-CzPc5Ty8U(GC4}K8tY8}k;vl}^Ze(E? zyu0~xKLixwC1zr)6aHYFBjIQy!;kzt4{qWs#$rWN-~o=|^gH4o7QOw`$Sfw~GA1tw z%e^RG!58Mfx)VRNHRCvz$%YT&RU(M&@Kz=4EE)W_IRh zhURFN=4qzpYPRNU#^!9+=56NYZuaJH2Ip`V=W!JBg*5`fZ=YIC*e+KA)zUFs^=NmL;fkx5?|-lSb*3R_T>y>6Uismxk$>mg$+M>6*6b zo5ty!*6E$*>7GVuWVUE2#Au%;>Y_I4qekkaR_di@>ZW$;r-tgNmTHm)>Y%>Cp`Plj z*6OY1>aO8iHsi#}$uR_nE9>$Z05w}$Jumg}Q7>$9Fgte)$<*6Y3I z>%R8uzXt4>u4}u-K)ep@!$$1HR_w)Q?8fft!6s}AG;GJF?8>(6%f{@?hHJ=ge(Kq#?dP*? z-WKlRChp=k?vnQH-)_F(KJMmr?&pSX(@t*XPCeUUfau2V?AGq>Zft|FZt7O;LE-N4 zChzh#Z?g7o@K*2jX7BcP@Aro9_?GYartkW$?^_^+RM@3lPy{J>gtoNr02lDBNRun* z2~fDEDVUQ1XYd9$hyw2kSNMV#ScAxFi&C(HDVSXc=kQ#H@Vp=eCFp_w>F^T2GH8VEyah^l1X88ZNO*+uWB^rggc;9MTSfly z7vJzAKk_oj(_Q$GN2ml{2nJACgEBaSN9YOfo`gmaf*Mc+_yY14H*@Y4gN4|H*s=~5 zP=o+e1QytmAh=ovpou78t%;Zropl8?kn=5hg6=9b4lrLLl& ztc5QR^D+PNP3QL8P4gg71SvNNR)`KHPy$~!2vHaaT4w-V_=2GLZkp`@9R6@5Mp$-m zN^~@m0@gxtVLuoYfCA##1w}xCegAbL=zjIe|n;D9fH zrHY_}GMa=Jp!bQOi9%0><3RLuM*>*?^+IO=e=qqLsPkos0u;!bG=X`H2nGnvf(Clk zhnM)DpLi2CAt1Qb95o&ET_|Mjr%imNA}G=Ty~fUm%Z zucOHHNAL29NRzlPdx%H-#?M!^KM1xjS-2n2rdN4)U;1CSg6<@6{$MwBtWOgeFn1*& z{n97>ulM|W;Q+-~amIK2*FRRscX$qHd;6e#k%#wCFoKXbh)F;J#pepX?|l^5e6K)p z#9#gPY<<{gesGojo~QlE2Yv={b$a)f@BRcLxOw;V0ww5s&o72UAByZZf=;ak9KYJ* zKZwLvexGmt_ea&|mwb$P`{~F0FNmRx!Tc_Wcde2E-UkQ<0tFTm!$46n2D-j*P!w#S zKub7qWD*#O!xdK$EpkvoN+2mEH7so`Y4Rk>lqy%UZ0YhP%$PD~(yVFoCeEBXck=A% z^C!@tLWdG9YV;`5q)L}EZR+$X)TmNXifLFfB!@^PH}&xTxN*`87buX3+Neng2QaDx z?wW+QOfHiJ8zy9MR)(Tl12-w*ASNz@iy2E^^vb~16%J(dPHpV?G33aSCsVF$`7-9r znm2Rq?D;cjnpG8D?W=VoSHlBYRpG$l%)^b4Zg5~>L?)^LX@Z!e<9bG!>)~?PWKH@;}87M}T52e# zoqGBysG*8FYG|1*x>2OXfc2iHrfT|XjEYkFYND9xNGh(m>bfhhz4|Juth8=g%t9x^ z8f>a}+S;R?vvTR|uhB|7Ew$BJdu?{eYO7-{lRWattge=nte$+jnk=)}s=F?`?YjFe zyldVHt+Od2D(p$*E^6+!%f|aJzyS+9F#f@R_B*bkThc36tp2KWZo}yoJTb);TYNFb zrOu15unKdGZlxbbjIgp2XM8fsDXY9P%QhX1YQkSm`s}gGG7B=yCAYjY&prG6^TaRH zTYU}wr;1#%$v`{(G}KW`EvV3&5>2wl`j&g|(l*LGHP~T`JvP}DR=u#e`^Kzn z&R;`}C)Z`mJvZHT+udN?Si2nT-F^H0H{gMDm$u-A8-6(AiEGHW;*C50IOLH-mAB-T zTYfp_nY%=|=AC=~Ip}~>9y;lzn|?aboTI)v>#e)~I_$B_K0EC#0agp{x$C|=@4fr} zJMh5^KRofp8-G0V$t%A+^UXW|{yg;2OFupJ)mwi(_StK{J@>~81X%6ij~b0Y-J5?t z`su5`KKt#v|33Wj%RfK;#0x~e`1ynSPc*sI|33f&D8K;{uz&_UAOaI;y<9}&ANqS> zr~Vs7D8wNWv4}=IA`+9RL=x(-iGW%n6r(7`DN?bDR=gq>v#3QI zI#vW|s(B#{~^$w^YOl9s$A4I!yXAYrnTp8O;zL)pkpk`hCr zJS8eqsmfJmv6QZ)5G!LT%URO0mMwfGE+J&gUGlP*zNBR?gGruW60?}bJmw;Wsm$;o zvzg9(CN#;o%xO}yn%2A~HnXYCZE~}l-uxyw!zs>jlCzxVJSRHSsm^t>vz_jICp_aR z&w0|bp7y*aKJ%&1ee$!P{`@CE11ivg611QOJt#sGs?dcpw4n}tC`2PF(TP&Dq87a< zMl-6>jdHZ39{ngtLn_jdlC-2IJt<04s?wFRlvLHY#V+o_fN(Hk3X_m&OLMAI*|9?v zl$Zo1P7w~1RD%8kTYv@wN>Kz3P$4!ueJWH*Hw{MgfIhC7!5WmYk)j@z0niu&3>0Aw zpp1eFSODL3a)AXZj3TOTeJhw)K?Ty~d4n=r>cN}&iwRD-giPy`y%5DBL;U>cWr1QBk) zi07`hwEq76Z+A*@1Qj>}C7PIl4!{*#qyDuF9AE@QZt(>bSQR748Hj@!L5jy(H4Iv1 zKwvBU;FHL;!cgGrKqO3It6t&41A)dGT43T$K!mHZ5Ces~%79Hkp~5X#!!!h9SP_>2 zz(ziDb=o5Zv~EPY&|R>OGrXF)I^hwlki{fglUWRNU=390LMCqUi7`+Z4MQ!4a+&Mg zCvRjLUQkS2a*+lVNI@1;=0KINoMp^vmI2D>0tZ?UhDc0e5l(OqCHl$%D^z6$OArJ3 zD1ieNfcX}uSi}%GVCMSXH^2LxM1PSi>QP_DL}cKuN@Oc#2AozmJ(`AzybxptI2a0x z{y;9P8KHs%55%*CMF}a2umn2`BphMzO{=-^>R8X(5h@@8jbBU#rUIs@E(k&-uA2)g zsNmKRNre;$oZ`@uy4>cLOf}vNVV9_S#0&^F5!$+uQ4j&K0&(z?H_Ly+Mu@BP#}vAdXpyCJfQC8%H$o8^ECPBW19bYa#IaRh^fOzv}&yyQ=T z#ug&Zl6J3~61u@3L{N?%TEE654qk)5KZ}xJa9a@`--ye(0P`28Tq~gHK@n^#5OZu| z5~3~Yupx4fY4^J%fjz=n7+_d?o4o5@H;OsH;G34PTp)1D!gJI9+(r*JnWnB`J!T>87q;kKx9sY*mJ%L zr4TvSBQN~n)1(qAFv2NzPFw|-odJzd461D&deD!a?k(x*8gS5pDLEhdD!GITbe>8pk5N9vp!kqm_h8?&G7+4`)!5}VQy&XivUCsfVNxW1{ zLBu4$Kv(Tw|CPl5p+Q*$8w^y$MnFRtG{L%&9|NEkX_N#ggcmXZpX2_yp9!AeKsehB zK*Bv(kR<>?L&zWgF#sbtkTO^S3|JgR^HJ zAaa<)7;u2BnFWF|pWzL}C+GkaxLC0r+Za@yVcmd&p`c;~gBhM78m6Hdq9GZYL^z-U z#(hC5wBS9gLK?^z7kpSr;NOEe5Cc%c3;;nSAlE%q0t_w!P6?ps4MZ(GLAT*rNx0c- zcw8i?fQ|v8AQGY>asVO<1Sk-JV#EeJTmmR=8kGIjK)fLbRKdbc!y2dn5QLh{ox#tw zAylm)F6JVA*`h$WVhb=pg)x8%h=CqT-w)mcBgohhh=CX!0sh9NfyXH#^$kR;(Z>&N zL~G%hB1A$Mw7?9cU#=-5GdiORKqEv*TA(386X1Yrbb%gnpq~L+3sAusZ~;5wKru)`#T zTM!cDP6;GY3S|Z5-Yv8j103a2PEbKU|161-P zJ4|I&hGkUV!!9JHRr2Ik79;|;AX{doQ05d-3Zzjw{^dzf&{O&$Uhbs@#bpNhrCypu zU;^e}8YWW;CSGcgVy@*}vQ%9LUuI@u zKITeArY=sVS#srN`lVsQrfiaCN{r@UCMId}Wnbo|U}`31+U9PeW@@S?E)wKuvczq! z<#FyMa{{Js*5+=0W^mHxa?+-CKBs3Y=X44uN)cyq{$q7Qr*`TlWj5z__GNhbW@}#O zb5>_^{^ogJ=6Z4`eJWOZ=H+YVW?{xBW^N~9!l!Bar*o<&W3p#`9_V7-XJwA3Xfh># zVyAc>rUw})VMgbKQYeCEC{*3&dy;2!if4uX_GfuU=y=ZOhq@+!nka;7D2qN7ZVu>s zo~U__C}*zdfGh?1v@wy2Pr)Qj?_b;{?BK4pm7Xm;W#R!--RhGmZq zsCvrikX|WDWo2i^sBB6ojiM)q0%wT=>6rGWfr6%((kPa$sYrDYj5=m$*64x~=z12Y zeja9niYSk6CV{f4pO%!J&Zv~OrIOBRpW z#zdt?DyMd;r+zA^hN`HJDyf#Lsh%pTrmCv0Dyz1ttG+6%#;UB&Dy`P4t==lF_KyPX zDzEmcul_2q2CJ|RYx*z{u2xJm5Uc*OE-SM(tFt~Uv_|Xo4BfE`jQ>b0wq~ogZY#HT ztGBKX;Z^Iu%bDMz!+@BZY;-ktjB&V$cC)Q zjx5QRth!z-#sZASnk>tbC z;0Err3~u5+F62h8aH&9 zwyx{GF6_px?9MLj)~@Z|F7D>8?(Qz{_O9>#F7O7g@D4BW7O(LhFY+d@@-8p)Hm~zO zFZ4#Q^iD7JRM36maqAqFZ!mh`mQhgwy*oXFZ{-@ z{LU}^*025EFaGAQ{_ZdT_OJi`F8~Ly01q$$7q9^zFajsA0xvKFH?RXgFa$@i1Wzyp zSFiY3%9Tfzc38PF!kI|3NHo! zT&oP{unzAq5BIRQGEk7#uunu25f`x$AF&zY(GEg8gBR8@mtB@jF>LX7wC0DYeMzT&=vL{9bm=99Le~U4RDu<#fE7T27vKO9 ztU=RMv;~8l7ogS`qDm!PLM=W=B~(H}&{h^G#&gj$>3x`19Z!I*%yB47k_z!CV-k;RKg@A-$|$fpap?NvUCkk1E57h7WN=KcXV3Yn}b!@ zXLD=5N5x&{!Cgw*kvk7e@!KA0%1#vDFP8J!YQ!ABRHdKouleG!6HmTBy<5D z>Y;<7!D9u1JD;Lddm4W+0KHXQn*o{{MBhC)8yAei6ga{p0D%=0HDy;YVaGJcbzEAD zpT7kkN9({Aqyj`_V@&(@QqdwrYyv3$po75xEBcmfeKZ3MGZmV#3axe_>_2O6F7V!l&d)dy}7=561imy0F zoH&~wy1k_v2lP2aWFgmOxlxT9o(}}QCD?S=bf?#F7RKASNcuZBV(3ZY{)vAeOEkGa zB>8GXgt2kJdn@8UR00F&c$|+RL=5y8NILhe#HQx@0i%`|wAWx}dXU|N8U#lr;FK#` zK@S8UoJhfhuY|FC6`&PCCLotAOc;Q}x{l2vuBWpLbUBGS(4=y^0q+}n{ACu#cQ$rJ z8Jx5fEO+pY!cw`0b(=)IGk`2e`s*11h2f)b>HA;pZ4BrrH2a$r!Oj=uDk=Q zJO#ZJRWfH_Mrob?!&~mDz(45+v0AxPcbINF)DtkFS}E3h{U!7MX=C1LX-?3@0XK#Q zYS}CB*;8oRTcw-QDVo0hW>OHyxx9PQecdDQj%MnI1}CF-sFT8J-ven}ntYF^=i3)P z15YX1gXy5^D3Ug*jADL4Vz`1;>ZMw~*>`^CJO1W#eb;{}>IEY`>l)ip1Uc!^rzU?nC?rT2lYo_OWexv5+n{vM16Myk1@ZJx;>My@@Ha~+d zzxEgD^h@xCTEB>5e|w7m?qg^7OaJ#9u=$^rnmKYyzK`WJBb>!+ErXZw4p z=KDTC{1f<(K|zBI1`a&9kYPiI4-4P9r9OwEB`9|;+_!E8mesqLZ(qNE0S6X5m~dgk zhY^cydvdYJq=_L%mOPnqWy_Z_XV$!#Gv>yfL5CJSnsjN?r%|U?y*lD&)~{j5mOYzx zZQHkTQ+}MAcW>Xnfd>~pocL~Zej!G{+= zo_u-p=h3HEzn*=2_wV7ymp`9=ef#(E=hwfVfBt{}{{ak8zyS#?kfmsHsYSsB8EnwO z2O*45!U-v?(83Eb%uvG(IqcBG4?zr3#1Tm>(Zmx`Oi{%ZS!~h840DObz!_=eE1DN^ z%u&Z3dF;{0AAt-~$RUX=(nt+utWn7&yGroLC!vf|$|UcL)Ri3d)YMZ^O;y!ZS#8zTS7G%N)KO`z zHKbBw%~jW3dF|ELUx5ww(OGRR*4T@1{uNf)WtnZ(*=M1RHcw)Yt=8Ixl9g85ZMp5% z+i$@wl-g^_wKm&u(M?y~b=hs#*Kx~@*Vc30t=Har@y%D?JK>er-%#n@SKxsOF4$mg z`~6p8F9SZ<;fEoPSmI0*UfALq8=hF>jXCbv<4+a5SY(D3{Mh7^QBFDHibrl4z*-7Y zS>~B(t{L2dV0KyO0&}+6=bwQNI#--`F4}098sWeTT^34uY5kmL8nUQgOGSzrEIC^1 zt+|#e7%(_cWTCIa){ktlAv+tkO?Fsfl&;~9Tke&t#(JT;v(69i$o77X>bU_ATyTxp zc6*`1-_8&5$QEZ!?ZF|BT*+1bNO7gAq`A1IX$~@HAeT}~+2y8SQXxfi&p{VGHq1|V ziFDItVqLJ;TNlad7buZj_uT~)qwJ}I@f~f0g8zM!9+V*ECReWDAd-TPPrj;PKv`o7 zC7ck064e=Eg%U;9poA5NTzSL`C6uT_5#<}oWs^qIctn(794dZzmzZ}xCi@4=|9O&* zXE@#skbw9R-b6kz1uK+dA*Haw6h1MM+vV;c6NDb}*jE$(T~K;1N#Ft@;tDaKfCD8o zp%g-~kX)>R1t#PG3)GM^gH(bDE-WDn6v4fMOd<$2w1OxaVnLW}5GFzl3=u~ny8n6p9tEi)5=T&hG9Z@H z8-*guP=-cuw0#&YgGOnp!b+&Yos}Rd1LR3hd*U;Kt{_DzxI~E;&@zr-8y+J#a0P}I zBo|)bz#0m23oiWbAZ+X4Cxl?igE#^O&O8Vwff|WP!0e@Kh-g7Z(TJET0u*~>h)K(U z(t$o=r9_nHS`T{DNc?o2?Nq}i>}n8KM53J{)geW>`qx?n_6&nHNMYTHSc8D#5s`Q+ zA|FACTS%4xZT&1>9qSOh>XiX1Er?&$I@#(8may#1Y+|?A10-k>oxSz#bA>o z%RHV9{=-H^%oExa})uX#lw1sgu$irz)8*c8D5Q+m~l40xh0 ztl9{MpfU@xFsM@_`Q2|G#FjxQa6!16TP28sg&gQ$DZCI}6aKKh?~QLQ=KI=kMo$!K zP%#Ih5JBO(5CvaYCiH6PLM!kVsO0P}jcx4095Z0YChYMtMS%nkU~{`vxT<$YT;dM8 z0=)zNurOV0LKwoB1N5CS@@jnJB{#W*Po8ipe;a2xC&zbbn8Fq&L5fU3mjh+sQc&yu zdCz?Av!DMAXmi8n1sR9|pKIu$3?MN@C6u|VLD=o#EUm>+LP7>62IwQW(84VIm=#-P zffw+ph)Lfd(s7)lr}60p7Nj8zlxFFfm9PdO&{Y(TFaigJu+oBX8rGl|^)sUh1_qYm z3@C`g+W$Y!5((r z_|6HzGDT`q6;W6 z14-A;kUo02Af-mZ8J4+=NA!RQAD(Ddw|c+4_W%VqP{dS&QO0Q=q!wQ9Le7q>_-Z!( z@l)@?3#c&pVaosoR2VhW2X9QJD$^jUr~)tT4(AJEU;7N;boak+aQ>e&AQL!v!G0yG zZl)ct_{Tp8BTxVe+HaUp0P&*F?-VKF?;u#PtG=t5a>^h8&~U8g>k1;u(2oJytqNwa zARgfbs*eGCKm`{9s+<6hWRM|h@NJGq3Q}R`lmHB%@4FrX6s!vMhJXW{AQHGI<;3bB zMvwt&!4ZT21&RO(WWWW^AcJHf3vdw8?&k$_>#7o~kLGXm!m7Y}@CR2(2p8~zjL;w; zj04c_AU==-dMOgruOJp7*Ie+*>X6C`q7V`dkK1izzEte19fp1OT%}_pdozc-9%3etBCD z-JXUaxQk4R40p&Rj94MwDA6EB0SU^9ZHT~_4nh|y;SsKA8eb8+tSk_{i}ntO_aaCf zs}ZiSF?XyjUwnUcwfz$?XsDj9%^PyqiHB7Y=|5qlCM%n~in3T({LqP)wL z-m)RovLI;4jJ&`R(uf`#%ph0+4!b~$TtN|JVCfjZmj2Nl#fsB<;1N_O7!s(@xFjj# zlB>Eh6qwSY63hzlDKzoP5gbo!?vf$MW-hG|Cbg0wo+ua`0ltJl3?d;47h*Fzb2W{! zH5Ve3SfL6eaT6txEDwSap}>s2Wl&sEx2}tHH;uanf;$9>L2!3>C%C)2bmQ&`?(PuW z-5U)qf#6OE1ZfW6-nH+&Rrge#^VF!W^>6)I)oaeV-ti1v@%JBgW7`y6?e<)l!mnt( zZ&)r$H9fj zy#fZww2}Crvj)M&Gb#erdh&da^9T@=#`ixowcP zaDPEEb*BS0dOw~`9^;UT(#tt850>lo8Bd`wfQa zeI_J`5>|9?d{;ZFPx?!5EtNo(x;`X9;^$Tq^}`(s-jiodn?x~ zswWNNNxBWPG=3FfwjptXEMpXVRNG0jH3Hn4G-J^*I%2<4{OmLhz1z>uk<_EI=V<-5 z#h-}#J?y^1Ox!;hcU&}%&%5AhnFrsRKvRvOy~AX;!X3D_@gCG{h$!tu%M2|prFfjS zpR_#}s5BQX-90^fkmRJkI!)CO7GuwL_kx##^4)5|%^rj}Xv&NY{oU8z?tiVHUD0`h zzzibplGHqtBMMFrE~Fza|MX`kb}v?QbJT*0OrMf8O&&5ric{X% zd$?hW@<8i=BA*juG{Zi9of`})(&X{iIDl^br1o3($UQXmO!KVgi7rKwOP+zkN=Oi3 zkQzBJ9`>yigzojS?J8EnS{C`W`zT@)f~v`wlsvHXAqZoEO7Q|3vmGNBfgUiK$`JcH z69LSEC^z;4rC&Kt4t#sM9CMw4$TBmy1n>3JMwp8zjgbfU5mfc=gMlSMxF!l9l3p~I z3KG1?*Y;Gz5Cvy?QZy1{lyR!X)v_RL6Hbk9BdQrFTdmy zd?QWd_^jSRYA>i2ebkm?k0ckJPegD!I`X>T3PPtD&1Mu0aF#5Pizw(QRZ?I=Q=g%_UMb>T zNqPE*>todk3nJ9lk(Ug{fN6u^oq5^@KE94I$V(?dru)VJ+7KA~${b_!3GWQQO`^?J zB6PtB_#VQ9SNV!FGOb^iuJ$U7hwHj!rAAbPAFG9#A8&Slvl@<^*!(vuw<^u0vI+h=UtA*uhi zr2Y9Z>Y3EdCAfijts(TWjO$IyJYC%cT?2iGo4&91m1dj5S}WL4;y@KH@*t}d_QjW z+D9_G%=tQ0^lB5|Gz`4?@u=6Ao!EWh+j;e-w^Xn3-(%0SZ`+w>_t|6D?HXyOwV%(M ze)gw+#;0CXzfR&Wcm(`iI-Nsr3KXO}yJGQr1Ul0RiN7^@56JQLo3ASn=?|Nd52X8! zDrISqKJ|X{?JZC5$6fCsMHs2<7%k-+(#U`6I~wf4=lUa>)#yt;T>Yd- zG!HIV8(Q?6LhPJ+)N6kuii^cJskTmfk~J~p+v7>z0M+mK_SEYCIP;HuY-@cc^$CX9 zH3k%z>Emk}*_(EU^UvM#&!S|*xUxDo_{WC;b9bF{ZR9Zgg@cIK8LQc^NyiangZYuU zK4|8Yfq!kh{s={O!*BjE-1Yo-da}*}tp`sq`;GD2r>ULJN$Q80!0ZL+^U#a$kVe;d zuz!!Iz@o3g?CZ`t(tpfUU^btkwb*~D-oF=mb4}#GT%EnbF3{2_V5;?X$mn&FF=>Hm z=6bUKaB6nLJjL{iz+^ndX6*9{e%2Ox=i-V%KgY&8uEF4$!P4)It!)0SnT_6Aidjme zm9DN|rX}#Yj@1K!O^VH*r0~tpn;Q~2o`?Z6?3=#m6`PssTZvt}vE-Z88^0a}mJJMh zl{T07{5Rnv29wbgGsK%Cw(!+*ieJoK2c^$HEjNl~9IJx_)_6PjnxA)L1A3&okB{2+ z0tJ8Zy*YL?+`8*p6oc=C!++xo&T07nq77if%sCzDo;A(+h5EJ*#qcyS=Xh6ezc}a6 zdh=j6=b&S4_ov_(@#ZmVu4TR8imCs}gyH2~_vwltO-R80RrX1j!On@n?;H5*B!jcm z$Ng79u!_L()#e$a|A@%e_M5Fesh;x*gI)K{YjmN%iMN+JIX5Cbe|xge)&ws({Fmup zwqgx$#3;|S;CEeuN6tonaE0zU$d3YrE@T21aQQD2xAq%z4&Ar@8Bjim8UF3sVz#E- zBlU-0CI{ZQ3O(w*JcVyPmA>3VbMDvRE4fD3kNkH^Tel}h|BQ_OZ3x|v=58Z~1Pg

    id$( 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

    FeL_g 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⪚&*cw0j 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

    (ox~6ivtE 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

    ro&ZWpTpS4&kDaP(6#^a()~MROzV;2!Sc?wQn{ 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�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⋘O#cQsqp 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ⅇv4x!~a8JhO%7{0nE$2SE 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

    sl9(-n0hFGtEt_u|9ah2NpJ;rETnIbM4p@ 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

    >A^(GU+25ff1n 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%0D|?e+f;-TmMCuTD2NH~*iO|GRR3fB*15^ndrb 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 literal 0 HcmV?d00001 diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-new-question.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-new-question.png new file mode 100644 index 0000000000000000000000000000000000000000..aeec85e5ee6b12f20ba10fee9322a543438b59a3 GIT binary patch literal 59431 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�LXfiwmz-X}sH?Lv-qQ{Y z@+DD=`s2iDT<(l#iTw?+4O_raW(Krncql;(1_G9j+&5X5s{o2g4eg6H?mO|BeNu$o z7_opoI2m>={av;Bn&8jqx8INbb4W+l|w1ZZ!n2< zg{PN#m_S5dTqYZ#CM_Q%cvH1lK}X@C?#K9PEnK@9@lB$&Pl$WS2)6>pPqx__sOMXv z{vwWFl&@#-%+PXV%LpJhtP+lzmkyfn?#LxUW{^aPlvfaAok*0pS}Vk0S;Avq-k(M2 z(!Yh#hl|HqzO^Gdk~bDj$5M2h1M^z$b1w)1-VnZ=lq8?|)gjtQT4nvLxGxe8-|(9h zY5|1_N|F!O95i?KLq%H^(WSEchxmIwmz-L z^!$2m62!M0TrnZBo9=BAE_XUjCq+J+>_cuuItz7~$glKRvvi1ol!jA~Bm1#Wcr4h< z=D{gL@e#?*b*52&VV+2}&VjSg*d(!rrjWQPCI9vmPwI9t=Ej84&tr@cPinh&)ns!^m|yqv;Q zntA1a5SqKt{MA1(W{~zX^sW+TOC}`JW$pT$U2A-JN3MxND<+Y1&+Wv_O^Nm^f3-1s zCtm1LbnVJrq&ANRIm36Ky5rd2e16W~0!k}zr9xY;pF@(X*TqgAfrxtW&|_IiaxI@} z7S5jZkc|oiZhM*j#Gy`IPd$-W$!71iGu`Ky$2AXX)S1_Ur+LU15Ur8aG`X0XpxVWl{I$ zu^~AkBSq$c$5a#j>nG|NJNd6XfYnW|bD!aVMQy;1Hdt=B`S@=JJ(?fXS&09~=#&Sm%to-`PYx>VkQ|!@Fk6hv$)uQ@VNvB>sLLBXkd*z9kk;%5YyL%%nW>^oBg2noucXA zzTXA9I%=I7AF3Dm7JD7j30V{zI90u6@H_nIxZPzVt=mC#Z-gzWZK<0LFnG+!X5_j> z5=d~kDzn1Qmd|`mTNF=FKt!Q4rb<=rze#MjKTO~gBiFn)Ke)52Z7dt`xM=Gbua!+B z%G~dEF=Hb=W3^5yTd!pE)lNk}aF$9R=JsA_Q4*pva9{C3htjY>-`c8|rl$iaDT_(` z%D9{4w65wq$Euz1HNO~$azaRK5j9o^bBzKMFZewTq_`k!JBtK&^;gf)!2Lq^)a7|c z)84TUlo=bS8iJ^HUpIb*U2y3ap*WrnzG$#Buyyphp+8cROyKZ35TuxMrwKcTc37Gy zKD-lzXybVa?$QJ5hDPw+ram;jkFM8s?VTV4~ZA3eni7hP` zytzVVXa4MXv!v&hK>b+LD$+p_Xgad{8E>#8cBK zi*kB<1_eCg6{Q4eXbiCP> zuKYMf+`4ykj+lKr8T;IOwd8JtziV)AJOU;Urg@`cFbJggl!?<-iW{H{7~-lk=l$Fds7 zU$o*_T`eXYC((FVHJg$m!xocSNHr3*{5m&iBGU5CK?{ocf~v1b&)k zZ$IptzLu>pFcg&l6em;KbVwFSyyB2I_WJ$%I8JEWBZ9s!lRB$m@H<0607o}VnOT6$Hx6a&AMSiTbGa+LIS+^iH8|QgQVvasmtBJkhe^jc@C?3VpizEN6W>=X#`0$)XqJS)4tH zZbd%^An%EdC%41P^ACV(VzC1-`{W*rfa&7?;DR})=qlE}{D8P`3<$>1#OY(^_OYnr zX=Ghnhy*hQ)-)SF+Oy0MLdQzfRYsSm=)+&RgprY-c>|%MrN7;IH#aym%%MopxH4^t z5HQP`3<(Jry|l`CXL)K2N3pc|G31*aA*EmU;Zn!KMpk;ok4?!g zg;+q2jNsiJ)MgiQk#^PgP5QZk&cbk$%gC(K;}8~Weamry&S*j+dgfBz|QW#hKAdsdKJOTTusySZH2VMBH7t6aeLILxM zj8w0W_5->>$O31&n!T4+p^82`q&ZSKO|324ro2ajm!NUPNXsH(RH#BiDuHSbwQ<@M zjs0BV4%%PP{L_Fg%TRC*9r5yNc-(f?W#_qqF*!Kf!`_Z5p6kaH5WO&6kT^ROW1b6_ jmZTNCzU7yFID1QS|FiYPe2}Zgo%I?j0Oi_OHXr^6pVe?o literal 0 HcmV?d00001 diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-question-example.png b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/poll-question-example.png new file mode 100644 index 0000000000000000000000000000000000000000..130586ab295bfcac8c6d5146910f7c95d91a9be6 GIT binary patch literal 19448 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ⅈ=oH16j}6uO0gSY>z@lpN+41S-sCq{aLQ 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

    I7=eIlp5@%2l&EHQn5S0j650)n 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 literal 0 HcmV?d00001 From da4cbd7292de7fa6f73e7d8adb970843ef8c8d07 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 9 May 2022 21:24:58 +0300 Subject: [PATCH 029/161] Update POST.md --- .../2022-05-09 v5_3_Preview/POST.md | 68 +++++++++++++++---- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index 9624b3a45b..fdd09cb536 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -48,7 +48,7 @@ In this section, I will introduce some major features released with this version * PWA Support for Blazor WASM & Angular UIs * Introduce the `Volo.Abp.Gdpr.Abstractions` package * Batch Publish Events from Outbox to the Event Bus -* Improvements on **eShopOnAbp** project +* Improvements on **eShopOnAbp** Project & E-Book Announcement * LeptonX Lite Documentations & Project Status & Roadmap * OpenIddict Module * Deployment Documentations @@ -60,15 +60,15 @@ We've created a new startup template named `app-nolayers` and [announced](https: *You can examine the screenshot below to see how to create an `app-nolayers` template from the ["Get Started"](https://abp.io/get-started) page.* -![Get Started Page / app-nolayers](./app-nolayers-get-started.png) +![](./app-nolayers-get-started.png) -### PWA Support for Blazor WASM & Angular UIs +### PWA Support for Startup Templates With v5.3 ABP supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. Example: ```bash -abp new MyProgressiveWebApp -u blazor --pwa +abp new MyProgressiveWebApp -t app -u blazor --pwa ``` ### Introduce the `Volo.Abp.Gdpr.Abstractions` package @@ -77,7 +77,9 @@ A new `Volo.Abp.Gdpr.Abstractions` package is added to the framework. Anyone can use this package to use the pre-defined ETOs and implement GDPR-related operations for their own applications. -In that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. +In that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. + +> Please see the **GDPR Module** section below to learn more about this module. ### Batch Publish Events from Outbox to the Event Bus @@ -94,8 +96,17 @@ We've made some optimizations for the **Batch Event Publishing** in this version *You can see the optimization results above for "Batch Publishing (1000 Events)"* - -### Improvements on eShopOnAbp project +### Improvements on eShopOnAbp Project & E-Book Announcement + +There are couple of developments on **eShopOnAbp** project made in this version. You can see the brief description of the some of the improvements below: + +* Local certificates have been created to use while working in Kubernetes and also Helm Charts have been updated. See [#107](https://github.com/abpframework/eShopOnAbp/pull/107). +* Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). +* Database migration event handlers have been removed and "Distributed Locking" used for database migrations. See [#85](https://github.com/abpframework/eShopOnAbp/pull/85) and [#102](https://github.com/abpframework/eShopOnAbp/pull/102). +* Switched from Ocelot to YARP as gateway. See [#97](https://github.com/abpframework/eShopOnAbp/pull/97). + +We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the **eShopOnAbp** project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. + ### LeptonX Lite Documentations & Project Status & Roadmap @@ -129,7 +140,7 @@ In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Dep ### Other News * Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. See [#12189](https://github.com/abpframework/abp/pull/12189). -* Global Features was only accessible from C# code. From this version Global Features can be provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). +* Global Features was only accessible from the C# code. From this version Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). * Get the user's detailed informations (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). * Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). @@ -143,7 +154,9 @@ If you want to see more details, you can check [the release on GitHub](https://g With this version we are introducing the new **GDPR Module**. This was one of the most awaited features, so we've prioritized it and implemented it in this version. -GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. Currently, there are two main functionality of this module and they are "Download Personal Data" and "Delete Personal Data". +GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. + +Currently, there are two main functionality of this module and they are "Download Personal Data" and "Delete Personal Data". ![](./gdpr-user-menu.png) @@ -151,11 +164,20 @@ There is a "Personal Data" section in the user menu like in the screenshot above ![](./gdpr-personal-data-page.png) +After you've requested to download "Personal Data", you need to wait for 1 hour by default (it's configurable, you can use configure the related option). Because the GDPR module is developed by considering the distributed systems and therefore a specific time should be passed to ensure all the published events are handled. + ### CMS Kit Pro - Polling Feature -We've added the new **Polling** feature to the **CMS Kit Pro** module. This feature allows you to use a voting system in your application easily. +We've added the new **Polling** feature to the **CMS Kit Pro** module. This feature allows you to use a questionnaire/voting system in your application easily. + +You can create a question, define some options for it and the poll will be created for you. You can see the example poll in the screenshot below. + +![](./poll-question-example.png) + +Also there is a admin side of the Polling Feature. You can easily manage your polls in your admin (back-office) project. You can create, update, delete and show the results of the poll in the Polls page. + +![](./poll-questions.png) - ### OAuth Resource Owner Password as External Login Provider @@ -172,8 +194,8 @@ You can login by providing a username and password from an External Login Provid In this version, there are couple of enhancements and new features in **Suite** and they are listed briefly below: * It's now possible to create a **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for **app-nolayers** template with this version. -* Suite allows users to see and download their Suite logs. -* Suite allows to generate code via CLI. If you have JSON file that contains a code block, like your entity, you can use the `abp suite generate` command to generate CRUD pages. +* With this version, Suite allows users to see and download Suite logs. +* Suite allows to generate code via CLI. If you have JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. *Example:* @@ -190,10 +212,26 @@ We've organized a webinar for Suite and in this webinar, we've talked about ABP You can watch the event from [here](https://www.youtube.com/watch?v=RFArBh60RSA&t=3s), if you haven't watched yet. ### Docker Compose Configurations for Single Layer Startup Template - + +Dockerfiles, docker-compose files and build script files have been added to the Single Layer Startup Template (app-nolayers) with this version. + +In this way, applications created with this template can now be deployed more easily. ### Microservice Solution Enhancements - + +There are couple of enhancements made in the Microservice Solution. You can see the list of these enhancements: + +* Initial migration on the template has been updated for the small improvement that made in the **Language Management** module. +* Database migration event handlers have been removed and "Distributed Locking" used for the database migrations. + +### PWA Support for the Application Pro Template + +Application Pro template also supports the PWA for Blazor WASM & Angular UIS. To create a startup template with the PWA support, you can use the `--pwa` parameter. +Example: + +```bash +abp new MyProgressiveWebApp -t app-pro -u blazor --pwa +``` ## Community News From 3f68d978ebac70290ff9e8d8c6d9eea5f893ce69 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 9 May 2022 22:26:17 +0300 Subject: [PATCH 030/161] Update POST.md --- .../2022-05-09 v5_3_Preview/POST.md | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index fdd09cb536..d339a04273 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -38,25 +38,25 @@ You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https:// There is only one breaking changes in this version upgrade and it's explained below. -* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to upgrade your projects that uses **AutoMapper** library (probably your `*.Application` project) to **netstandard2.1** or **net6** if it's **netstandard2.0**. See [#12189](https://github.com/abpframework/abp/pull/12189). +* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to upgrade your projects that use the **AutoMapper** library (your `*.Application` project etc.) to **netstandard2.1** or **net6**. See [#12189](https://github.com/abpframework/abp/pull/12189). ## What's New with ABP Framework 5.3? -In this section, I will introduce some major features released with this version. Here, a brief list of titles explained in the next sections: +In this section, I will introduce some major features released with this version. Here is a brief list of titles explained in the next sections: * Single-layer option added to the [*Get Started*](https://abp.io/get-started) page -* PWA Support for Blazor WASM & Angular UIs +* PWA Support for Startup Templates * Introduce the `Volo.Abp.Gdpr.Abstractions` package * Batch Publish Events from Outbox to the Event Bus * Improvements on **eShopOnAbp** Project & E-Book Announcement * LeptonX Lite Documentations & Project Status & Roadmap * OpenIddict Module * Deployment Documentations -* Other news... +* Other news ### Single-layer Option on *Get Started* Page -We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've added this startup template option to the *Get Started* page. +We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've also added this startup template option to the *Get Started* page. *You can examine the screenshot below to see how to create an `app-nolayers` template from the ["Get Started"](https://abp.io/get-started) page.* @@ -98,12 +98,12 @@ We've made some optimizations for the **Batch Event Publishing** in this version ### Improvements on eShopOnAbp Project & E-Book Announcement -There are couple of developments on **eShopOnAbp** project made in this version. You can see the brief description of the some of the improvements below: +There are a couple of developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of the some of the improvements below: * Local certificates have been created to use while working in Kubernetes and also Helm Charts have been updated. See [#107](https://github.com/abpframework/eShopOnAbp/pull/107). -* Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). +* The Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). * Database migration event handlers have been removed and "Distributed Locking" used for database migrations. See [#85](https://github.com/abpframework/eShopOnAbp/pull/85) and [#102](https://github.com/abpframework/eShopOnAbp/pull/102). -* Switched from Ocelot to YARP as gateway. See [#97](https://github.com/abpframework/eShopOnAbp/pull/97). +* Switched from Ocelot to YARP as the gateway. See [#97](https://github.com/abpframework/eShopOnAbp/pull/97). We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the **eShopOnAbp** project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. @@ -114,7 +114,7 @@ It is finally here, we've released the **1.0.0-beta.1** version for the **Lepton ![](./leptonx-lite-documentations.png) -Lepton X Lite documents have been written for the three UI types within this version. You can see the related documentation from the screenshot above. You can follow these documentations and try the new **LeptonX Lite Theme**. +Lepton X Lite documents have been written for the three UI types within this version. You can see the related documentation from the screenshot above. You can follow these documents and try the new **LeptonX Lite Theme**. We don't suggest using the **beta.1** version on production but we highly demand you to test the **LeptonX Lite** and provide feedback to us. It's really important for us to be able to release a more stable version. Thanks in advance. @@ -122,49 +122,48 @@ For the following versions (beta.2 and RC versions), we will focus on; * Fixing the reported bugs from the community * Providing documentations as much as possible -* Adding new custom pages to demo +* Adding new custom pages to the demo ### OpenIddict Module ### Deployment Documentations -Deploying an ABP based application is not so different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. However, we wanted to prepare a "Deployment Guide" to mention the important points and considerations. +Deploying an ABP-based application is not so different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. However, we wanted to prepare a "Deployment Guide" to mention the important points and considerations. ![](./deployment-documentation.png) -We've created two new deployment documentations, you can find them under the ["Deployment"](https://docs.abp.io/en/abp/5.3/Deployment/Index) section of our documentation website. +We've created two new deployment documents, you can find them under the ["Deployment"](https://docs.abp.io/en/abp/5.3/Deployment/Index) section of our documentation website. -In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Deployment/Clustered-Environment) documentation, we've documented the topics that you should consider when you are developing your application to a clustered environment and explains how you can deal with these topics in your ABP based application. +In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Deployment/Clustered-Environment) documentation, we've documented the topics that you should consider when you are developing your application to a clustered environment and explained how you can deal with these topics in your ABP-based application. ### Other News -* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. See [#12189](https://github.com/abpframework/abp/pull/12189). -* Global Features was only accessible from the C# code. From this version Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). -* Get the user's detailed informations (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). +* Global Features was only accessible from the C# code. From this version, Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). +* Get the user's detailed information (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). * Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). -If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), that contains a list of all issues and pull requests closed with this version. +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all issues and pull requests closed with this version. ## What's New with ABP Commercial 5.3? ### GDPR Module -> **GDPR (General Data Protection Regulation)** is a regulation in EU law on data protection and known as the toughest privacy and security law in the world. GDPR applies to any organisation operating within the EU, as well as any organisations outside of the EU which offer goods or services to customers or businesses in the EU. +> **GDPR (General Data Protection Regulation)** is a regulation in EU law on data protection and known as the toughest privacy and security law in the world. GDPR applies to any organization operating within the EU, as well as any organizations outside of the EU which offer goods or services to customers or businesses in the EU. -With this version we are introducing the new **GDPR Module**. This was one of the most awaited features, so we've prioritized it and implemented it in this version. +With this version, we are introducing the new **GDPR Module**. This was one of the most awaited features, so we've prioritized it and implemented it in this version. GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. -Currently, there are two main functionality of this module and they are "Download Personal Data" and "Delete Personal Data". +Currently, there are two main functions of this module and they are "Download Personal Data" and "Delete Personal Data". ![](./gdpr-user-menu.png) -There is a "Personal Data" section in the user menu like in the screenshot above and when you click to this section, you'll be redirected to the "Personal Data" page. On that page, you can either request to "Download Personal Data" or "Delete Personal Data". +There is a "Personal Data" section in the user menu like in the screenshot above and when you click on this section, you'll be redirected to the "Personal Data" page. On that page, you can either request to "Download Personal Data" or "Delete Personal Data". ![](./gdpr-personal-data-page.png) -After you've requested to download "Personal Data", you need to wait for 1 hour by default (it's configurable, you can use configure the related option). Because the GDPR module is developed by considering the distributed systems and therefore a specific time should be passed to ensure all the published events are handled. +After you've requested to download "Personal Data", you need to wait for 1 hour by default (you can configure the related option). Because the GDPR module is developed by considering the distributed systems and therefore a specific time should be passed to ensure all the published events are handled and all personal data is collected. ### CMS Kit Pro - Polling Feature @@ -174,16 +173,15 @@ You can create a question, define some options for it and the poll will be creat ![](./poll-question-example.png) -Also there is a admin side of the Polling Feature. You can easily manage your polls in your admin (back-office) project. You can create, update, delete and show the results of the poll in the Polls page. +Also, there is an admin side of the Polling Feature. You can easily manage your polls in your admin (back-office) project. You can create, update, delete and show the results of the poll on the Polls page. ![](./poll-questions.png) - ### OAuth Resource Owner Password as External Login Provider > The Resource Owner Password flow allows for the exchanging of the user name and password of a user for an access token. When using the resource owner password credentials grant, the user provides the credentials (user name and password) directly to the application. -You can login by providing a username and password from an External Login Provider. +Thanks to that you can login by providing a username and password from an External Login Provider. *Example: Use OAuth external login provider with Keycloak* @@ -191,11 +189,11 @@ You can login by providing a username and password from an External Login Provid ### Suite New Features & Enhancements -In this version, there are couple of enhancements and new features in **Suite** and they are listed briefly below: +In this version, there are some enhancements and new features in **Suite** and they are listed briefly below: -* It's now possible to create a **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for **app-nolayers** template with this version. -* With this version, Suite allows users to see and download Suite logs. -* Suite allows to generate code via CLI. If you have JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. +* It's now possible to create an **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for the **app-nolayers** template with this version. +* With this version, Suite allows users to see and download their logs. +* Suite allows generating code via CLI. If you have JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. *Example:* @@ -209,19 +207,19 @@ abp suite generate -e C:\Users\.suite\entities\Country.json -s C:\Users\my-proj\ We've organized a webinar for Suite and in this webinar, we've talked about ABP Suite's capabilities, important features and more... -You can watch the event from [here](https://www.youtube.com/watch?v=RFArBh60RSA&t=3s), if you haven't watched yet. +You can watch the event from [here](https://www.youtube.com/watch?v=RFArBh60RSA&t=3s), if you haven't watched it yet. ### Docker Compose Configurations for Single Layer Startup Template Dockerfiles, docker-compose files and build script files have been added to the Single Layer Startup Template (app-nolayers) with this version. -In this way, applications created with this template can now be deployed more easily. +In this way, applications created with this template now can be deployed more easily. ### Microservice Solution Enhancements -There are couple of enhancements made in the Microservice Solution. You can see the list of these enhancements: +There are some enhancements made in the Microservice Solution. You can see the list of these enhancements: -* Initial migration on the template has been updated for the small improvement that made in the **Language Management** module. +* Initial migration on the template has been updated for the small improvement that was made in the **Language Management** module. * Database migration event handlers have been removed and "Distributed Locking" used for the database migrations. ### PWA Support for the Application Pro Template @@ -237,7 +235,7 @@ abp new MyProgressiveWebApp -t app-pro -u blazor --pwa ### New ABP Community Posts -* [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared couple of video posts about the ABP Microservice solution. +* [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared a couple of video posts about the ABP Microservice solution. * [Francisco Kadzi](https://github.com/CiscoNinja) has created his first ABP Community article that shows how to ["Customize ABP Angular Application UI with AdminLTE"](https://community.abp.io/posts/customize-abp-angular-application-ui-with-adminlte.-7qu1m67s). * [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show how to ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. * [Manoj Kumar](https://community.abp.io/members/manojkumar.t@shloklabs.com) submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). @@ -247,7 +245,7 @@ abp new MyProgressiveWebApp -t app-pro -u blazor --pwa ![](./community-talks-2022.4.png) -We've [asked you to pick the topic of the next Community Talks](https://twitter.com/abpframework/status/1514567683072745474?s=20&t=rJfHrB3DYDNsk2EXS8zBBQ) and you've chosen the "How to contribute to open source ABP Framework?" for the next talk topic. So, in this Community Talk, we will be talking about "How to contribute to ABP Framework" with one of the top contributors [Ismail Yılmaz](https://github.com/iyilm4z). The event will be on **May 10, 2022, at 17:00 (UTC)** on YouTube. +We've [asked you to pick the topic of the next Community Talks](https://twitter.com/abpframework/status/1514567683072745474?s=20&t=rJfHrB3DYDNsk2EXS8zBBQ) and you've chosen the "How to contribute to open source ABP Framework?" for the next talk topic. So, in this Community Talk, we will be talking about "How to contribute to ABP Framework" with one of the top contributors of the ABP Framework, [Ismail Yılmaz](https://github.com/iyilm4z). The event will be on **May 10, 2022, at 17:00 (UTC)** on YouTube. > You can register for the event from [here](https://kommunity.com/volosoft/events/abp-community-talks-20224-how-to-contribute-to-the-open-source-abp-framework-d9b50664), if you haven't registered yet. @@ -255,10 +253,8 @@ You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel ### Discord Server -We've created an official ABP Discord server so the ABP Community can interact with each other. +We've created an official ABP Discord server so the ABP Community can interact with each other and create a blog-post to introduce it. You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. Thanks to the ABP Community, **700+** people joined our Discord Server so far and it grows every day. -> You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. - You can join our Discord Server from [here](https://discord.gg/abp), if you haven't yet. \ No newline at end of file From 6dd6f249536261c95317fbcf86f46af46c7e2571 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 10 May 2022 09:21:15 +0800 Subject: [PATCH 031/161] Add [DisableAuditing] to TenantCreateDto.AdminPassword --- .../Volo/Abp/TenantManagement/TenantCreateDto.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs index d357b01b5e..887d14bc99 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using Volo.Abp.Auditing; namespace Volo.Abp.TenantManagement; @@ -11,5 +12,6 @@ public class TenantCreateDto : TenantCreateOrUpdateDtoBase [Required] [MaxLength(128)] + [DisableAuditing] public virtual string AdminPassword { get; set; } } From 9355e0673df9fc5f0e456d08435889d65d9891e9 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 May 2022 11:19:09 +0800 Subject: [PATCH 032/161] Add document and unit tests. --- docs/en/Entity-Framework-Core.md | 12 ++++++ .../Repositories/RepositoryExtensions.cs | 20 +++++----- .../RepositoryExtensions_Tests.cs | 8 ++++ .../RepositoryExtensions_Tests.cs | 8 ++++ .../RepositoryExtensions_Tests.cs | 10 +++++ .../Testing/RepositoryExtensions_Tests.cs | 38 +++++++++++++++++++ 6 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/RepositoryExtensions_Tests.cs create mode 100644 framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/Repositories/RepositoryExtensions_Tests.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Repositories/RepositoryExtensions_Tests.cs create mode 100644 framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/RepositoryExtensions_Tests.cs diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md index 568623a15d..de26b7c3f0 100644 --- a/docs/en/Entity-Framework-Core.md +++ b/docs/en/Entity-Framework-Core.md @@ -607,6 +607,18 @@ Whenever you access to a property/collection, EF Core automatically performs an See also [lazy loading document](https://docs.microsoft.com/en-us/ef/core/querying/related-data/lazy) of the EF Core. +## Repository Extensions + +There are some useful repository extension methods. + +````csharp +EnsureCollectionLoadedAsync // **Explicitly load** a sub collection. +EnsurePropertyLoadedAsync // **Explicitly load** a navigation property. +EnsureExistsAsync // Make sure the entitys exists, It accepts the entity id or a query expression. +HardDeleteAsync // Hard delete the entitys, It accepts one or more entities or query expressions. +HardDeleteWithUnitOfWorkAsync // Hard delete the entitys in a uow(create a new uow if current is null), It accepts one or more entities or query expressions. +```` + ## Access to the EF Core API In most cases, you want to hide EF Core APIs behind a repository (this is the main purpose of the repository pattern). However, if you want to access the `DbContext` instance over the repository, you can use `GetDbContext()` or `GetDbSet()` extension methods. Example: diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 21162ed9e7..379203f46a 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.Domain.Repositories; public static class RepositoryExtensions { - public static async Task EnsureCollectionLoadedAsync( + public async static Task EnsureCollectionLoadedAsync( this IBasicRepository repository, TEntity entity, Expression>> propertyExpression, @@ -31,7 +31,7 @@ public static class RepositoryExtensions } } - public static async Task EnsurePropertyLoadedAsync( + public async static Task EnsurePropertyLoadedAsync( this IBasicRepository repository, TEntity entity, Expression> propertyExpression, @@ -47,7 +47,7 @@ public static class RepositoryExtensions } } - public static async Task EnsureExistsAsync( + public async static Task EnsureExistsAsync( this IRepository repository, TKey id, CancellationToken cancellationToken = default @@ -60,7 +60,7 @@ public static class RepositoryExtensions } } - public static async Task EnsureExistsAsync( + public async static Task EnsureExistsAsync( this IRepository repository, Expression> expression, CancellationToken cancellationToken = default @@ -73,7 +73,7 @@ public static class RepositoryExtensions } } - public static async Task HardDeleteAsync( + public async static Task HardDeleteAsync( this IRepository repository, Expression> predicate, bool autoSave = false, @@ -97,7 +97,7 @@ public static class RepositoryExtensions } } - public static async Task HardDeleteAsync( + public async static Task HardDeleteAsync( this IBasicRepository repository, IEnumerable entities, bool autoSave = false, @@ -121,7 +121,7 @@ public static class RepositoryExtensions } } - public static async Task HardDeleteAsync( + public async static Task HardDeleteAsync( this IBasicRepository repository, TEntity entity, bool autoSave = false, @@ -165,7 +165,7 @@ public static class RepositoryExtensions return unitOfWorkManagerAccessor.UnitOfWorkManager; } - private static async Task HardDeleteWithUnitOfWorkAsync( + private async static Task HardDeleteWithUnitOfWorkAsync( IRepository repository, Expression> predicate, bool autoSave, @@ -181,7 +181,7 @@ public static class RepositoryExtensions } } - private static async Task HardDeleteWithUnitOfWorkAsync( + private async static Task HardDeleteWithUnitOfWorkAsync( IBasicRepository repository, IEnumerable entities, bool autoSave, @@ -199,7 +199,7 @@ public static class RepositoryExtensions await repository.DeleteManyAsync(entities, autoSave, cancellationToken); } - private static async Task HardDeleteWithUnitOfWorkAsync( + private async static Task HardDeleteWithUnitOfWorkAsync( IBasicRepository repository, TEntity entity, bool autoSave, diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/RepositoryExtensions_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/RepositoryExtensions_Tests.cs new file mode 100644 index 0000000000..70f99ac26a --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/RepositoryExtensions_Tests.cs @@ -0,0 +1,8 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.EntityFrameworkCore.Repositories; + +public class RepositoryExtensions_Tests : RepositoryExtensions_Tests +{ + +} diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/Repositories/RepositoryExtensions_Tests.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/Repositories/RepositoryExtensions_Tests.cs new file mode 100644 index 0000000000..dbb37bb71e --- /dev/null +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/Repositories/RepositoryExtensions_Tests.cs @@ -0,0 +1,8 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.MemoryDb.Repositories; + +public class RepositoryExtensions_Tests : RepositoryExtensions_Tests +{ + +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Repositories/RepositoryExtensions_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Repositories/RepositoryExtensions_Tests.cs new file mode 100644 index 0000000000..dd653878b8 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Repositories/RepositoryExtensions_Tests.cs @@ -0,0 +1,10 @@ +using Volo.Abp.TestApp.Testing; +using Xunit; + +namespace Volo.Abp.MongoDB.Repositories; + +[Collection(MongoTestCollection.Name)] +public class RepositoryExtensions_Tests : RepositoryExtensions_Tests +{ + +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/RepositoryExtensions_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/RepositoryExtensions_Tests.cs new file mode 100644 index 0000000000..747c53e333 --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/RepositoryExtensions_Tests.cs @@ -0,0 +1,38 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Modularity; +using Volo.Abp.TestApp.Domain; +using Xunit; + +namespace Volo.Abp.TestApp.Testing; + +public abstract class RepositoryExtensions_Tests : TestAppTestBase + where TStartupModule : IAbpModule +{ + protected readonly IRepository PersonRepository; + + protected RepositoryExtensions_Tests() + { + PersonRepository = GetRequiredService>(); + } + + [Fact] + public async Task EnsureExistsAsync_Test() + { + await WithUnitOfWorkAsync(async () => + { + var id = Guid.NewGuid(); + await Assert.ThrowsAsync(async () => + await PersonRepository.EnsureExistsAsync(Guid.NewGuid()) + ); + await Assert.ThrowsAsync(async () => + await PersonRepository.EnsureExistsAsync(x => x.Id == id) + ); + + await PersonRepository.EnsureExistsAsync(TestDataBuilder.UserDouglasId); + await PersonRepository.EnsureExistsAsync(x => x.Id == TestDataBuilder.UserDouglasId); + }); + } +} From 9e48c27db671a15378db8d9fd469f76234046830 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 May 2022 11:37:22 +0800 Subject: [PATCH 033/161] Update `EnsureExistsAsync` document. --- docs/en/Entity-Framework-Core.md | 12 ------------ docs/en/Repositories.md | 4 ++++ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md index de26b7c3f0..568623a15d 100644 --- a/docs/en/Entity-Framework-Core.md +++ b/docs/en/Entity-Framework-Core.md @@ -607,18 +607,6 @@ Whenever you access to a property/collection, EF Core automatically performs an See also [lazy loading document](https://docs.microsoft.com/en-us/ef/core/querying/related-data/lazy) of the EF Core. -## Repository Extensions - -There are some useful repository extension methods. - -````csharp -EnsureCollectionLoadedAsync // **Explicitly load** a sub collection. -EnsurePropertyLoadedAsync // **Explicitly load** a navigation property. -EnsureExistsAsync // Make sure the entitys exists, It accepts the entity id or a query expression. -HardDeleteAsync // Hard delete the entitys, It accepts one or more entities or query expressions. -HardDeleteWithUnitOfWorkAsync // Hard delete the entitys in a uow(create a new uow if current is null), It accepts one or more entities or query expressions. -```` - ## Access to the EF Core API In most cases, you want to hide EF Core APIs behind a repository (this is the main purpose of the repository pattern). However, if you want to access the `DbContext` instance over the repository, you can use `GetDbContext()` or `GetDbSet()` extension methods. Example: diff --git a/docs/en/Repositories.md b/docs/en/Repositories.md index dc82876efb..a1a5ac5cce 100644 --- a/docs/en/Repositories.md +++ b/docs/en/Repositories.md @@ -164,6 +164,10 @@ If your entity is a soft-delete entity, you can use the `HardDeleteAsync` method > See the [Data Filtering](Data-Filtering.md) documentation for more about soft-delete. +### Ensure Entities Exists + +The `EnsureExistsAsync` extension method accepts entity id or entities query expression to ensure entities exist, otherwise, it will throw `EntityNotFoundException`. + ## Other Generic Repository Types Standard `IRepository` interface exposes the standard `IQueryable` and you can freely query using the standard LINQ methods. This is fine for most of the applications. However, some ORM providers or database systems may not support standard `IQueryable` interface. If you want to use such providers, you can't rely on the `IQueryable`. From 4f5ef12b75d1e4ac229f3ff25c92f6a67a39e8ea Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 10 May 2022 07:56:33 +0300 Subject: [PATCH 034/161] Update POST.md --- .../Blog-Posts/2022-05-09 v5_3_Preview/POST.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index d339a04273..78210d56df 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -98,7 +98,7 @@ We've made some optimizations for the **Batch Event Publishing** in this version ### Improvements on eShopOnAbp Project & E-Book Announcement -There are a couple of developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of the some of the improvements below: +There are some developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of the some of the improvements below: * Local certificates have been created to use while working in Kubernetes and also Helm Charts have been updated. See [#107](https://github.com/abpframework/eShopOnAbp/pull/107). * The Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). @@ -107,6 +107,11 @@ There are a couple of developments on the **eShopOnAbp** project made in this ve We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the **eShopOnAbp** project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. +We're planning to create this book in nine chapters and make it available after the three chapter is written. You will be able to download this free e-book from the [abp.io](https://abp.io/) website. You can see the title of these three chapters below: + +- Chapter 1 : Introduction (This chapter explains the main problems of microservice development and the purpose of the eShopOnAbp solution.) +- Chapter 2 : Running the Solution (This chapter explains the various ways to run the solution such as using the Microsoft's Tye tool.) +- Chapter 3 : Understanding the authentication system (This chapter explains the authentication system used in the **eShopOnAbp** solution.) ### LeptonX Lite Documentations & Project Status & Roadmap @@ -124,9 +129,18 @@ For the following versions (beta.2 and RC versions), we will focus on; * Providing documentations as much as possible * Adding new custom pages to the demo - ### OpenIddict Module +We have [announced the plan of replacing the IdentityServer](https://github.com/abpframework/abp/issues/11989). ABP currently uses **IdentityServer4** to add **OAuth** features as built-in on the server-side. However, since *IdentityServer4's support ends at the end of the year 2022*. Its replacement is Duende IdentityServer, which is not a free software anymore. (see [more](https://blog.duendesoftware.com/posts/20220111_fair_trade/)) + +Therefore, we've decided to completely drop the **IdentityServer4** from the ABP platform and implementing the [OpenIddict](https://github.com/openiddict/openiddict-core) and making it installed into the startup templates. + +We've implemented both open source and commercial OpenIddict modules, we plan to remove Identity Server and replace it with OpenIddict for template projects in **v5.4**. Please check [#12084](https://github.com/abpframework/abp/pull/12084) to see the development made on the open-source side. + +We're creating the documentation for OpenIddict Module, if you want to have general knowledge about this module, you can check the documentation from [here](https://github.com/abpframework/abp/blob/dev/docs/en/Modules/OpenIddict.md). Currently, this is a draft documentation but it gives overall knowledge about OpenIddict Module, we'll complete this documentation in v5.4 and you'll be able to read it completely. + +Currently, we are also working on Keycloak integration possibilities in parallel to the OpenIddict integration research and we've prepared some samples that you can examine. You can see [#154](https://github.com/abpframework/abp-samples/pull/154) and [#158](https://github.com/abpframework/abp-samples/pull/158). + ### Deployment Documentations Deploying an ABP-based application is not so different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. However, we wanted to prepare a "Deployment Guide" to mention the important points and considerations. From 590d669defca7c46155664b55f06d5c5f91f62f0 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 10 May 2022 08:04:39 +0300 Subject: [PATCH 035/161] Update POST.md --- docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index 78210d56df..abf4b62af0 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -50,9 +50,9 @@ In this section, I will introduce some major features released with this version * Batch Publish Events from Outbox to the Event Bus * Improvements on **eShopOnAbp** Project & E-Book Announcement * LeptonX Lite Documentations & Project Status & Roadmap -* OpenIddict Module +* OpenIddict Module & Keycloack Integration * Deployment Documentations -* Other news +* Other News ### Single-layer Option on *Get Started* Page @@ -129,7 +129,7 @@ For the following versions (beta.2 and RC versions), we will focus on; * Providing documentations as much as possible * Adding new custom pages to the demo -### OpenIddict Module +### OpenIddict Module & Keycloack Integration We have [announced the plan of replacing the IdentityServer](https://github.com/abpframework/abp/issues/11989). ABP currently uses **IdentityServer4** to add **OAuth** features as built-in on the server-side. However, since *IdentityServer4's support ends at the end of the year 2022*. Its replacement is Duende IdentityServer, which is not a free software anymore. (see [more](https://blog.duendesoftware.com/posts/20220111_fair_trade/)) @@ -156,6 +156,7 @@ In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Dep * Global Features was only accessible from the C# code. From this version, Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). * Get the user's detailed information (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). * Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). +* A bug has been reported to us about a plain password leak on the `AbpAuditLogActions` table for the **TenantCreateDto.AdminPassword**. We've [fixed this problem](https://github.com/abpframework/abp/pull/12499), and it will be available in the next release. If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all issues and pull requests closed with this version. @@ -267,7 +268,7 @@ You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel ### Discord Server -We've created an official ABP Discord server so the ABP Community can interact with each other and create a blog-post to introduce it. You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. +We've created an official ABP Discord server so the ABP Community can interact with each other and create a blog-post to introduce it. You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. Thanks to the ABP Community, **700+** people joined our Discord Server so far and it grows every day. From eff1a08edd993b4acfbe67c489c35dab7d50b2d9 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 May 2022 13:45:08 +0800 Subject: [PATCH 036/161] =?UTF-8?q?Rename=20`=C4=B1n=C4=B1tial`=20to=20`in?= =?UTF-8?q?itial`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cli/Commands/CreateMigrationAndRunMigratorCommand.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index 38491551a8..05abd4940c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -13,16 +13,16 @@ namespace Volo.Abp.Cli.Commands; public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientDependency { - private readonly InitialMigrationCreator _ınıtialMigrationCreator; + private readonly InitialMigrationCreator _initialMigrationCreator; public const string Name = "create-migration-and-run-migrator"; public ICmdHelper CmdHelper { get; } public DotnetEfToolManager DotnetEfToolManager { get; } public ILogger Logger { get; set; } - public CreateMigrationAndRunMigratorCommand(ICmdHelper cmdHelper, InitialMigrationCreator ınıtialMigrationCreator, DotnetEfToolManager dotnetEfToolManager) + public CreateMigrationAndRunMigratorCommand(ICmdHelper cmdHelper, InitialMigrationCreator initialMigrationCreator, DotnetEfToolManager dotnetEfToolManager) { - _ınıtialMigrationCreator = ınıtialMigrationCreator; + _initialMigrationCreator = initialMigrationCreator; CmdHelper = cmdHelper; DotnetEfToolManager = dotnetEfToolManager; Logger = NullLogger.Instance; @@ -46,7 +46,7 @@ public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientD await DotnetEfToolManager.BeSureInstalledAsync(); - var migrationsCreatedSuccessfully = await _ınıtialMigrationCreator.CreateAsync(commandLineArgs.Target, !nolayers); + var migrationsCreatedSuccessfully = await _initialMigrationCreator.CreateAsync(commandLineArgs.Target, !nolayers); if (migrationsCreatedSuccessfully) { From a20e63228a99dc8381e84a471f5ee3f98587e325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 10 May 2022 08:45:43 +0300 Subject: [PATCH 037/161] Resolved #12163: Document update for "Support for exporting generic interfaces" --- docs/en/Dependency-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index 019366b3be..668eac6644 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -131,7 +131,7 @@ public class TaxCalculator: ICalculator, ITaxCalculator, ICanCalculate, ITransie If you do not specify which services to expose, ABP expose services by convention. So taking the ``TaxCalculator`` defined above: * The class itself is exposed by default. That means you can inject it by ``TaxCalculator`` class. -* Default interfaces are exposed by default. Default interfaces are determined by naming convention. In this example, ``ICalculator`` and ``ITaxCalculator`` are default interfaces of ``TaxCalculator``, but ``ICanCalculate`` is not. +* Default interfaces are exposed by default. Default interfaces are determined by naming convention. In this example, ``ICalculator`` and ``ITaxCalculator`` are default interfaces of ``TaxCalculator``, but ``ICanCalculate`` is not. A generic interface (e.g. `ICalculator`) is also considered as a default interface if the naming convention is satisfied. ### Combining All Together From 93245f25fbfdab82040a115bae0402f45d8f440c Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 May 2022 13:54:06 +0800 Subject: [PATCH 038/161] Remove description of `AllowTenantsToChangeEmailSettings` feature. --- .../SettingManagementFeatureDefinitionProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 23f0c071fd..3c7b3cd4a7 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -23,7 +23,7 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi SettingManagementFeatures.AllowTenantsToChangeEmailSettings, "false", L("Feature:AllowTenantsToChangeEmailSettings"), - L("Feature:AllowTenantsToChangeEmailSettingsDescription"), + null, new ToggleStringValueType(), isAvailableToHost: false); } From 0c2898b2f0d987fddbd0258790565e788f407400 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 10 May 2022 09:54:25 +0300 Subject: [PATCH 039/161] Update POST.md --- docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index abf4b62af0..e1b0afaa76 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -252,6 +252,8 @@ abp new MyProgressiveWebApp -t app-pro -u blazor --pwa * [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared a couple of video posts about the ABP Microservice solution. * [Francisco Kadzi](https://github.com/CiscoNinja) has created his first ABP Community article that shows how to ["Customize ABP Angular Application UI with AdminLTE"](https://community.abp.io/posts/customize-abp-angular-application-ui-with-adminlte.-7qu1m67s). +* [Jack Fistelmann](https://github.com/nebula2) has created an article to introduce a helpful project extension to speed up development on Visual Studio. You can read the article [here](https://community.abp.io/posts/using-switch-startup-project-extension-for-visual-studio-52yyw27v). +* [Jack Fistelmann](https://github.com/nebula2) has also created an article to show how you can generate PDF files with the `Sycyber.Core` package in an ABP-based applications. You can read from [here](https://community.abp.io/posts/generate-pdfs-in-an-abp-framework-project-using-scryber.core-x9yh1vfa). * [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show how to ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. * [Manoj Kumar](https://community.abp.io/members/manojkumar.t@shloklabs.com) submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). * [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read from [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). From 19b5ae03bae130eaa1a6bb296d85d8667779b72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 10 May 2022 09:57:48 +0300 Subject: [PATCH 040/161] Documented how to enable outbox/inbox #12391 --- docs/en/Distributed-Event-Bus.md | 112 ++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/docs/en/Distributed-Event-Bus.md b/docs/en/Distributed-Event-Bus.md index 387fece078..1bcb7ca360 100644 --- a/docs/en/Distributed-Event-Bus.md +++ b/docs/en/Distributed-Event-Bus.md @@ -294,4 +294,114 @@ This example; * Adds a selector to allow to publish the create, update and delete events for the `Product` entity. * Configure to use the `ProductEto` as the event transfer object to publish for the `Product` related events. -> Distributed event system use the [object to object mapping](Object-To-Object-Mapping.md) system to map `Product` objects to `ProductEto` objects. So, you need to configure the object mapping (`Product` -> `ProductEto`) too. You can check the [object to object mapping document](Object-To-Object-Mapping.md) to learn how to do it. \ No newline at end of file +> Distributed event system use the [object to object mapping](Object-To-Object-Mapping.md) system to map `Product` objects to `ProductEto` objects. So, you need to configure the object mapping (`Product` -> `ProductEto`) too. You can check the [object to object mapping document](Object-To-Object-Mapping.md) to learn how to do it. + +## Outbox / Inbox for Transactional Events + +The **[transactional outbox pattern](https://microservices.io/patterns/data/transactional-outbox.html)** is used to publishing distributed events within the **same transaction** that manipulates the application's database. When you enable outbox, distributed events are saved into the database inside the same transaction with your data changes, then sent to the actual message broker by a separate [background worker](Background-Workers.md) with a re-try system. In this way, it ensures the consistency between your database state and the published events. + +The **transactional inbox pattern**, on the other hand, saves incoming events into database first. Then (in a [background worker](Background-Workers.md)) executes the event handler in a transactional manner and removes the event from the inbox queue in the same transaction. It ensures that the event is only executed one time by keeping the processed messages for a while and discarding the duplicate events received from the message broker. + +Enabling the event outbox and inbox systems require a few manual steps for your application. Please apply the instructions in the following sections to make them running. + +> Outbox and Inbox can be separately enabled and configured, so you may only use one of them if you want. + +### Pre-requirements + +* The outbox/inbox system uses the distributed lock system to handle concurrency when you run multiple instances of your application/service. So, you should **configure the distributed lock system** with one of the providers as [explained in this document](Distributed-Locking.md). +* The outbox/inbox system supports [Entity Framework Core](Entity-Framework-Core.md) (EF Core) and [MongoDB](MongoDB.md) **database providers** out of the box. So, your applications should use one of these database providers. For other database providers, see the *Implementing a Custom Database Provider* section. + +> If you are using MongoDB, be sure that you enabled multi-document database transactions that was introduced in MongoDB version 4.0. See the *Transactions* section of the [MongoDB](MongoDB.md) document. + +### Enabling event outbox + +Open your `DbContext` class (EF Core or MongoDB), implement the `IHasEventOutbox` interface. You should end up by adding a `DbSet` property into your `DbContext` class: + +```csharp +public DbSet OutgoingEvents { get; set; } +``` + +Add the following lines inside the `OnModelCreating` method of your `DbContext` class (only for EF Core): + +```csharp +builder.ConfigureEventOutbox(); +``` + +For EF Core, use the standard `Add-Migration` and `Update-Database` commands to apply changes into your database (you can skip this step for MongoDB). If you want to use the command-line terminal, run the following commands in the root directory of the database integration project: + +```bash +dotnet ef migrations add "Added_Event_Outbox" +dotnet ef database update +``` + +Finally, write the following configuration code inside the `ConfigureServices` method of your [module class](Module-Development-Basics.md) (replace `YourDbContext` with your own `DbContext` class): + +````csharp +Configure(options => +{ + options.Outboxes.Configure(config => + { + config.UseDbContext(); + }); +}); +```` + +### Enabling event inbox + +Open your `DbContext` class (EF Core or MongoDB), implement the `IHasEventInbox` interface. You should end up by adding a `DbSet` property into your `DbContext` class: + +```csharp +public DbSet IncomingEvents { get; set; } +``` + +Add the following lines inside the `OnModelCreating` method of your `DbContext` class (only for EF Core): + +```csharp +builder.ConfigureEventInbox(); +``` + +For EF Core, use the standard `Add-Migration` and `Update-Database` commands to apply changes into your database (you can skip this step for MongoDB). If you want to use the command-line terminal, run the following commands in the root directory of the database integration project: + +```bash +dotnet ef migrations add "Added_Event_Inbox" +dotnet ef database update +``` + +Finally, write the following configuration code inside the `ConfigureServices` method of your [module class](Module-Development-Basics.md) (replace `YourDbContext` with your own `DbContext` class): + +````csharp +Configure(options => +{ + options.Inboxes.Configure(config => + { + config.UseDbContext(); + }); +}); +```` + +### Advanced Topics + +#### Implementing a Custom Database Provider + +If your application or service is using a database provider other than EF Core and MongoDB, you should manually integrate outbox/inbox system with your database provider. + +> Outbox and Inbox table/data must be stored in the same database with your application's data (since we want to create a single database transaction that includes application's database operations and outbox/inbox table operations). Otherwise, you should care about distributed (multi-database) transaction support which is not provided by most of the vendors and may require additional configuration. + +ABP provides `IEventOutbox` and `IEventInbox` abstractions as extension point for the outbox/inbox system. You can create classes by implementing these interfaces and register them to [dependency injection](Dependency-Injection.md). + +Once you implement your custom event boxes, you can configure `AbpDistributedEventBusOptions` to use your event box classes: + +````csharp +Configure(options => +{ + options.Outboxes.Configure(config => + { + config.ImplementationType = typeof(MyOutbox); //Your Outbox class + }); + + options.Inboxes.Configure(config => + { + config.ImplementationType = typeof(MyInbox); //Your Inbox class + }); +}); +```` \ No newline at end of file From 21213cf528387dcfecd435205ecead0a956db4b3 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 10 May 2022 10:13:40 +0300 Subject: [PATCH 041/161] Update CLI.md --- docs/en/CLI.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 8931220705..01f7a92b2f 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -92,8 +92,10 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `--tiered`: Creates a tiered solution where Web and Http API layers are physically separated. If not specified, it creates a layered solution which is less complex and suitable for most scenarios. * `angular`: Angular UI. There are some additional options for this template: * `--separate-identity-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side. + * `--pwa`: Specifies the project as Progressive Web Application. * `blazor`: Blazor UI. There are some additional options for this template: * `--separate-identity-server`The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side. + * `--pwa`: Specifies the project as Progressive Web Application. * `blazor-server`: Blazor Server UI. There are some additional options for this template: * `--tiered`: The Identity Server and the API Host project comes as separate projects and run at different endpoints. It has 3 startup projects: *HttpApi.Host*, *IdentityServer* and *Blazor* and and each runs on different endpoints. If not specified, you will have a single endpoint for your web project. * `none`: Without UI. No front-end layer will be created. There are some additional options for this template: @@ -115,7 +117,6 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. - * `--pwa`: Specifies to Configure Angular or Blazor WebAssembly project as Progressive Web Application. * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version. * `--preview`: Use latest preview version. From 70e0e1cf37c6f8d021d76c7079587af693166519 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Tue, 10 May 2022 11:39:54 +0300 Subject: [PATCH 042/161] quick fix --- .../2022-05-09 v5_3_Preview/POST.md | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index e1b0afaa76..5349eeecf3 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -8,7 +8,7 @@ Please try this version and provide feedback for a more stable ABP version 5.3! ## Get Started with the 5.3 RC -Follow the steps below to try the version 5.3.0 RC today: +Follow the steps below to try version 5.3.0 RC today: 1) **Upgrade** the ABP CLI to version `5.3.0-rc.1` using a command line terminal: @@ -36,7 +36,7 @@ You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https:// ## Migration Notes & Breaking Changes -There is only one breaking changes in this version upgrade and it's explained below. +There is only one breaking change in this version upgrade and it's explained below. * Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to upgrade your projects that use the **AutoMapper** library (your `*.Application` project etc.) to **netstandard2.1** or **net6**. See [#12189](https://github.com/abpframework/abp/pull/12189). @@ -46,7 +46,7 @@ In this section, I will introduce some major features released with this version * Single-layer option added to the [*Get Started*](https://abp.io/get-started) page * PWA Support for Startup Templates -* Introduce the `Volo.Abp.Gdpr.Abstractions` package +* Introduced the `Volo.Abp.Gdpr.Abstractions` package * Batch Publish Events from Outbox to the Event Bus * Improvements on **eShopOnAbp** Project & E-Book Announcement * LeptonX Lite Documentations & Project Status & Roadmap @@ -64,26 +64,26 @@ We've created a new startup template named `app-nolayers` and [announced](https: ### PWA Support for Startup Templates -With v5.3 ABP supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. +ABP v5.3 now supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. Example: ```bash abp new MyProgressiveWebApp -t app -u blazor --pwa ``` -### Introduce the `Volo.Abp.Gdpr.Abstractions` package +### Introducing the `Volo.Abp.Gdpr.Abstractions` Package -A new `Volo.Abp.Gdpr.Abstractions` package is added to the framework. +A new `Volo.Abp.Gdpr.Abstractions` package has been added to the framework. Anyone can use this package to use the pre-defined ETOs and implement GDPR-related operations for their own applications. -In that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. +At that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. > Please see the **GDPR Module** section below to learn more about this module. ### Batch Publish Events from Outbox to the Event Bus -We've introduced the "Transactional Outbox & Inbox Patterns" in [**v5.0**](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released), it was one of the most awaited features by distributed software developers. +We introduced the "Transactional Outbox & Inbox Patterns" in [**ABP v5.0**](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released), it was one of the most awaited features by several software developers. We've made some optimizations for the **Batch Event Publishing** in this version, you can examine the related development from [here](https://github.com/abpframework/abp/pull/11243). After the optimization, the results are impressive. @@ -98,19 +98,19 @@ We've made some optimizations for the **Batch Event Publishing** in this version ### Improvements on eShopOnAbp Project & E-Book Announcement -There are some developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of the some of the improvements below: +There are some developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of some of the improvements below: * Local certificates have been created to use while working in Kubernetes and also Helm Charts have been updated. See [#107](https://github.com/abpframework/eShopOnAbp/pull/107). * The Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). -* Database migration event handlers have been removed and "Distributed Locking" used for database migrations. See [#85](https://github.com/abpframework/eShopOnAbp/pull/85) and [#102](https://github.com/abpframework/eShopOnAbp/pull/102). +* Database migration event handlers have been removed and "Distributed Locking" is now used for database migrations. See [#85](https://github.com/abpframework/eShopOnAbp/pull/85) and [#102](https://github.com/abpframework/eShopOnAbp/pull/102). * Switched from Ocelot to YARP as the gateway. See [#97](https://github.com/abpframework/eShopOnAbp/pull/97). We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the **eShopOnAbp** project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. -We're planning to create this book in nine chapters and make it available after the three chapter is written. You will be able to download this free e-book from the [abp.io](https://abp.io/) website. You can see the title of these three chapters below: +We're planning to create this book in nine chapters and make it available after the third chapter is written. You will be able to download this free e-book from the [abp.io](https://abp.io/) website. You can see the title of these three chapters below: - Chapter 1 : Introduction (This chapter explains the main problems of microservice development and the purpose of the eShopOnAbp solution.) -- Chapter 2 : Running the Solution (This chapter explains the various ways to run the solution such as using the Microsoft's Tye tool.) +- Chapter 2 : Running the Solution (This chapter explains the various ways to run the solution such as using Microsoft's Tye tool.) - Chapter 3 : Understanding the authentication system (This chapter explains the authentication system used in the **eShopOnAbp** solution.) ### LeptonX Lite Documentations & Project Status & Roadmap @@ -121,9 +121,9 @@ It is finally here, we've released the **1.0.0-beta.1** version for the **Lepton Lepton X Lite documents have been written for the three UI types within this version. You can see the related documentation from the screenshot above. You can follow these documents and try the new **LeptonX Lite Theme**. -We don't suggest using the **beta.1** version on production but we highly demand you to test the **LeptonX Lite** and provide feedback to us. It's really important for us to be able to release a more stable version. Thanks in advance. +We don't suggest using the **beta.1** version on production, we highly demand you to test **LeptonX Lite** and provide feedback to us. It's really important for us to be able to release a more stable version. Thanks in advance. -For the following versions (beta.2 and RC versions), we will focus on; +For the following versions (beta.2 and RC versions), we will focus on: * Fixing the reported bugs from the community * Providing documentations as much as possible @@ -133,11 +133,11 @@ For the following versions (beta.2 and RC versions), we will focus on; We have [announced the plan of replacing the IdentityServer](https://github.com/abpframework/abp/issues/11989). ABP currently uses **IdentityServer4** to add **OAuth** features as built-in on the server-side. However, since *IdentityServer4's support ends at the end of the year 2022*. Its replacement is Duende IdentityServer, which is not a free software anymore. (see [more](https://blog.duendesoftware.com/posts/20220111_fair_trade/)) -Therefore, we've decided to completely drop the **IdentityServer4** from the ABP platform and implementing the [OpenIddict](https://github.com/openiddict/openiddict-core) and making it installed into the startup templates. +Therefore, we've decided to completely drop the **IdentityServer4** from the ABP platform and implement the [OpenIddict](https://github.com/openiddict/openiddict-core) and install onto the startup templates. -We've implemented both open source and commercial OpenIddict modules, we plan to remove Identity Server and replace it with OpenIddict for template projects in **v5.4**. Please check [#12084](https://github.com/abpframework/abp/pull/12084) to see the development made on the open-source side. +We've implemented both open source and commercial OpenIddict modules, we plan to remove Identity Server and replace it with OpenIddict for template projects in **ABP v5.4**. Please check [#12084](https://github.com/abpframework/abp/pull/12084) to see the development made on the open-source side. -We're creating the documentation for OpenIddict Module, if you want to have general knowledge about this module, you can check the documentation from [here](https://github.com/abpframework/abp/blob/dev/docs/en/Modules/OpenIddict.md). Currently, this is a draft documentation but it gives overall knowledge about OpenIddict Module, we'll complete this documentation in v5.4 and you'll be able to read it completely. +We're creating the documentation for the OpenIddict Module, if you want to have general knowledge about this module, you can check the documentation from [here](https://github.com/abpframework/abp/blob/dev/docs/en/Modules/OpenIddict.md). Currently, this is a draft documentation but it gives overall knowledge about the OpenIddict Module, we'll complete this documentation in ABP v5.4 and you'll be able to read it completely. Currently, we are also working on Keycloak integration possibilities in parallel to the OpenIddict integration research and we've prepared some samples that you can examine. You can see [#154](https://github.com/abpframework/abp-samples/pull/154) and [#158](https://github.com/abpframework/abp-samples/pull/158). @@ -153,12 +153,12 @@ In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Dep ### Other News -* Global Features was only accessible from the C# code. From this version, Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). -* Get the user's detailed information (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). +* Global Features were only accessible from the C# code. From this version and on, Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). +* Getting the user's detailed information (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). * Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). * A bug has been reported to us about a plain password leak on the `AbpAuditLogActions` table for the **TenantCreateDto.AdminPassword**. We've [fixed this problem](https://github.com/abpframework/abp/pull/12499), and it will be available in the next release. -If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all issues and pull requests closed with this version. +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all the issues and pull requests closed with this version. ## What's New with ABP Commercial 5.3? @@ -168,13 +168,13 @@ If you want to see more details, you can check [the release on GitHub](https://g With this version, we are introducing the new **GDPR Module**. This was one of the most awaited features, so we've prioritized it and implemented it in this version. -GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. +The GDPR Module is pre-installed in the [startup templates](https://docs.abp.io/en/commercial/5.3/startup-templates/index) for MVC. So, no need to manually install it. When you create a new startup template, you can directly use this module. We'll also implement this module for the other UI types as soon as possible and also add extra functionality such as "Cookie Consent" and more. Currently, there are two main functions of this module and they are "Download Personal Data" and "Delete Personal Data". ![](./gdpr-user-menu.png) -There is a "Personal Data" section in the user menu like in the screenshot above and when you click on this section, you'll be redirected to the "Personal Data" page. On that page, you can either request to "Download Personal Data" or "Delete Personal Data". +There is a "Personal Data" section in the user menu as in the screenshot above and when you click on this section, you'll be redirected to the "Personal Data" page. On that page, you can either request to "Download Personal Data" or "Delete Personal Data". ![](./gdpr-personal-data-page.png) @@ -194,7 +194,7 @@ Also, there is an admin side of the Polling Feature. You can easily manage your ### OAuth Resource Owner Password as External Login Provider -> The Resource Owner Password flow allows for the exchanging of the user name and password of a user for an access token. When using the resource owner password credentials grant, the user provides the credentials (user name and password) directly to the application. +> The Resource Owner Password flow allows for the exchanging of the username and password of a user for an access token. When using the resource owner password credentials grant, the user provides the credentials (username and password) directly to the application. Thanks to that you can login by providing a username and password from an External Login Provider. @@ -207,8 +207,8 @@ Thanks to that you can login by providing a username and password from an Extern In this version, there are some enhancements and new features in **Suite** and they are listed briefly below: * It's now possible to create an **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for the **app-nolayers** template with this version. -* With this version, Suite allows users to see and download their logs. -* Suite allows generating code via CLI. If you have JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. +* Suite now allows users to see and download their logs. +* Suite now allows generating code via CLI. If you have a JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. *Example:* @@ -228,14 +228,14 @@ You can watch the event from [here](https://www.youtube.com/watch?v=RFArBh60RSA& Dockerfiles, docker-compose files and build script files have been added to the Single Layer Startup Template (app-nolayers) with this version. -In this way, applications created with this template now can be deployed more easily. +And this way, applications created with this template now can be deployed more easily. ### Microservice Solution Enhancements There are some enhancements made in the Microservice Solution. You can see the list of these enhancements: -* Initial migration on the template has been updated for the small improvement that was made in the **Language Management** module. -* Database migration event handlers have been removed and "Distributed Locking" used for the database migrations. +* Initial migration on the template has been updated with the small improvement that was made in the **Language Management** module. +* Database migration event handlers have been removed and "Distributed Locking" is now used for the database migrations. ### PWA Support for the Application Pro Template @@ -253,10 +253,10 @@ abp new MyProgressiveWebApp -t app-pro -u blazor --pwa * [Anto Subash](https://twitter.com/antosubash) created a series named ["Microservice with ABP"](https://blog.antosubash.com/posts/abp-microservice-series) and shared a couple of video posts about the ABP Microservice solution. * [Francisco Kadzi](https://github.com/CiscoNinja) has created his first ABP Community article that shows how to ["Customize ABP Angular Application UI with AdminLTE"](https://community.abp.io/posts/customize-abp-angular-application-ui-with-adminlte.-7qu1m67s). * [Jack Fistelmann](https://github.com/nebula2) has created an article to introduce a helpful project extension to speed up development on Visual Studio. You can read the article [here](https://community.abp.io/posts/using-switch-startup-project-extension-for-visual-studio-52yyw27v). -* [Jack Fistelmann](https://github.com/nebula2) has also created an article to show how you can generate PDF files with the `Sycyber.Core` package in an ABP-based applications. You can read from [here](https://community.abp.io/posts/generate-pdfs-in-an-abp-framework-project-using-scryber.core-x9yh1vfa). -* [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show how to ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. +* [Jack Fistelmann](https://github.com/nebula2) has also created an article to show how you can generate PDF files with the `Sycyber.Core` package in ABP-based applications. You can read it [here](https://community.abp.io/posts/generate-pdfs-in-an-abp-framework-project-using-scryber.core-x9yh1vfa). +* [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has created an article to show ["Dealing with Multiple Implementations of a Service in ASP.NET Core & ABP Dependency Injection"](https://community.abp.io/posts/dealing-with-multiple-implementations-of-a-service-in-asp.net-core-abp-dependency-injection-ysfp4ho2) with examples. * [Manoj Kumar](https://community.abp.io/members/manojkumar.t@shloklabs.com) submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). -* [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read from [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). +* [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read it [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). ### ABP Community Talks 2022.4 - "How can you contribute to the open source ABP Framework?" (May 10, 2022 - 17:00 UTC) @@ -266,11 +266,11 @@ We've [asked you to pick the topic of the next Community Talks](https://twitter. > You can register for the event from [here](https://kommunity.com/volosoft/events/abp-community-talks-20224-how-to-contribute-to-the-open-source-abp-framework-d9b50664), if you haven't registered yet. -You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) to inform about further ABP events and videos. +You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) to be informed about future ABP events and videos. ### Discord Server -We've created an official ABP Discord server so the ABP Community can interact with each other and create a blog-post to introduce it. You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about ABP Discord Server. +We've created an official ABP Discord server so the ABP Community can interact with each other and created a blog-post to introduce it. You can read the [ABP Discord Server announcement post](https://blog.abp.io/abp/Official-ABP-Discord-Server-is-Here) to learn more about the ABP Discord Server. Thanks to the ABP Community, **700+** people joined our Discord Server so far and it grows every day. From 35ee7dd3b1d9b7a0081abb4d7fa4844b1fcdb145 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 10 May 2022 17:28:17 +0800 Subject: [PATCH 043/161] Fix the `ValueEquals` bug. Resolve #12509 --- .../Volo/Abp/Domain/Values/ValueObject.cs | 24 ++++++++++++------- .../Volo/Abp/Domain/Values/Address.cs | 10 +++++++- .../Abp/Domain/Values/ValueObject_Tests.cs | 10 ++++++-- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs index 8d7f5f37b1..ff6fef3def 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs @@ -16,21 +16,29 @@ public abstract class ValueObject return false; } - ValueObject other = (ValueObject)obj; + var other = (ValueObject)obj; - IEnumerator thisValues = GetAtomicValues().GetEnumerator(); - IEnumerator otherValues = other.GetAtomicValues().GetEnumerator(); + var thisValues = GetAtomicValues().GetEnumerator(); + var otherValues = other.GetAtomicValues().GetEnumerator(); - while (thisValues.MoveNext() && otherValues.MoveNext()) + var thisMoveNext = thisValues.MoveNext(); + var otherMoveNext = otherValues.MoveNext(); + while (thisMoveNext && otherMoveNext) { - if (ReferenceEquals(thisValues.Current, null) ^ - ReferenceEquals(otherValues.Current, null)) + if (ReferenceEquals(thisValues.Current, null) ^ ReferenceEquals(otherValues.Current, null)) { return false; } - if (thisValues.Current != null && - !thisValues.Current.Equals(otherValues.Current)) + if (thisValues.Current != null && !thisValues.Current.Equals(otherValues.Current)) + { + return false; + } + + thisMoveNext = thisValues.MoveNext(); + otherMoveNext = otherValues.MoveNext(); + + if (thisMoveNext != otherMoveNext) { return false; } diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/Address.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/Address.cs index 7ec96848a4..cee2c8c379 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/Address.cs +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/Address.cs @@ -11,6 +11,8 @@ public class Address : ValueObject public int Number { get; } + public string[] Tags { get; } + private Address() { } @@ -18,11 +20,13 @@ public class Address : ValueObject public Address( Guid cityId, string street, - int number) + int number, + params string[] tags) { CityId = cityId; Street = street; Number = number; + Tags = tags; } //Requires to implement this method to return properties. @@ -31,5 +35,9 @@ public class Address : ValueObject yield return Street; yield return CityId; yield return Number; + foreach (var tag in Tags) + { + yield return tag; + } } } diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/ValueObject_Tests.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/ValueObject_Tests.cs index a4a0f9c44f..144d4350d3 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/ValueObject_Tests.cs +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Values/ValueObject_Tests.cs @@ -10,8 +10,9 @@ public class ValueObject_Tests public void ValueObjects_With_Same_Properties_Should_Be_Equals() { var cityId = Guid.NewGuid(); - var address1 = new Address(cityId, "Baris Manco", 42); - var address2 = new Address(cityId, "Baris Manco", 42); + + var address1 = new Address(cityId, "Baris Manco", 42, "home", "office"); + var address2 = new Address(cityId, "Baris Manco", 42, "home", "office"); address1.ValueEquals(address2).ShouldBeTrue(); } @@ -25,5 +26,10 @@ public class ValueObject_Tests var address2 = new Address(cityId, "Baris Manco", 43); address1.ValueEquals(address2).ShouldBeFalse(); + + address1 = new Address(cityId, "Baris Manco", 42, "home", "office"); + address2 = new Address(cityId, "Baris Manco", 42, "home"); + + address1.ValueEquals(address2).ShouldBeFalse(); } } From 76fcc850c30696420d13c5ac2847580aecc849a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 10 May 2022 13:02:24 +0300 Subject: [PATCH 044/161] Minor revisions in the blog post --- .../2022-05-09 v5_3_Preview/POST.md | 57 +++++++------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md index 5349eeecf3..b23dab0cd1 100644 --- a/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-05-09 v5_3_Preview/POST.md @@ -34,11 +34,11 @@ See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all t You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)**. -## Migration Notes & Breaking Changes +## Migration Notes -There is only one breaking change in this version upgrade and it's explained below. +There is a change in this version that may effect your applications: -* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to upgrade your projects that use the **AutoMapper** library (your `*.Application` project etc.) to **netstandard2.1** or **net6**. See [#12189](https://github.com/abpframework/abp/pull/12189). +* Upgraded the [AutoMapper](https://github.com/AutoMapper/AutoMapper) library to **v11.0.1**. So, you need to change your project's target SDK that use the **AutoMapper** library (typically your `*.Application` project). You can change it from `netstandard2.0` to `netstandard2.1` or `net6` if needed. You can write to [#12189](https://github.com/abpframework/abp/pull/12189) if you need any help. ## What's New with ABP Framework 5.3? @@ -58,13 +58,14 @@ In this section, I will introduce some major features released with this version We've created a new startup template named `app-nolayers` and [announced](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) it in the previous version. In this version, we've also added this startup template option to the *Get Started* page. -*You can examine the screenshot below to see how to create an `app-nolayers` template from the ["Get Started"](https://abp.io/get-started) page.* +*You can examine the screenshot below to see how to create an `app-nolayers` template from the ["Get Started"](https://abp.io/get-started) page:* ![](./app-nolayers-get-started.png) ### PWA Support for Startup Templates -ABP v5.3 now supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. +ABP v5.3 application startup template now supports PWA for Blazor WASM & Angular UIs. To create a startup template with the PWA support, you can use the `--pwa` parameter. + Example: ```bash @@ -73,9 +74,7 @@ abp new MyProgressiveWebApp -t app -u blazor --pwa ### Introducing the `Volo.Abp.Gdpr.Abstractions` Package -A new `Volo.Abp.Gdpr.Abstractions` package has been added to the framework. - -Anyone can use this package to use the pre-defined ETOs and implement GDPR-related operations for their own applications. +A new `Volo.Abp.Gdpr.Abstractions` package has been added to the framework. This is an abstraction package, so doesn't contain any actual GDPR implementation. It defines some classes and interfaces to put a standard for who want to implement a GDPR module that can run in a modular or microservice system. At that point, we are introducing the **GDPR Module** for the ABP Commercial customers and this module does the GDPR-related operations on behalf of you, such as *"Download/Delete Personal Data"*. I'll describe the **GDPR Module** later in this blog post. @@ -85,33 +84,20 @@ At that point, we are introducing the **GDPR Module** for the ABP Commercial cus We introduced the "Transactional Outbox & Inbox Patterns" in [**ABP v5.0**](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released), it was one of the most awaited features by several software developers. -We've made some optimizations for the **Batch Event Publishing** in this version, you can examine the related development from [here](https://github.com/abpframework/abp/pull/11243). After the optimization, the results are impressive. - -| | Before | After | -|---|---|---| -| **RabbitMQ** | 50080ms | 547ms | -| **Kafka** | 15303ms | 475ms | -| **Azure (Remote Service)** | 116157ms | 1534ms | -| **Rebus (RabbitMQ transport)** | 26094ms | 560ms | - -*You can see the optimization results above for "Batch Publishing (1000 Events)"* +We've made some optimizations for the **Batch Event Publishing** in this version, you can examine the related development from [here](https://github.com/abpframework/abp/pull/11243). After the optimization, the results are impressive. It is enabled by default (if you have configured [event outbox](https://docs.abp.io/en/abp/latest/Distributed-Event-Bus#outbox-inbox-for-transactional-events)), so you don't need to any manual configuration. ### Improvements on eShopOnAbp Project & E-Book Announcement -There are some developments on the **eShopOnAbp** project made in this version. You can see the brief descriptions of some of the improvements below: +There are some developments on the [eShopOnAbp project](https://github.com/abpframework/eShopOnAbp) made in this version. You can see the brief descriptions of some of the improvements below: * Local certificates have been created to use while working in Kubernetes and also Helm Charts have been updated. See [#107](https://github.com/abpframework/eShopOnAbp/pull/107). * The Order Management page has been created. See [#92](https://github.com/abpframework/eShopOnAbp/pull/92). * Database migration event handlers have been removed and "Distributed Locking" is now used for database migrations. See [#85](https://github.com/abpframework/eShopOnAbp/pull/85) and [#102](https://github.com/abpframework/eShopOnAbp/pull/102). * Switched from Ocelot to YARP as the gateway. See [#97](https://github.com/abpframework/eShopOnAbp/pull/97). -We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the **eShopOnAbp** project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. +We have exciting news to share with the community, we're working on an "ABP Microservice Development" e-book. In this book, we're using the eShopOnAbp project as a reference microservice solution and we're trying to explain our experiences during the microservice application development process through this project. -We're planning to create this book in nine chapters and make it available after the third chapter is written. You will be able to download this free e-book from the [abp.io](https://abp.io/) website. You can see the title of these three chapters below: - -- Chapter 1 : Introduction (This chapter explains the main problems of microservice development and the purpose of the eShopOnAbp solution.) -- Chapter 2 : Running the Solution (This chapter explains the various ways to run the solution such as using Microsoft's Tye tool.) -- Chapter 3 : Understanding the authentication system (This chapter explains the authentication system used in the **eShopOnAbp** solution.) +We're planning to create this book in nine chapters and make it available after the third chapter is written. After that, you will be able to download this free e-book from the [abp.io](https://abp.io/) website. ### LeptonX Lite Documentations & Project Status & Roadmap @@ -147,8 +133,6 @@ Deploying an ABP-based application is not so different than deploying any .NET o ![](./deployment-documentation.png) -We've created two new deployment documents, you can find them under the ["Deployment"](https://docs.abp.io/en/abp/5.3/Deployment/Index) section of our documentation website. - In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Deployment/Clustered-Environment) documentation, we've documented the topics that you should consider when you are developing your application to a clustered environment and explained how you can deal with these topics in your ABP-based application. ### Other News @@ -156,7 +140,6 @@ In the [Deploying to a Clustered Environment](https://docs.abp.io/en/abp/5.3/Dep * Global Features were only accessible from the C# code. From this version and on, Global Features can be also provided from application configurations. See [#12043](https://github.com/abpframework/abp/pull/12043). * Getting the user's detailed information (name, surname and phone number) from external login. See [#12085](https://github.com/abpframework/abp/pull/12085). * Date Pipes for Angular. See [#11909](https://github.com/abpframework/abp/issues/11909). -* A bug has been reported to us about a plain password leak on the `AbpAuditLogActions` table for the **TenantCreateDto.AdminPassword**. We've [fixed this problem](https://github.com/abpframework/abp/pull/12499), and it will be available in the next release. If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all the issues and pull requests closed with this version. @@ -182,13 +165,11 @@ After you've requested to download "Personal Data", you need to wait for 1 hour ### CMS Kit Pro - Polling Feature -We've added the new **Polling** feature to the **CMS Kit Pro** module. This feature allows you to use a questionnaire/voting system in your application easily. - -You can create a question, define some options for it and the poll will be created for you. You can see the example poll in the screenshot below. +We've added a **Polling** feature to the **CMS Kit Pro** module. This feature allows you to use a questionnaire/voting system in your application easily. You can create a question, define some options for it and the poll will be created for you. You can see the example poll in the screenshot below: ![](./poll-question-example.png) -Also, there is an admin side of the Polling Feature. You can easily manage your polls in your admin (back-office) project. You can create, update, delete and show the results of the poll on the Polls page. +Also, there is an admin side of the Polling Feature. You can easily manage your polls in your admin (back-office) project. You can create, update, delete and show the results of the poll on the Polls page: ![](./poll-questions.png) @@ -196,9 +177,9 @@ Also, there is an admin side of the Polling Feature. You can easily manage your > The Resource Owner Password flow allows for the exchanging of the username and password of a user for an access token. When using the resource owner password credentials grant, the user provides the credentials (username and password) directly to the application. -Thanks to that you can login by providing a username and password from an External Login Provider. +Now, you can login by entering a username and password from an OAuth server. -*Example: Use OAuth external login provider with Keycloak* +Example: Use OAuth external login provider with Keycloak: ![](./oauth-external-provider.gif) @@ -207,16 +188,16 @@ Thanks to that you can login by providing a username and password from an Extern In this version, there are some enhancements and new features in **Suite** and they are listed briefly below: * It's now possible to create an **app-nolayers (Application - single layer)** template via Suite and also code-generation is supported for the **app-nolayers** template with this version. -* Suite now allows users to see and download their logs. +* Suite now allows users to see and download its logs. * Suite now allows generating code via CLI. If you have a JSON file that contains code blocks, like entity configurations, you can use the `abp suite generate` command to generate CRUD pages based on it. -*Example:* +Example: ```bash abp suite generate -e C:\Users\.suite\entities\Country.json -s C:\Users\my-proj\SuiteProj\SuiteProj.sln ``` -### Suite Webinar (Take a closer look at the code generation: ABP Suite) +### Suite Webinar: Take a closer look at the code generation ![](./webinar.png) @@ -258,7 +239,7 @@ abp new MyProgressiveWebApp -t app-pro -u blazor --pwa * [Manoj Kumar](https://community.abp.io/members/manojkumar.t@shloklabs.com) submitted a new article about how to use "ABP authentication in a Flutter application". It was a frequently asked topic, which you can read [here](https://community.abp.io/posts/flutter-web-authentication-from-abp-mp6l2ehx). * [Engincan Veske](https://twitter.com/EngincanVeske) created a new Community Article to show "Concurrency Check/Control in ABP". You can read it [here](https://community.abp.io/posts/handle-concurrency-with-ef-core-in-an-abp-framework-project-with-asp.net-core-mvc-jlkc3w8f). -### ABP Community Talks 2022.4 - "How can you contribute to the open source ABP Framework?" (May 10, 2022 - 17:00 UTC) +### ABP Community Talks 2022.4: How can you contribute to the open source ABP Framework? (May 10, 2022 - 17:00 UTC) ![](./community-talks-2022.4.png) From 52c7d253ab7bb38d383e151995daeb04790d52f2 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 10 May 2022 13:58:57 +0300 Subject: [PATCH 045/161] Tag-Helpers: Support for TextArea in html --- .../TagHelpers/Form/AbpInputTagHelperService.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index 92bfc9ddb3..749f1fc935 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -113,7 +113,7 @@ public class AbpInputTagHelperService : AbpTagHelperService protected virtual TagHelper GetInputTagHelper(TagHelperContext context, TagHelperOutput output) { - if (TagHelper.AspFor.ModelExplorer.GetAttribute

    ZSIv(Tb?D;e3(4t3^E^YcW>eQ-1599&lNR>GX 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�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

    xVdUpqH1tfLU#4pEto* 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�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 LK^n#_jZgRI_2kXUmP3VbL*@ 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