diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-10-27 16:35:35 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-10-27 16:35:35 +0000 |
| commit | abefbf82531021f5ca4149675932a7fe2ff37dde (patch) | |
| tree | 8e54b02f435f11000babc341ed523a5b57b61194 | |
| parent | syntax highlighting in static builds (diff) | |
| download | mmm-abefbf82531021f5ca4149675932a7fe2ff37dde.tar.gz mmm-abefbf82531021f5ca4149675932a7fe2ff37dde.zip | |
move converts into plugins
| -rw-r--r-- | build/server.moon | 3 | ||||
| -rw-r--r-- | mmm/mmmfs/browser.moon | 4 | ||||
| -rw-r--r-- | mmm/mmmfs/conversion.moon | 4 | ||||
| -rw-r--r-- | mmm/mmmfs/init.moon | 11 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/code.moon | 16 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/init.moon (renamed from mmm/mmmfs/converts.moon) | 142 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/markdown.moon | 33 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/mermaid.moon | 29 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/twitter.moon | 22 | ||||
| -rw-r--r-- | mmm/mmmfs/plugins/youtube.moon | 27 |
10 files changed, 159 insertions, 132 deletions
diff --git a/build/server.moon b/build/server.moon index 33a985f..33853c9 100644 --- a/build/server.moon +++ b/build/server.moon @@ -8,6 +8,7 @@ add '?/init' add '?/init.server' require 'mmm' +require 'mmm.mmmfs' import dir_base, Key, Fileder from require 'mmm.mmmfs.fileder' import convert from require 'mmm.mmmfs.conversion' @@ -65,7 +66,7 @@ class Server <script type="text/javascript" src="//unpkg.com/marked@0.7.0/marked.min.js"></script> <script type="text/javascript" src="/static/fengari-web/:text/javascript"></script> <script type="text/lua" src="/static/mmm/:text/lua"></script> - <script type="text/lua">require 'mmm'</script> + <script type="text/lua">require 'mmm'; require 'mmm.mmmfs'</script> ]] render browser\todom!, fileder, noview: true, scripts: deps .. " diff --git a/mmm/mmmfs/browser.moon b/mmm/mmmfs/browser.moon index f232f2a..35925d3 100644 --- a/mmm/mmmfs/browser.moon +++ b/mmm/mmmfs/browser.moon @@ -1,10 +1,10 @@ require = relative ..., 1 import Key from require '.fileder' +import converts from require '.plugins' import get_conversions, apply_conversions from require '.conversion' import ReactiveVar, get_or_create, text, elements, tohtml from require 'mmm.component' import pre, div, nav, span, button, a, code, select, option from elements import languages from require 'mmm.highlighting' -converts = require '.converts' keep = (var) -> last = var\get! @@ -12,8 +12,6 @@ keep = (var) -> last = val or last last -code_cast = (lang) -> - casts = { { inp: 'text/.*', diff --git a/mmm/mmmfs/conversion.moon b/mmm/mmmfs/conversion.moon index 4700eea..c0505a8 100644 --- a/mmm/mmmfs/conversion.moon +++ b/mmm/mmmfs/conversion.moon @@ -1,5 +1,4 @@ require = relative ..., 1 -base_converts = require '.converts' import Queue from require '.queue' count = (base, pattern='->') -> select 2, base\gsub pattern, '' @@ -13,8 +12,9 @@ local print_conversions -- * want - stop type pattern -- * limit - limit conversion amount -- returns a list of conversion steps -get_conversions = (want, have, converts=base_converts, limit=5) -> +get_conversions = (want, have, converts=PLUGINS and PLUGINS.converts, limit=5) -> assert have, 'need starting type(s)' + assert converts, 'need to pass list of converts' if 'string' == type have have = { have } diff --git a/mmm/mmmfs/init.moon b/mmm/mmmfs/init.moon index 8aba86a..fc89d7f 100644 --- a/mmm/mmmfs/init.moon +++ b/mmm/mmmfs/init.moon @@ -1,9 +1,4 @@ -require = relative ... -import Key, Fileder from require '.fileder' -import Browser from require '.browser' +require = relative ..., 0 -{ - :Key - :Fileder - :Browser -} +export ^ +PLUGINS = require '.plugins' diff --git a/mmm/mmmfs/plugins/code.moon b/mmm/mmmfs/plugins/code.moon new file mode 100644 index 0000000..ec22f71 --- /dev/null +++ b/mmm/mmmfs/plugins/code.moon @@ -0,0 +1,16 @@ +import pre from require 'mmm.dom' +import languages from require 'mmm.highlighting' + +-- syntax-highlighted code +{ + converts: { + { + inp: 'text/([^ ]*).*' + out: 'mmm/dom' + cost: 5 + transform: (val) => + lang = @from\match @convert.inp + pre languages[lang] val + } + } +} diff --git a/mmm/mmmfs/converts.moon b/mmm/mmmfs/plugins/init.moon index f098448..af4a2aa 100644 --- a/mmm/mmmfs/converts.moon +++ b/mmm/mmmfs/plugins/init.moon @@ -1,9 +1,8 @@ require = relative ..., 1 -import div, pre, code, img, video, blockquote, a, span, source, iframe from require 'mmm.dom' +import div, pre, code, img, video, span, source from require 'mmm.dom' import find_fileder, link_to, embed from (require 'mmm.mmmfs.util') require 'mmm.dom' import render from require '.layout' import tohtml from require 'mmm.component' -import languages from require 'mmm.highlighting' keep = (var) -> last = var\get! @@ -25,20 +24,13 @@ loadwith = (_load) -> (val, fileder, key) => func = assert _load val, "#{fileder}##{key}" func! --- highlight code -code_hl = (lang) -> - { - inp: "text/#{lang}", - out: 'mmm/dom', - cost: 5 - transform: (val) => pre languages[lang] val - } - -- list of converts -- converts each have -- * inp - input type. can capture subtypes using `(.+)` -- * out - output type. can substitute subtypes from inp with %1, %2 etc. --- * transform - function (val: inp, fileder) -> val: out +-- * cost - conversion cost +-- * transform - function (val: inp, fileder) => val: out +-- @convert, @from, @to contain the convert and the concrete types converts = { { inp: 'fn -> (.+)', @@ -169,43 +161,6 @@ converts = { os.time :year, :month, :day } { - inp: 'URL -> twitter/tweet', - out: 'mmm/dom', - cost: 1 - transform: (href) => - id = assert (href\match 'twitter.com/[^/]-/status/(%d*)'), "couldn't parse twitter/tweet URL: '#{href}'" - if MODE == 'CLIENT' - with parent = div! - window.twttr.widgets\createTweet id, parent - else - div blockquote { - class: 'twitter-tweet' - 'data-lang': 'en' - a '(linked tweet)', :href - } - } - { - inp: 'URL -> youtube/video', - out: 'mmm/dom', - cost: 1 - transform: (link) => - id = link\match 'youtu%.be/([^/]+)' - id or= link\match 'youtube.com/watch.*[?&]v=([^&]+)' - id or= link\match 'youtube.com/[ev]/([^/]+)' - id or= link\match 'youtube.com/embed/([^/]+)' - - assert id, "couldn't parse youtube URL: '#{link}'" - - iframe { - width: 560 - height: 315 - frameborder: 0 - allowfullscreen: true - frameBorder: 0 - src: "//www.youtube.com/embed/#{id}" - } - } - { inp: 'URL -> image/.+', out: 'mmm/dom', cost: 1 @@ -286,13 +241,27 @@ converts = { (tbl) => pre code deep_tostring tbl } - code_hl 'javascript' - code_hl 'moonscript' - code_hl 'lua' - code_hl 'markdown' - code_hl 'css' } +add_converts = (module) -> + ok, plugin = pcall require, ".plugins.#{module}" + + if not ok + print "[Plugins] couldn't load plugins.#{module}: #{plugin}" + return + + print "[Plugins] loaded plugins.#{module}" + + if plugin.converts + for convert in *plugin.converts + table.insert converts, convert + +add_converts 'code' +add_converts 'markdown' +add_converts 'mermaid' +add_converts 'twitter' +add_converts 'youtube' + if MODE == 'SERVER' ok, moon = pcall require, 'moonscript.base' if ok @@ -320,67 +289,4 @@ else f! } -do - local markdown - if MODE == 'SERVER' - success, discount = pcall require, 'discount' - if not success - warn "NO MARKDOWN SUPPORT!", discount - - markdown = success and (md) -> - res = assert discount.compile md, 'githubtags' - res.body - else - markdown = window and window.marked and window\marked - - if markdown - table.insert converts, { - inp: 'text/markdown', - out: 'text/html+frag', - cost: 1 - transform: (md) => "<div class=\"markdown\">#{markdown md}</div>" - } - - table.insert converts, { - inp: 'text/markdown%+span', - out: 'mmm/dom', - cost: 1 - transform: if MODE == 'SERVER' - (source) => - html = markdown source - html = html\gsub '^<p', '<span' - html\gsub '/p>$', '/span>' - else - (source) => - html = markdown source - html = html\gsub '^%s*<p>%s*', '' - html = html\gsub '%s*</p>%s*$', '' - with document\createElement 'span' - .innerHTML = html - } - -if MODE == 'CLIENT' and window.mermaid - window.mermaid\initialize { - startOnLoad: false - fontFamily: 'monospace' - } - - id_counter = 1 - table.insert converts, { - inp: 'text/mermaid-graph' - out: 'mmm/dom' - cost: 1 - transform: (source, fileder, key) => - id_counter += 1 - id = "mermaid-#{id_counter}" - with container = document\createElement 'div' - cb = (svg) => - .innerHTML = svg - .firstElementChild.style.width = '100%' - .firstElementChild.style.height = 'auto' - - window\setImmediate (_) -> - window.mermaid\render id, source, cb, container - } - -converts +:converts diff --git a/mmm/mmmfs/plugins/markdown.moon b/mmm/mmmfs/plugins/markdown.moon new file mode 100644 index 0000000..5024320 --- /dev/null +++ b/mmm/mmmfs/plugins/markdown.moon @@ -0,0 +1,33 @@ +markdown = if MODE == 'SERVER' + success, discount = pcall require, 'discount' + assert success, "couldn't require 'discount'" + + (md) -> + res = assert discount.compile md, 'githubtags' + res.body +else + assert window and window.marked, "marked.js not found" + window\marked + +assert markdown, "no markdown implementation found" + +{ + converts: { + { + inp: 'text/markdown' + out: 'text/html+frag' + cost: 1 + transform: (md) => "<div class=\"markdown\">#{markdown md}</div>" + } + { + inp: 'text/markdown%+span' + out: 'text/html+frag' + cost: 1 + transform: (source) => + html = markdown source + html = html\gsub '^%s*<p>%s*', '<span>' + html = html\gsub '%s*</p>%s*$', '</span>' + html + } + } +} diff --git a/mmm/mmmfs/plugins/mermaid.moon b/mmm/mmmfs/plugins/mermaid.moon new file mode 100644 index 0000000..ae34afa --- /dev/null +++ b/mmm/mmmfs/plugins/mermaid.moon @@ -0,0 +1,29 @@ +assert window and window.mermaid, "mermaid.js not found" + +window.mermaid\initialize { + startOnLoad: false + fontFamily: 'monospace' +} + +id_counter = 1 + +{ + converts: { + { + inp: 'text/mermaid-graph' + out: 'mmm/dom' + cost: 1 + transform: (source, fileder, key) => + id_counter += 1 + id = "mermaid-#{id_counter}" + with container = document\createElement 'div' + cb = (svg) => + .innerHTML = svg + .firstElementChild.style.width = '100%' + .firstElementChild.style.height = 'auto' + + window\setImmediate (_) -> + window.mermaid\render id, source, cb, container + } + } +} diff --git a/mmm/mmmfs/plugins/twitter.moon b/mmm/mmmfs/plugins/twitter.moon new file mode 100644 index 0000000..b6e1adc --- /dev/null +++ b/mmm/mmmfs/plugins/twitter.moon @@ -0,0 +1,22 @@ +import div, blockquote, a from require 'mmm.dom' + +{ + converts: { + { + inp: 'URL -> twitter/tweet' + out: 'mmm/dom' + cost: 1 + transform: (href) => + id = assert (href\match 'twitter.com/[^/]-/status/(%d*)'), "couldn't parse twitter/tweet URL: '#{href}'" + if MODE == 'CLIENT' + with parent = div! + window.twttr.widgets\createTweet id, parent + else + div blockquote { + class: 'twitter-tweet' + 'data-lang': 'en' + a '(linked tweet)', :href + } + } + } +} diff --git a/mmm/mmmfs/plugins/youtube.moon b/mmm/mmmfs/plugins/youtube.moon new file mode 100644 index 0000000..99cf995 --- /dev/null +++ b/mmm/mmmfs/plugins/youtube.moon @@ -0,0 +1,27 @@ +import iframe from require 'mmm.dom' + +{ + converts: { + { + inp: 'URL -> youtube/video' + out: 'mmm/dom' + cost: 1 + transform: (link) => + id = link\match 'youtu%.be/([^/]+)' + id or= link\match 'youtube.com/watch.*[?&]v=([^&]+)' + id or= link\match 'youtube.com/[ev]/([^/]+)' + id or= link\match 'youtube.com/embed/([^/]+)' + + assert id, "couldn't parse youtube URL: '#{link}'" + + iframe { + width: 560 + height: 315 + frameborder: 0 + allowfullscreen: true + frameBorder: 0 + src: "//www.youtube.com/embed/#{id}" + } + } + } +} |
