aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-sml.js
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2021-12-30 19:47:21 +0100
committerArmand Philippot <git@armandphilippot.com>2021-12-30 19:47:21 +0100
commita98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch)
tree542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-sml.js
parentab355897a12b7bda1089a44de326d41455a0f7a3 (diff)
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-sml.js')
-rw-r--r--public/prism/prism-sml.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/public/prism/prism-sml.js b/public/prism/prism-sml.js
new file mode 100644
index 0000000..e4fcdc5
--- /dev/null
+++ b/public/prism/prism-sml.js
@@ -0,0 +1,76 @@
+// https://smlfamily.github.io/sml97-defn.pdf
+// https://people.mpi-sws.org/~rossberg/sml.html
+(function (Prism) {
+ var keywords =
+ /\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;
+
+ Prism.languages.sml = {
+ // allow one level of nesting
+ comment:
+ /\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,
+ string: {
+ pattern: /#?"(?:[^"\\]|\\.)*"/,
+ greedy: true,
+ },
+
+ 'class-name': [
+ {
+ // This is only an approximation since the real grammar is context-free
+ //
+ // Why the main loop so complex?
+ // The main loop is approximately the same as /(?:\s*(?:[*,]|->)\s*<TERMINAL>)*/ which is, obviously, a lot
+ // simpler. The difference is that if a comma is the last iteration of the loop, then the terminal must be
+ // followed by a long identifier.
+ pattern: RegExp(
+ /((?:^|[^:]):\s*)<TERMINAL>(?:\s*(?:(?:\*|->)\s*<TERMINAL>|,\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\s+<LONG-ID>)))*/.source
+ .replace(/<NOT-LAST>/g, function () {
+ return /\s*(?:[*,]|->)/.source;
+ })
+ .replace(/<TERMINAL>/g, function () {
+ return /(?:'[\w']*|<LONG-ID>|\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+<LONG-ID>)*/
+ .source;
+ })
+ .replace(/<LONG-ID>/g, function () {
+ return /(?!<KEYWORD>)[a-z\d_][\w'.]*/.source;
+ })
+ .replace(/<KEYWORD>/g, function () {
+ return keywords.source;
+ }),
+ 'i'
+ ),
+ lookbehind: true,
+ greedy: true,
+ inside: null, // see below
+ },
+ {
+ pattern:
+ /((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,
+ lookbehind: true,
+ },
+ ],
+ function: {
+ pattern: /((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,
+ lookbehind: true,
+ },
+
+ keyword: keywords,
+ variable: {
+ pattern: /(^|[^\w'])'[\w']*/,
+ lookbehind: true,
+ },
+
+ number: /~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,
+ word: {
+ pattern: /\b0w(?:\d+|x[\da-f]+)\b/i,
+ alias: 'constant',
+ },
+
+ boolean: /\b(?:false|true)\b/i,
+ operator: /\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,
+ punctuation: /[(){}\[\].:,;]/,
+ };
+
+ Prism.languages.sml['class-name'][0].inside = Prism.languages.sml;
+
+ Prism.languages.smlnj = Prism.languages.sml;
+})(Prism);