diff --git a/preview-src/code.adoc b/preview-src/code.adoc index f8ce8738..6bb2cb65 100644 --- a/preview-src/code.adoc +++ b/preview-src/code.adoc @@ -210,3 +210,31 @@ var expandCollapseBlock = function (e) { } } ---- + +== BNF syntax example + +=== Single-line rules + +[source, gql-bnf] +---- + ::= "MATCH" + ::= [ "=" ] [ ] +---- + +=== Multi-line rules + +[source, gql-bnf] +---- + ::= + "MATCH" "{}" + + ::= + [ ] [ { "," }... ] [ ] + + ::= + "REPEATABLE" { "ELEMENT" [ "BINDINGS" ] | "ELEMENTS" } + | "DIFFERENT" { "RELATIONSHIP" [ "BINDINGS" ] | "RELATIONSHIPS" } + + ::= + [ "=" ] [ ] +---- \ No newline at end of file diff --git a/src/css/highlight.css b/src/css/highlight.css index 0ebdc97e..c3d32463 100644 --- a/src/css/highlight.css +++ b/src/css/highlight.css @@ -54,6 +54,10 @@ color: rgba(var(--colors-forest-40)); } +.hljs-operator { + color: rgba(var(--colors-neutral-50)); +} + .hljs-symbol, .hljs-bullet { color: var(--color-indigo-800); diff --git a/src/js/vendor/highlight.js b/src/js/vendor/highlight.js index 870e08e2..c0598438 100644 --- a/src/js/vendor/highlight.js +++ b/src/js/vendor/highlight.js @@ -128,6 +128,34 @@ ] } }) + // Custom flavor of BNF syntax defined in GQL standard docs + hljs.registerLanguage('gql-bnf', + function gql_bnf(hljs) { + return { + name: 'Custom BNF syntax for GQL', + contains: [ + { + // Use "attribute" for nonterminals as the included BNF/ABNF/EBNF do + className: 'attribute', + begin: // + }, + { + // It should be enough to treat syntax extension symbols just as simple operators. + // Symbols include: + // - Square brackets (optional elements) + // - Braces (element group) + // - Vertical bar (alternative operator) + // - Ellipsis (element repetition) + className: 'operator', + begin: /[[\]{}|]|\.\.\./ + }, + // Double quote-delimited strings + hljs.QUOTE_STRING_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + }) hljs.highlightAll() // Apply line highlighting to lines marked with `// marked-line`