From 71378a04403dd1e7041c1e7b2d454cfa56b2f3ce Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Tue, 14 Dec 2021 04:28:14 +0300 Subject: [PATCH 01/16] Add Odin --- components.js | 2 +- components.json | 4 + components/prism-odin.js | 61 ++++++ components/prism-odin.min.js | 1 + examples/prism-odin.html | 12 ++ tests/languages/odin/boolean_feature.test | 13 ++ tests/languages/odin/character_feature.test | 147 +++++++++++++++ tests/languages/odin/comment_feature.test | 90 +++++++++ .../failed_multiline_comment_feature.test | 9 + tests/languages/odin/keyword_feature.test | 77 ++++++++ .../odin/not_a_character_feature.test | 43 +++++ .../languages/odin/not_a_number_feature.test | 55 ++++++ tests/languages/odin/number_feature.test | 129 +++++++++++++ tests/languages/odin/operator_feature.test | 121 ++++++++++++ tests/languages/odin/raw_string_feature.test | 79 ++++++++ tests/languages/odin/string_feature.test | 178 ++++++++++++++++++ 16 files changed, 1020 insertions(+), 1 deletion(-) create mode 100644 components/prism-odin.js create mode 100644 components/prism-odin.min.js create mode 100644 examples/prism-odin.html create mode 100644 tests/languages/odin/boolean_feature.test create mode 100644 tests/languages/odin/character_feature.test create mode 100644 tests/languages/odin/comment_feature.test create mode 100644 tests/languages/odin/failed_multiline_comment_feature.test create mode 100644 tests/languages/odin/keyword_feature.test create mode 100644 tests/languages/odin/not_a_character_feature.test create mode 100644 tests/languages/odin/not_a_number_feature.test create mode 100644 tests/languages/odin/number_feature.test create mode 100644 tests/languages/odin/operator_feature.test create mode 100644 tests/languages/odin/raw_string_feature.test create mode 100644 tests/languages/odin/string_feature.test diff --git a/components.js b/components.js index d7476e6430..01df0e17a4 100644 --- a/components.js +++ b/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":["css","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","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"},"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"},"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":["css","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"},"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"},"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","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"},"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/components.json b/components.json index 6a8e75281c..025e5a7b83 100644 --- a/components.json +++ b/components.json @@ -919,6 +919,10 @@ "title": "OCaml", "owner": "Golmote" }, + "odin": { + "title": "Odin", + "owner": "edukisto" + }, "opencl": { "title": "OpenCL", "require": "c", diff --git a/components/prism-odin.js b/components/prism-odin.js new file mode 100644 index 0000000000..cdcabcb166 --- /dev/null +++ b/components/prism-odin.js @@ -0,0 +1,61 @@ +(function (Prism) { + var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/.source; + + function withEscapes(pattern, flags) { + return RegExp(pattern.replace(//g, escapes), flags); + } + + Prism.languages.odin = { + /** + * The current implementation of multiline comments doesn't support nesting. + */ + 'comment': [ + { + pattern: /\/\*[\S\s]*?(?:\*\/|$)/, + greedy: true + }, + { + pattern: /#![^\n\r]*/, + greedy: true + }, + { + pattern: /\/\/[^\n\r]*/, + greedy: true + } + ], + + /** + * Should be found before strings because of '"'"- and '`'`-like sequences. + */ + 'char': { + pattern: withEscapes(/'(?:|[^\n\r'\\])'/.source), + inside: { + 'symbol': withEscapes(//.source) + } + }, + + 'string': [ + { + pattern: /`[^`]*`/, + greedy: true + }, + { + pattern: withEscapes(/"(?:|[^\n\r"\\])*"/.source), + greedy: true, + inside: { + 'symbol': withEscapes(//.source) + } + } + ], + + '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]?)/, + + 'boolean': /\b(?:_|false|nil|true)\b/, + + '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/, + + 'function': /\b\w+(?=\()/, + + 'operator': /\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/ + }; +}(Prism)); diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js new file mode 100644 index 0000000000..2a270e5ec5 --- /dev/null +++ b/components/prism-odin.min.js @@ -0,0 +1 @@ +!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*[\S\s]*?(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file diff --git a/examples/prism-odin.html b/examples/prism-odin.html new file mode 100644 index 0000000000..03290e8da8 --- /dev/null +++ b/examples/prism-odin.html @@ -0,0 +1,12 @@ +

Example

+ +
package main
+
+import "core:fmt"
+
+main :: proc() {
+  i: int
+  for i := 0; i < 100; i += 1 {
+    fmt.println(i, " bottles of beer on the wall.\n")
+  }
+}
diff --git a/tests/languages/odin/boolean_feature.test b/tests/languages/odin/boolean_feature.test new file mode 100644 index 0000000000..27c53f23a1 --- /dev/null +++ b/tests/languages/odin/boolean_feature.test @@ -0,0 +1,13 @@ +_ +false +nil +true + +---------------------------------------------------- + +[ + ["boolean", "_"], + ["boolean", "false"], + ["boolean", "nil"], + ["boolean", "true"] +] diff --git a/tests/languages/odin/character_feature.test b/tests/languages/odin/character_feature.test new file mode 100644 index 0000000000..8cf23a548c --- /dev/null +++ b/tests/languages/odin/character_feature.test @@ -0,0 +1,147 @@ +' ' +'!' +'"' +'0' +'\"' +'\'' +'\000' +'\077' +'\U000000' +'\UFFFFFF' +'\Uffffff' +'\\' +'\a' +'\b' +'\e' +'\f' +'\n' +'\r' +'\t' +'\u0000' +'\uFFFF' +'\uffff' +'\v' +'\x00' +'\xFF' +'\xff' +'a' + +---------------------------------------------------- + +[ + ["char", ["' '"]], + ["char", ["'!'"]], + ["char", ["'\"'"]], + ["char", ["'0'"]], + ["char", [ + "'", + ["symbol", "\\\""], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\'"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\000"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\077"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\U000000"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\UFFFFFF"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\Uffffff"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\\\"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\a"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\b"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\e"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\f"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\n"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\r"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\t"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\u0000"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\uFFFF"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\uffff"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\v"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\x00"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\xFF"], + "'" + ]], + ["char", [ + "'", + ["symbol", "\\xff"], + "'" + ]], + ["char", ["'a'"]] +] diff --git a/tests/languages/odin/comment_feature.test b/tests/languages/odin/comment_feature.test new file mode 100644 index 0000000000..f19c363fce --- /dev/null +++ b/tests/languages/odin/comment_feature.test @@ -0,0 +1,90 @@ +/* +*/ +/* A comment */ +/*!*/ +/*""*/ +/*"\a"*/ +/*#!*/ +/*' '*/ +/*'\a'*/ +/**/ +/*//*/ +/*0*/ +/*``*/ +/*`\a`*/ +/*false*/ +/*if*/ +Not a comment /* A comment */ +#! +#! A comment +#!! +#!"" +#!#! +#!' ' +#!/**/ +#!// +#!0 +#!`` +#!false +#!if +Not a comment #! A comment +// +// A comment +//! +//"" +//#! +//' ' +///**/ +//// +//0 +//`` +//false +//if +Not a comment // A comment + +---------------------------------------------------- + +[ + ["comment", "/*\r\n*/"], + ["comment", "/* A comment */"], + ["comment", "/*!*/"], + ["comment", "/*\"\"*/"], + ["comment", "/*\"\\a\"*/"], + ["comment", "/*#!*/"], + ["comment", "/*' '*/"], + ["comment", "/*'\\a'*/"], + ["comment", "/**/"], + ["comment", "/*//*/"], + ["comment", "/*0*/"], + ["comment", "/*``*/"], + ["comment", "/*`\\a`*/"], + ["comment", "/*false*/"], + ["comment", "/*if*/"], + "\r\nNot a comment ", ["comment", "/* A comment */"], + ["comment", "#!"], + ["comment", "#! A comment"], + ["comment", "#!!"], + ["comment", "#!\"\""], + ["comment", "#!#!"], + ["comment", "#!' '"], + ["comment", "#!/**/"], + ["comment", "#!//"], + ["comment", "#!0"], + ["comment", "#!``"], + ["comment", "#!false"], + ["comment", "#!if"], + "\r\nNot a comment ", ["comment", "#! A comment"], + ["comment", "//"], + ["comment", "// A comment"], + ["comment", "//!"], + ["comment", "//\"\""], + ["comment", "//#!"], + ["comment", "//' '"], + ["comment", "///**/"], + ["comment", "////"], + ["comment", "//0"], + ["comment", "//``"], + ["comment", "//false"], + ["comment", "//if"], + "\r\nNot a comment ", ["comment", "// A comment"] +] diff --git a/tests/languages/odin/failed_multiline_comment_feature.test b/tests/languages/odin/failed_multiline_comment_feature.test new file mode 100644 index 0000000000..2555d3025c --- /dev/null +++ b/tests/languages/odin/failed_multiline_comment_feature.test @@ -0,0 +1,9 @@ +/*/**/*/ + +---------------------------------------------------- + +[ + ["comment", "/*/**/"], + ["operator", "*"], + ["operator", "/"] +] diff --git a/tests/languages/odin/keyword_feature.test b/tests/languages/odin/keyword_feature.test new file mode 100644 index 0000000000..c3380bec0b --- /dev/null +++ b/tests/languages/odin/keyword_feature.test @@ -0,0 +1,77 @@ +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 + +---------------------------------------------------- + +[ + ["keyword", "asm"], + ["keyword", "auto_cast"], + ["keyword", "bit_set"], + ["keyword", "break"], + ["keyword", "case"], + ["keyword", "cast"], + ["keyword", "context"], + ["keyword", "continue"], + ["keyword", "defer"], + ["keyword", "distinct"], + ["keyword", "do"], + ["keyword", "dynamic"], + ["keyword", "else"], + ["keyword", "enum"], + ["keyword", "fallthrough"], + ["keyword", "for"], + ["keyword", "foreign"], + ["keyword", "if"], + ["keyword", "import"], + ["keyword", "in"], + ["keyword", "map"], + ["keyword", "matrix"], + ["keyword", "not_in"], + ["keyword", "or_else"], + ["keyword", "or_return"], + ["keyword", "package"], + ["keyword", "proc"], + ["keyword", "return"], + ["keyword", "struct"], + ["keyword", "switch"], + ["keyword", "transmute"], + ["keyword", "typeid"], + ["keyword", "union"], + ["keyword", "using"], + ["keyword", "when"], + ["keyword", "where"] +] diff --git a/tests/languages/odin/not_a_character_feature.test b/tests/languages/odin/not_a_character_feature.test new file mode 100644 index 0000000000..3216f76093 --- /dev/null +++ b/tests/languages/odin/not_a_character_feature.test @@ -0,0 +1,43 @@ +' +' +' ' +'' +'\' +'\0' +'\00' +'\0000' +'\008' +'\u' +'\u0' +'\u00' +'\u000' +'\u00000' +'\uF' +'\uFF' +'\uFFF' +'\uFFFFF' +'\uf' +'\uff' +'\ufff' +'\ufffff' +'\x' +'\x0' +'\x000' +'\xF' +'\xFFF' +'\xf' +'\xfff' + +---------------------------------------------------- + +[ + "'\r\n'\r\n' '\r\n''\r\n'\\'\r\n'\\", + ["number", "0"], + "'\r\n'\\", + ["number", "00"], + "'\r\n'\\", + ["number", "0000"], + "'\r\n'\\", + ["number", "008"], + "'\r\n'\\u'\r\n'\\u0'\r\n'\\u00'\r\n'\\u000'\r\n'\\u00000'\r\n'\\uF'\r\n'\\uFF'\r\n'\\uFFF'\r\n'\\uFFFFF'\r\n'\\uf'\r\n'\\uff'\r\n'\\ufff'\r\n'\\ufffff'\r\n'\\x'\r\n'\\x0'\r\n'\\x000'\r\n'\\xF'\r\n'\\xFFF'\r\n'\\xf'\r\n'\\xfff'" +] diff --git a/tests/languages/odin/not_a_number_feature.test b/tests/languages/odin/not_a_number_feature.test new file mode 100644 index 0000000000..01124560b8 --- /dev/null +++ b/tests/languages/odin/not_a_number_feature.test @@ -0,0 +1,55 @@ +0B0 +0D0 +0I +0O0 +0Z0 +0b +0b2 +0d +0h +0h0 +0h00 +0h000 +0h00000 +0h0000000 +0h000000000 +0h000000000000000 +0h00000000000000000 +0h_ +0o +0o8 +0x +0X0 +0xG +0z +0zC + +---------------------------------------------------- + +[ + ["number", "0"], "B0\r\n", + ["number", "0"], "D0\r\n", + ["number", "0"], "I\r\n", + ["number", "0"], "O0\r\n", + ["number", "0"], "Z0\r\n", + ["number", "0"], "b\r\n", + ["number", "0"], "b2\r\n", + ["number", "0"], "d\r\n", + ["number", "0"], "h\r\n", + ["number", "0"], "h0\r\n", + ["number", "0"], "h00\r\n", + ["number", "0"], "h000\r\n", + ["number", "0"], "h00000\r\n", + ["number", "0"], "h0000000\r\n", + ["number", "0"], "h000000000\r\n", + ["number", "0"], "h000000000000000\r\n", + ["number", "0"], "h00000000000000000\r\n", + ["number", "0"], "h_\r\n", + ["number", "0"], "o\r\n", + ["number", "0"], "o8\r\n", + ["number", "0"], "x\r\n", + ["number", "0"], "X0\r\n", + ["number", "0"], "xG\r\n", + ["number", "0"], "z\r\n", + ["number", "0"], "zC" +] diff --git a/tests/languages/odin/number_feature.test b/tests/languages/odin/number_feature.test new file mode 100644 index 0000000000..2e2560fda3 --- /dev/null +++ b/tests/languages/odin/number_feature.test @@ -0,0 +1,129 @@ +.0 +0 +0. +0E +0b0 +0b00 +0b01 +0b0_ +0b_ +0b_0 +0b_1 +0b__ +0d0 +0d00 +0d01 +0d0_ +0d_ +0d_0 +0d_1 +0d__ +0e +0e+ +0e+0 +0e+0i +0e+i +0e- +0e-0 +0e-0i +0e-i +0ei +0h0000 +0h00000000 +0h0000000000000000 +0i +0o0 +0o00 +0o01 +0o0_ +0o_ +0o_0 +0o_1 +0o__ +0x0 +0x00 +0x0_ +0x0F +0x0f +0x_ +0x_0 +0x__ +0x_F +0x_f +0z0 +0z00 +0z0_ +0z0B +0z0b +0z_ +0z_0 +0z__ +0z_B +0z_b + +---------------------------------------------------- + +[ + ["number", ".0"], + ["number", "0"], + ["number", "0."], + ["number", "0E"], + ["number", "0b0"], + ["number", "0b00"], + ["number", "0b01"], + ["number", "0b0_"], + ["number", "0b_"], + ["number", "0b_0"], + ["number", "0b_1"], + ["number", "0b__"], + ["number", "0d0"], + ["number", "0d00"], + ["number", "0d01"], + ["number", "0d0_"], + ["number", "0d_"], + ["number", "0d_0"], + ["number", "0d_1"], + ["number", "0d__"], + ["number", "0e"], + ["number", "0e+"], + ["number", "0e+0"], + ["number", "0e+0i"], + ["number", "0e+i"], + ["number", "0e-"], + ["number", "0e-0"], + ["number", "0e-0i"], + ["number", "0e-i"], + ["number", "0ei"], + ["number", "0h0000"], + ["number", "0h00000000"], + ["number", "0h0000000000000000"], + ["number", "0i"], + ["number", "0o0"], + ["number", "0o00"], + ["number", "0o01"], + ["number", "0o0_"], + ["number", "0o_"], + ["number", "0o_0"], + ["number", "0o_1"], + ["number", "0o__"], + ["number", "0x0"], + ["number", "0x00"], + ["number", "0x0_"], + ["number", "0x0F"], + ["number", "0x0f"], + ["number", "0x_"], + ["number", "0x_0"], + ["number", "0x__"], + ["number", "0x_F"], + ["number", "0x_f"], + ["number", "0z0"], + ["number", "0z00"], + ["number", "0z0_"], + ["number", "0z0B"], + ["number", "0z0b"], + ["number", "0z_"], + ["number", "0z_0"], + ["number", "0z__"], + ["number", "0z_B"], + ["number", "0z_b"] +] diff --git a/tests/languages/odin/operator_feature.test b/tests/languages/odin/operator_feature.test new file mode 100644 index 0000000000..d67d03de4c --- /dev/null +++ b/tests/languages/odin/operator_feature.test @@ -0,0 +1,121 @@ +! +!= +# +$ +% +%% +%%= +%= +& +&& +&&= +&= +&~ +&~= +( +) +* +*= ++ +++ ++= +, +- +-- +--- +-= +-> +. +.. +..< +..= +/ +/= +: +; +< +<< +<<= +<= += +== +> +>= +>> +>>= +? +@ +[ +] +^ +{ +| +|= +|| +||= +} +~ +~= + +---------------------------------------------------- + +[ + ["operator", "!"], + ["operator", "!="], + ["operator", "#"], + ["operator", "$"], + ["operator", "%"], + ["operator", "%%"], + ["operator", "%%="], + ["operator", "%="], + ["operator", "&"], + ["operator", "&&"], + ["operator", "&&="], + ["operator", "&="], + ["operator", "&~"], + ["operator", "&~="], + ["operator", "("], + ["operator", ")"], + ["operator", "*"], + ["operator", "*="], + ["operator", "+"], + ["operator", "++"], + ["operator", "+="], + ["operator", ","], + ["operator", "-"], + ["operator", "--"], + ["operator", "---"], + ["operator", "-="], + ["operator", "->"], + ["operator", "."], + ["operator", ".."], + ["operator", "..<"], + ["operator", "..="], + ["operator", "/"], + ["operator", "/="], + ["operator", ":"], + ["operator", ";"], + ["operator", "<"], + ["operator", "<<"], + ["operator", "<<="], + ["operator", "<="], + ["operator", "="], + ["operator", "=="], + ["operator", ">"], + ["operator", ">="], + ["operator", ">>"], + ["operator", ">>="], + ["operator", "?"], + ["operator", "@"], + ["operator", "["], + ["operator", "]"], + ["operator", "^"], + ["operator", "{"], + ["operator", "|"], + ["operator", "|="], + ["operator", "||"], + ["operator", "||="], + ["operator", "}"], + ["operator", "~"], + ["operator", "~="] +] diff --git a/tests/languages/odin/raw_string_feature.test b/tests/languages/odin/raw_string_feature.test new file mode 100644 index 0000000000..abb64cccfd --- /dev/null +++ b/tests/languages/odin/raw_string_feature.test @@ -0,0 +1,79 @@ +` +` +`!` +`""` +`"\a"` +`' '` +`'\a'` +`/**/` +`//` +`0` +`\ +` +`\"` +`\'` +`\000` +`\077` +`\U000000` +`\UFFFFFF` +`\Uffffff` +`\\` +`\a` +`\b` +`\e` +`\f` +`\n` +`\r` +`\t` +`\u0000` +`\uFFFF` +`\uffff` +`\v` +`\x00` +`\xFF` +`\xff` +`A raw string.` +`` +`false` +`if` + +---------------------------------------------------- + +[ + ["string", "`\r\n`"], + ["string", "`!`"], + ["string", "`\"\"`"], + ["string", "`\"\\a\"`"], + ["string", "`' '`"], + ["string", "`'\\a'`"], + ["string", "`/**/`"], + ["string", "`//`"], + ["string", "`0`"], + ["string", "`\\\r\n`"], + ["string", "`\\\"`"], + ["string", "`\\'`"], + ["string", "`\\000`"], + ["string", "`\\077`"], + ["string", "`\\U000000`"], + ["string", "`\\UFFFFFF`"], + ["string", "`\\Uffffff`"], + ["string", "`\\\\`"], + ["string", "`\\a`"], + ["string", "`\\b`"], + ["string", "`\\e`"], + ["string", "`\\f`"], + ["string", "`\\n`"], + ["string", "`\\r`"], + ["string", "`\\t`"], + ["string", "`\\u0000`"], + ["string", "`\\uFFFF`"], + ["string", "`\\uffff`"], + ["string", "`\\v`"], + ["string", "`\\x00`"], + ["string", "`\\xFF`"], + ["string", "`\\xff`"], + ["string", "`A raw string.`"], + ["string", "``"], + ["string", "`false`"], + ["string", "`if`"] +] diff --git a/tests/languages/odin/string_feature.test b/tests/languages/odin/string_feature.test new file mode 100644 index 0000000000..4ce66b9186 --- /dev/null +++ b/tests/languages/odin/string_feature.test @@ -0,0 +1,178 @@ +"!" +"" +"' '" +"'\a'" +"/**/" +"//" +"0" +"\"" +"\'" +"\000" +"\077" +"\U000000" +"\UFFFFFF" +"\Uffffff" +"\\" +"\a" +"\b" +"\e" +"\f" +"\n" +"\r" +"\t" +"\u0000" +"\uFFFF" +"\uffff" +"\v" +"\x00" +"\xFF" +"\xff" +"Not +a +string" +"Not\ +a\ +string" +"String" +"String" Not a string" +"`\a`" +"``" +"false" +"if" + +---------------------------------------------------- + +[ + ["string", ["\"!\""]], + ["string", ["\"\""]], + ["string", ["\"' '\""]], + ["string", [ + "\"'", + ["symbol", "\\a"], + "'\"" + ]], + ["string", ["\"/**/\""]], + ["string", ["\"//\""]], + ["string", ["\"0\""]], + ["string", [ + "\"", + ["symbol", "\\\""], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\'"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\000"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\077"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\U000000"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\UFFFFFF"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\Uffffff"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\\\"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\a"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\b"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\e"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\f"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\n"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\r"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\t"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\u0000"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\uFFFF"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\uffff"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\v"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\x00"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\xFF"], + "\"" + ]], + ["string", [ + "\"", + ["symbol", "\\xff"], + "\"" + ]], + "\r\n\"Not\r\na\r\nstring\"\r\n\"Not\\\r\na\\\r\nstring\"\r\n", + ["string", ["\"String\""]], + ["string", ["\"String\""]], " Not a string\"\r\n", + ["string", [ + "\"`", + ["symbol", "\\a"], + "`\"" + ]], + ["string", ["\"``\""]], + ["string", ["\"false\""]], + ["string", ["\"if\""]] +] From f46e69d49aa13a50e9b4c123960c8f7f3b9b6348 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Tue, 14 Dec 2021 04:47:26 +0300 Subject: [PATCH 02/16] Change \S\s to \s\S --- components/prism-odin.js | 2 +- components/prism-odin.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index cdcabcb166..28f57b86f0 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -11,7 +11,7 @@ */ 'comment': [ { - pattern: /\/\*[\S\s]*?(?:\*\/|$)/, + pattern: /\/\*[\s\S]*?(?:\*\/|$)/, greedy: true }, { diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 2a270e5ec5..e67a19eabb 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*[\S\s]*?(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file +!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file From 3a67123fb087a61006ead790d4f9d5bbf8762201 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Fri, 17 Dec 2021 22:37:57 +0300 Subject: [PATCH 03/16] Add support for comments with 1 level of nesting Co-authored-by: Michael Schmidt --- components/prism-odin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 28f57b86f0..12906f0405 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -11,7 +11,7 @@ */ 'comment': [ { - pattern: /\/\*[\s\S]*?(?:\*\/|$)/, + pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*[\s\S]*?(?:\*\/|$))*(?:\*\/|$)/, greedy: true }, { From 68fca76e99353da89f55ce2347beefab38ea7311 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 01:12:30 +0300 Subject: [PATCH 04/16] Fix tests for comments --- tests/languages/odin/comment_feature.test | 66 ++++++++++--------- .../failed_multiline_comment_feature.test | 9 --- 2 files changed, 34 insertions(+), 41 deletions(-) delete mode 100644 tests/languages/odin/failed_multiline_comment_feature.test diff --git a/tests/languages/odin/comment_feature.test b/tests/languages/odin/comment_feature.test index f19c363fce..5f91768690 100644 --- a/tests/languages/odin/comment_feature.test +++ b/tests/languages/odin/comment_feature.test @@ -1,5 +1,18 @@ +#! +#! A comment +#!! +#!"" +#!#! +#!' ' +#!/**/ +#!// +#!0 +#!`` +#!false +#!if /* */ +/* 1 /* 2 */ 1 */ /* A comment */ /*!*/ /*""*/ @@ -8,26 +21,12 @@ /*' '*/ /*'\a'*/ /**/ -/*//*/ +/*/**/*/ /*0*/ -/*``*/ /*`\a`*/ +/*``*/ /*false*/ /*if*/ -Not a comment /* A comment */ -#! -#! A comment -#!! -#!"" -#!#! -#!' ' -#!/**/ -#!// -#!0 -#!`` -#!false -#!if -Not a comment #! A comment // // A comment //! @@ -40,12 +39,27 @@ Not a comment #! A comment //`` //false //if +Not a comment #! A comment +Not a comment /* A comment */ Not a comment // A comment ---------------------------------------------------- [ + ["comment", "#!"], + ["comment", "#! A comment"], + ["comment", "#!!"], + ["comment", "#!\"\""], + ["comment", "#!#!"], + ["comment", "#!' '"], + ["comment", "#!/**/"], + ["comment", "#!//"], + ["comment", "#!0"], + ["comment", "#!``"], + ["comment", "#!false"], + ["comment", "#!if"], ["comment", "/*\r\n*/"], + ["comment", "/* 1 /* 2 */ 1 */"], ["comment", "/* A comment */"], ["comment", "/*!*/"], ["comment", "/*\"\"*/"], @@ -54,26 +68,12 @@ Not a comment // A comment ["comment", "/*' '*/"], ["comment", "/*'\\a'*/"], ["comment", "/**/"], - ["comment", "/*//*/"], + ["comment", "/*/**/*/"], ["comment", "/*0*/"], - ["comment", "/*``*/"], ["comment", "/*`\\a`*/"], + ["comment", "/*``*/"], ["comment", "/*false*/"], ["comment", "/*if*/"], - "\r\nNot a comment ", ["comment", "/* A comment */"], - ["comment", "#!"], - ["comment", "#! A comment"], - ["comment", "#!!"], - ["comment", "#!\"\""], - ["comment", "#!#!"], - ["comment", "#!' '"], - ["comment", "#!/**/"], - ["comment", "#!//"], - ["comment", "#!0"], - ["comment", "#!``"], - ["comment", "#!false"], - ["comment", "#!if"], - "\r\nNot a comment ", ["comment", "#! A comment"], ["comment", "//"], ["comment", "// A comment"], ["comment", "//!"], @@ -86,5 +86,7 @@ Not a comment // A comment ["comment", "//``"], ["comment", "//false"], ["comment", "//if"], + "\r\nNot a comment ", ["comment", "#! A comment"], + "\r\nNot a comment ", ["comment", "/* A comment */"], "\r\nNot a comment ", ["comment", "// A comment"] ] diff --git a/tests/languages/odin/failed_multiline_comment_feature.test b/tests/languages/odin/failed_multiline_comment_feature.test deleted file mode 100644 index 2555d3025c..0000000000 --- a/tests/languages/odin/failed_multiline_comment_feature.test +++ /dev/null @@ -1,9 +0,0 @@ -/*/**/*/ - ----------------------------------------------------- - -[ - ["comment", "/*/**/"], - ["operator", "*"], - ["operator", "/"] -] From d87b7fe1aa0cd85c9c6c20e016c8caf31225babf Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 02:20:13 +0300 Subject: [PATCH 05/16] Fix the comment pattern to prevent exponential backtracking --- components/prism-odin.js | 6 ++++-- components/prism-odin.min.js | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 12906f0405..459387450f 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -7,11 +7,13 @@ Prism.languages.odin = { /** - * The current implementation of multiline comments doesn't support nesting. + * The current implementation supports only 1 level of nesting. + * @author Michael Schmidt + * @author edukisto */ 'comment': [ { - pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*[\s\S]*?(?:\*\/|$))*(?:\*\/|$)/, + pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/, greedy: true }, { diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index e67a19eabb..c411dba0c7 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file +!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file From f0e1bd19174e6b222773e8135b2c2123336ed62b Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 02:29:18 +0300 Subject: [PATCH 06/16] Add a missing newline to the JSDoc block --- components/prism-odin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/components/prism-odin.js b/components/prism-odin.js index 459387450f..5582db3a74 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -8,6 +8,7 @@ Prism.languages.odin = { /** * The current implementation supports only 1 level of nesting. + * * @author Michael Schmidt * @author edukisto */ From f0eff9593339680cb9f923b5f5d08fe9902b57ea Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 02:44:28 +0300 Subject: [PATCH 07/16] Make the char pattern greedy --- components/prism-odin.js | 1 + components/prism-odin.min.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 5582db3a74..5131354268 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -32,6 +32,7 @@ */ 'char': { pattern: withEscapes(/'(?:|[^\n\r'\\])'/.source), + greedy: true, inside: { 'symbol': withEscapes(//.source) } diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index c411dba0c7..65d956d673 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function n(e,n){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),n)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:n("'(?:|[^\n\r'\\\\])'"),inside:{symbol:n("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:n('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:n("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file +!function(e){function r(e,r){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),r)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:r("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:r("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:r('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:r("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file From f7569f0fa6185a08c215c81959a68960b6a600ff Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 03:26:10 +0300 Subject: [PATCH 08/16] Allow spaces and tabs after the name of a function --- components/prism-odin.js | 2 +- components/prism-odin.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 5131354268..e327c838f7 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -58,7 +58,7 @@ '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/, - 'function': /\b\w+(?=\()/, + 'function': /\b\w+(?=[ \t]*\()/, 'operator': /\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/ }; diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 65d956d673..2adccb2737 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function r(e,r){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),r)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:r("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:r("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:r('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:r("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file +!function(e){function r(e,r){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),r)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:r("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:r("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:r('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:r("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=[ \t]*\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file From ee47b20f1bad9a8871d314f4da166cf46cdf17da Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 04:47:36 +0300 Subject: [PATCH 09/16] Separate directives, operators, punctuation marks, etc. --- components/prism-odin.js | 19 ++++++++++- components/prism-odin.min.js | 2 +- .../odin/constant_parameter_sign_feature.test | 7 ++++ tests/languages/odin/directive_feature.test | 9 ++++++ tests/languages/odin/operator_feature.test | 32 +------------------ tests/languages/odin/punctuation_feature.test | 29 +++++++++++++++++ tests/languages/odin/undefined_feature.test | 7 ++++ 7 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 tests/languages/odin/constant_parameter_sign_feature.test create mode 100644 tests/languages/odin/directive_feature.test create mode 100644 tests/languages/odin/punctuation_feature.test create mode 100644 tests/languages/odin/undefined_feature.test diff --git a/components/prism-odin.js b/components/prism-odin.js index e327c838f7..76b52583b5 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -52,6 +52,11 @@ } ], + '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]?)/, 'boolean': /\b(?:_|false|nil|true)\b/, @@ -60,6 +65,18 @@ 'function': /\b\w+(?=[ \t]*\()/, - 'operator': /\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/ + 'constant-parameter-sign': { + pattern: /\$/, + alias: 'important' + }, + + 'undefined': { + pattern: /---/, + alias: 'operator' + }, + + 'operator': /\+\+|--|-(?!>)|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/, + + 'punctuation': /->|[(),.:;@\[\]{}]/ }; }(Prism)); diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 2adccb2737..82b5df7693 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function r(e,r){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),r)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:r("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:r("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:r('"(?:|[^\n\r"\\\\])*"'),greedy:!0,inside:{symbol:r("")}}],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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=[ \t]*\()/,operator:/\+\+|---?|->|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[#$(),.:;?@\[\]^{}]/}}(Prism); \ No newline at end of file +!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=[ \t]*\()/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},operator:/\+\+|--|-(?!>)|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/->|[(),.:;@\[\]{}]/}}(Prism); \ No newline at end of file diff --git a/tests/languages/odin/constant_parameter_sign_feature.test b/tests/languages/odin/constant_parameter_sign_feature.test new file mode 100644 index 0000000000..072cebc8a4 --- /dev/null +++ b/tests/languages/odin/constant_parameter_sign_feature.test @@ -0,0 +1,7 @@ +$ + +---------------------------------------------------- + +[ + ["constant-parameter-sign", "$"] +] diff --git a/tests/languages/odin/directive_feature.test b/tests/languages/odin/directive_feature.test new file mode 100644 index 0000000000..61edb9b9d8 --- /dev/null +++ b/tests/languages/odin/directive_feature.test @@ -0,0 +1,9 @@ +#assert +#no_bounds_check + +---------------------------------------------------- + +[ + ["directive", "#assert"], + ["directive", "#no_bounds_check"] +] diff --git a/tests/languages/odin/operator_feature.test b/tests/languages/odin/operator_feature.test index d67d03de4c..fd85d38a74 100644 --- a/tests/languages/odin/operator_feature.test +++ b/tests/languages/odin/operator_feature.test @@ -1,7 +1,5 @@ ! != -# -$ % %% %%= @@ -12,27 +10,19 @@ $ &= &~ &~= -( -) * *= + ++ += -, - -- ---- -= --> -. .. ..< ..= / /= -: -; < << <<= @@ -44,16 +34,11 @@ $ >> >>= ? -@ -[ -] ^ -{ | |= || ||= -} ~ ~= @@ -62,8 +47,6 @@ $ [ ["operator", "!"], ["operator", "!="], - ["operator", "#"], - ["operator", "$"], ["operator", "%"], ["operator", "%%"], ["operator", "%%="], @@ -74,27 +57,19 @@ $ ["operator", "&="], ["operator", "&~"], ["operator", "&~="], - ["operator", "("], - ["operator", ")"], ["operator", "*"], ["operator", "*="], ["operator", "+"], ["operator", "++"], ["operator", "+="], - ["operator", ","], ["operator", "-"], ["operator", "--"], - ["operator", "---"], - ["operator", "-="], - ["operator", "->"], - ["operator", "."], + ["operator", "-"], ["operator", "="], ["operator", ".."], ["operator", "..<"], ["operator", "..="], ["operator", "/"], ["operator", "/="], - ["operator", ":"], - ["operator", ";"], ["operator", "<"], ["operator", "<<"], ["operator", "<<="], @@ -106,16 +81,11 @@ $ ["operator", ">>"], ["operator", ">>="], ["operator", "?"], - ["operator", "@"], - ["operator", "["], - ["operator", "]"], ["operator", "^"], - ["operator", "{"], ["operator", "|"], ["operator", "|="], ["operator", "||"], ["operator", "||="], - ["operator", "}"], ["operator", "~"], ["operator", "~="] ] diff --git a/tests/languages/odin/punctuation_feature.test b/tests/languages/odin/punctuation_feature.test new file mode 100644 index 0000000000..473e951f63 --- /dev/null +++ b/tests/languages/odin/punctuation_feature.test @@ -0,0 +1,29 @@ +( +) +, +-> +. +: +; +@ +[ +] +{ +} + +---------------------------------------------------- + +[ + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ","], + ["operator", "-"], ["operator", ">"], + ["punctuation", "."], + ["punctuation", ":"], + ["punctuation", ";"], + ["punctuation", "@"], + ["punctuation", "["], + ["punctuation", "]"], + ["punctuation", "{"], + ["punctuation", "}"] +] diff --git a/tests/languages/odin/undefined_feature.test b/tests/languages/odin/undefined_feature.test new file mode 100644 index 0000000000..5347143d3c --- /dev/null +++ b/tests/languages/odin/undefined_feature.test @@ -0,0 +1,7 @@ +--- + +---------------------------------------------------- + +[ + ["undefined", "---"] +] From babdd8c53ed37fe76fa94bd39ce3c3a638f983a5 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Sat, 18 Dec 2021 06:16:41 +0300 Subject: [PATCH 10/16] Fix errors --- components/prism-odin.js | 14 +++++++++++--- components/prism-odin.min.js | 2 +- tests/languages/odin/operator_feature.test | 2 +- tests/languages/odin/procedure_function.test | 11 +++++++++++ tests/languages/odin/punctuation_feature.test | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 tests/languages/odin/procedure_function.test diff --git a/components/prism-odin.js b/components/prism-odin.js index 76b52583b5..204499c468 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -63,7 +63,10 @@ '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/, - 'function': /\b\w+(?=[ \t]*\()/, + 'procedure': { + pattern: /\b\w+(?=[ \t]*\()/, + alias: 'function' + }, 'constant-parameter-sign': { pattern: /\$/, @@ -75,8 +78,13 @@ alias: 'operator' }, - 'operator': /\+\+|--|-(?!>)|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/, + 'arrow': { + pattern: /->/, + alias: 'punctuation' + }, + + 'operator': /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/, - 'punctuation': /->|[(),.:;@\[\]{}]/ + 'punctuation': /[(),.:;@\[\]{}]/ }; }(Prism)); diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 82b5df7693..b02f21c4d9 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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/,function:/\b\w+(?=[ \t]*\()/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},operator:/\+\+|--|-(?!>)|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/->|[(),.:;@\[\]{}]/}}(Prism); \ No newline at end of file +!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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:{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},"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/tests/languages/odin/operator_feature.test b/tests/languages/odin/operator_feature.test index fd85d38a74..86bc0d59d3 100644 --- a/tests/languages/odin/operator_feature.test +++ b/tests/languages/odin/operator_feature.test @@ -64,7 +64,7 @@ ["operator", "+="], ["operator", "-"], ["operator", "--"], - ["operator", "-"], ["operator", "="], + ["operator", "-="], ["operator", ".."], ["operator", "..<"], ["operator", "..="], diff --git a/tests/languages/odin/procedure_function.test b/tests/languages/odin/procedure_function.test new file mode 100644 index 0000000000..a8d8c9d5e1 --- /dev/null +++ b/tests/languages/odin/procedure_function.test @@ -0,0 +1,11 @@ +do_math() +fibonacci() +log10() + +---------------------------------------------------- + +[ + ["procedure", "do_math"], ["punctuation", "("], ["punctuation", ")"], + ["procedure", "fibonacci"], ["punctuation", "("], ["punctuation", ")"], + ["procedure", "log10"], ["punctuation", "("], ["punctuation", ")"] +] diff --git a/tests/languages/odin/punctuation_feature.test b/tests/languages/odin/punctuation_feature.test index 473e951f63..8c4c80c104 100644 --- a/tests/languages/odin/punctuation_feature.test +++ b/tests/languages/odin/punctuation_feature.test @@ -17,7 +17,7 @@ ["punctuation", "("], ["punctuation", ")"], ["punctuation", ","], - ["operator", "-"], ["operator", ">"], + ["arrow", "->"], ["punctuation", "."], ["punctuation", ":"], ["punctuation", ";"], From 7a292f2339bd4c42c2f8d97fbc020e7696812729 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Mon, 20 Dec 2021 05:16:29 +0300 Subject: [PATCH 11/16] Make _ a discard variable --- components/prism-odin.js | 7 ++++++- components/prism-odin.min.js | 2 +- tests/languages/odin/boolean_feature.test | 2 -- tests/languages/odin/discard_feature.test | 7 +++++++ 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 tests/languages/odin/discard_feature.test diff --git a/components/prism-odin.js b/components/prism-odin.js index 204499c468..31a1981437 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -59,7 +59,12 @@ '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]?)/, - 'boolean': /\b(?:_|false|nil|true)\b/, + 'discard': { + pattern: /\b_\b/, + alias: 'keyword' + }, + + 'boolean': /\b(?:false|nil|true)\b/, '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/, diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index b02f21c4d9..46c1e277f4 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,boolean:/\b(?:_|false|nil|true)\b/,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:{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},"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 +!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,discard:{pattern:/\b_\b/,alias:"keyword"},boolean:/\b(?:false|nil|true)\b/,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:{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},"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/tests/languages/odin/boolean_feature.test b/tests/languages/odin/boolean_feature.test index 27c53f23a1..75b3f44ab3 100644 --- a/tests/languages/odin/boolean_feature.test +++ b/tests/languages/odin/boolean_feature.test @@ -1,4 +1,3 @@ -_ false nil true @@ -6,7 +5,6 @@ true ---------------------------------------------------- [ - ["boolean", "_"], ["boolean", "false"], ["boolean", "nil"], ["boolean", "true"] diff --git a/tests/languages/odin/discard_feature.test b/tests/languages/odin/discard_feature.test new file mode 100644 index 0000000000..d8f6696171 --- /dev/null +++ b/tests/languages/odin/discard_feature.test @@ -0,0 +1,7 @@ +_ + +---------------------------------------------------- + +[ + ["discard", "_"] +] From cd99873919d0c86058b6e9abc0eeb2d4d2fe67b6 Mon Sep 17 00:00:00 2001 From: edukisto <52005215+edukisto@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:23:29 +0300 Subject: [PATCH 12/16] Reimplement the searching for procedure names --- components/prism-odin.js | 25 ++++++++++++++++---- components/prism-odin.min.js | 2 +- tests/languages/odin/keyword_feature.test | 2 +- tests/languages/odin/procedure_feature.test | 11 +++++++++ tests/languages/odin/procedure_function.test | 11 --------- 5 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 tests/languages/odin/procedure_feature.test delete mode 100644 tests/languages/odin/procedure_function.test diff --git a/components/prism-odin.js b/components/prism-odin.js index 31a1981437..56162ab206 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -64,15 +64,32 @@ alias: 'keyword' }, - 'boolean': /\b(?:false|nil|true)\b/, + /** + * proc is defined below. + */ + '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|return|struct|switch|transmute|typeid|union|using|when|where)\b/, - '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/, + /** + * false, nil, true can be used as procedure names. "_" and keywords can't. + */ + 'procedure-name': [ + { + pattern: /\b\w+(?=[ \t]*(?::[ \n\r\t]*){2}proc\b)/, + alias: 'function' + }, + { + pattern: /\b\w+(?=[ \t]*\()/, + alias: 'function' + } + ], 'procedure': { - pattern: /\b\w+(?=[ \t]*\()/, - alias: 'function' + pattern: /\bproc\b/, + alias: 'keyword' }, + 'boolean': /\b(?:false|nil|true)\b/, + 'constant-parameter-sign': { pattern: /\$/, alias: 'important' diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 46c1e277f4..3c1f357152 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,discard:{pattern:/\b_\b/,alias:"keyword"},boolean:/\b(?:false|nil|true)\b/,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:{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},"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 +!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,discard:{pattern:/\b_\b/,alias:"keyword"},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|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":[{pattern:/\b\w+(?=[ \t]*(?::[ \n\r\t]*){2}proc\b)/,alias:"function"},{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"}],procedure:{pattern:/\bproc\b/,alias:"keyword"},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/tests/languages/odin/keyword_feature.test b/tests/languages/odin/keyword_feature.test index c3380bec0b..92346c3e82 100644 --- a/tests/languages/odin/keyword_feature.test +++ b/tests/languages/odin/keyword_feature.test @@ -64,7 +64,7 @@ where ["keyword", "or_else"], ["keyword", "or_return"], ["keyword", "package"], - ["keyword", "proc"], + ["procedure", "proc"], ["keyword", "return"], ["keyword", "struct"], ["keyword", "switch"], diff --git a/tests/languages/odin/procedure_feature.test b/tests/languages/odin/procedure_feature.test new file mode 100644 index 0000000000..44c0e4b3a5 --- /dev/null +++ b/tests/languages/odin/procedure_feature.test @@ -0,0 +1,11 @@ +do_math() +fibonacci() +log10() + +---------------------------------------------------- + +[ + ["procedure-name", "do_math"], ["punctuation", "("], ["punctuation", ")"], + ["procedure-name", "fibonacci"], ["punctuation", "("], ["punctuation", ")"], + ["procedure-name", "log10"], ["punctuation", "("], ["punctuation", ")"] +] diff --git a/tests/languages/odin/procedure_function.test b/tests/languages/odin/procedure_function.test deleted file mode 100644 index a8d8c9d5e1..0000000000 --- a/tests/languages/odin/procedure_function.test +++ /dev/null @@ -1,11 +0,0 @@ -do_math() -fibonacci() -log10() - ----------------------------------------------------- - -[ - ["procedure", "do_math"], ["punctuation", "("], ["punctuation", ")"], - ["procedure", "fibonacci"], ["punctuation", "("], ["punctuation", ")"], - ["procedure", "log10"], ["punctuation", "("], ["punctuation", ")"] -] From 95e8b9032c505505dfc6eaaa071d9901aeaf122b Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Tue, 22 Mar 2022 13:23:37 +0100 Subject: [PATCH 13/16] Simplified proc matching --- components/prism-odin.js | 27 +++++++-------------- tests/languages/odin/keyword_feature.test | 2 +- tests/languages/odin/procedure_feature.test | 18 +++++++++++++- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 56162ab206..45b186edb1 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -64,28 +64,19 @@ alias: 'keyword' }, - /** - * proc is defined below. - */ - '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|return|struct|switch|transmute|typeid|union|using|when|where)\b/, + '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/, /** * false, nil, true can be used as procedure names. "_" and keywords can't. */ - 'procedure-name': [ - { - pattern: /\b\w+(?=[ \t]*(?::[ \n\r\t]*){2}proc\b)/, - alias: 'function' - }, - { - pattern: /\b\w+(?=[ \t]*\()/, - alias: 'function' - } - ], - - 'procedure': { - pattern: /\bproc\b/, - alias: 'keyword' + 'procedure-name': { + pattern: /\b\w+(?=[ \t]*\()/, + alias: 'function' }, 'boolean': /\b(?:false|nil|true)\b/, diff --git a/tests/languages/odin/keyword_feature.test b/tests/languages/odin/keyword_feature.test index 92346c3e82..c3380bec0b 100644 --- a/tests/languages/odin/keyword_feature.test +++ b/tests/languages/odin/keyword_feature.test @@ -64,7 +64,7 @@ where ["keyword", "or_else"], ["keyword", "or_return"], ["keyword", "package"], - ["procedure", "proc"], + ["keyword", "proc"], ["keyword", "return"], ["keyword", "struct"], ["keyword", "switch"], diff --git a/tests/languages/odin/procedure_feature.test b/tests/languages/odin/procedure_feature.test index 44c0e4b3a5..93a59f1c7e 100644 --- a/tests/languages/odin/procedure_feature.test +++ b/tests/languages/odin/procedure_feature.test @@ -2,10 +2,26 @@ do_math() fibonacci() log10() +cross :: proc(a, b: Vector3) -> Vector3 + ---------------------------------------------------- [ ["procedure-name", "do_math"], ["punctuation", "("], ["punctuation", ")"], ["procedure-name", "fibonacci"], ["punctuation", "("], ["punctuation", ")"], - ["procedure-name", "log10"], ["punctuation", "("], ["punctuation", ")"] + ["procedure-name", "log10"], ["punctuation", "("], ["punctuation", ")"], + + ["procedure-definition", "cross"], + ["punctuation", ":"], + ["punctuation", ":"], + ["keyword", "proc"], + ["punctuation", "("], + "a", + ["punctuation", ","], + " b", + ["punctuation", ":"], + " Vector3", + ["punctuation", ")"], + ["arrow", "->"], + " Vector3" ] From 9ee49f9a671b421aff489d29dcd5c95e886f6269 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Tue, 22 Mar 2022 13:24:12 +0100 Subject: [PATCH 14/16] Improved number pattern --- components/prism-odin.js | 2 +- .../languages/odin/not_a_number_feature.test | 26 +------------------ tests/languages/odin/operator_feature.test | 8 +++++- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/components/prism-odin.js b/components/prism-odin.js index 45b186edb1..7726674a6c 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -57,7 +57,7 @@ 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]?)/, + '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/, diff --git a/tests/languages/odin/not_a_number_feature.test b/tests/languages/odin/not_a_number_feature.test index 01124560b8..e05789eac0 100644 --- a/tests/languages/odin/not_a_number_feature.test +++ b/tests/languages/odin/not_a_number_feature.test @@ -27,29 +27,5 @@ ---------------------------------------------------- [ - ["number", "0"], "B0\r\n", - ["number", "0"], "D0\r\n", - ["number", "0"], "I\r\n", - ["number", "0"], "O0\r\n", - ["number", "0"], "Z0\r\n", - ["number", "0"], "b\r\n", - ["number", "0"], "b2\r\n", - ["number", "0"], "d\r\n", - ["number", "0"], "h\r\n", - ["number", "0"], "h0\r\n", - ["number", "0"], "h00\r\n", - ["number", "0"], "h000\r\n", - ["number", "0"], "h00000\r\n", - ["number", "0"], "h0000000\r\n", - ["number", "0"], "h000000000\r\n", - ["number", "0"], "h000000000000000\r\n", - ["number", "0"], "h00000000000000000\r\n", - ["number", "0"], "h_\r\n", - ["number", "0"], "o\r\n", - ["number", "0"], "o8\r\n", - ["number", "0"], "x\r\n", - ["number", "0"], "X0\r\n", - ["number", "0"], "xG\r\n", - ["number", "0"], "z\r\n", - ["number", "0"], "zC" + "0B0\r\n0D0\r\n0I\r\n0O0\r\n0Z0\r\n0b\r\n0b2\r\n0d\r\n0h\r\n0h0\r\n0h00\r\n0h000\r\n0h00000\r\n0h0000000\r\n0h000000000\r\n0h000000000000000\r\n0h00000000000000000\r\n0h_\r\n0o\r\n0o8\r\n0x\r\n0X0\r\n0xG\r\n0z\r\n0zC" ] diff --git a/tests/languages/odin/operator_feature.test b/tests/languages/odin/operator_feature.test index 86bc0d59d3..fd4752a089 100644 --- a/tests/languages/odin/operator_feature.test +++ b/tests/languages/odin/operator_feature.test @@ -42,6 +42,9 @@ ~ ~= +// ranges +0..<10 + ---------------------------------------------------- [ @@ -87,5 +90,8 @@ ["operator", "||"], ["operator", "||="], ["operator", "~"], - ["operator", "~="] + ["operator", "~="], + + ["comment", "// ranges"], + ["number", "0"], ["operator", "..<"], ["number", "10"] ] From 9770e09fbb8bcbaed8088bd68f53615cd1c68c33 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Tue, 22 Mar 2022 13:25:25 +0100 Subject: [PATCH 15/16] Simplified escape handling --- components/prism-odin.js | 14 +++--- .../odin/not_a_character_feature.test | 43 ------------------- 2 files changed, 5 insertions(+), 52 deletions(-) delete mode 100644 tests/languages/odin/not_a_character_feature.test diff --git a/components/prism-odin.js b/components/prism-odin.js index 7726674a6c..39e8d920be 100644 --- a/components/prism-odin.js +++ b/components/prism-odin.js @@ -1,9 +1,5 @@ (function (Prism) { - var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/.source; - - function withEscapes(pattern, flags) { - return RegExp(pattern.replace(//g, escapes), flags); - } + var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/; Prism.languages.odin = { /** @@ -31,10 +27,10 @@ * Should be found before strings because of '"'"- and '`'`-like sequences. */ 'char': { - pattern: withEscapes(/'(?:|[^\n\r'\\])'/.source), + pattern: /'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/, greedy: true, inside: { - 'symbol': withEscapes(//.source) + 'symbol': escapes } }, @@ -44,10 +40,10 @@ greedy: true }, { - pattern: withEscapes(/"(?:|[^\n\r"\\])*"/.source), + pattern: /"(?:\\.|[^\n\r"\\])*"/, greedy: true, inside: { - 'symbol': withEscapes(//.source) + 'symbol': escapes } } ], diff --git a/tests/languages/odin/not_a_character_feature.test b/tests/languages/odin/not_a_character_feature.test deleted file mode 100644 index 3216f76093..0000000000 --- a/tests/languages/odin/not_a_character_feature.test +++ /dev/null @@ -1,43 +0,0 @@ -' -' -' ' -'' -'\' -'\0' -'\00' -'\0000' -'\008' -'\u' -'\u0' -'\u00' -'\u000' -'\u00000' -'\uF' -'\uFF' -'\uFFF' -'\uFFFFF' -'\uf' -'\uff' -'\ufff' -'\ufffff' -'\x' -'\x0' -'\x000' -'\xF' -'\xFFF' -'\xf' -'\xfff' - ----------------------------------------------------- - -[ - "'\r\n'\r\n' '\r\n''\r\n'\\'\r\n'\\", - ["number", "0"], - "'\r\n'\\", - ["number", "00"], - "'\r\n'\\", - ["number", "0000"], - "'\r\n'\\", - ["number", "008"], - "'\r\n'\\u'\r\n'\\u0'\r\n'\\u00'\r\n'\\u000'\r\n'\\u00000'\r\n'\\uF'\r\n'\\uFF'\r\n'\\uFFF'\r\n'\\uFFFFF'\r\n'\\uf'\r\n'\\uff'\r\n'\\ufff'\r\n'\\ufffff'\r\n'\\x'\r\n'\\x0'\r\n'\\x000'\r\n'\\xF'\r\n'\\xFFF'\r\n'\\xf'\r\n'\\xfff'" -] From 9f52675662ab534809e0ea411aa46011d90889b3 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Tue, 22 Mar 2022 13:26:50 +0100 Subject: [PATCH 16/16] Rebuild --- components/prism-odin.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-odin.min.js b/components/prism-odin.min.js index 3c1f357152..23618fbec4 100644 --- a/components/prism-odin.min.js +++ b/components/prism-odin.min.js @@ -1 +1 @@ -!function(e){function t(e,t){return RegExp(e.replace(//g,"\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})"),t)}e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:t("'(?:|[^\n\r'\\\\])'"),greedy:!0,inside:{symbol:t("")}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:t('"(?:|[^\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]?)/,discard:{pattern:/\b_\b/,alias:"keyword"},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|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":[{pattern:/\b\w+(?=[ \t]*(?::[ \n\r\t]*){2}proc\b)/,alias:"function"},{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"}],procedure:{pattern:/\bproc\b/,alias:"keyword"},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 +!function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;Prism.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:/[(),.:;@\[\]{}]/}}(); \ No newline at end of file