aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2019-10-27 16:35:35 +0000
committers-ol <s-ol@users.noreply.github.com>2019-10-27 16:35:35 +0000
commitabefbf82531021f5ca4149675932a7fe2ff37dde (patch)
tree8e54b02f435f11000babc341ed523a5b57b61194
parentsyntax highlighting in static builds (diff)
downloadmmm-abefbf82531021f5ca4149675932a7fe2ff37dde.tar.gz
mmm-abefbf82531021f5ca4149675932a7fe2ff37dde.zip
move converts into plugins
-rw-r--r--build/server.moon3
-rw-r--r--mmm/mmmfs/browser.moon4
-rw-r--r--mmm/mmmfs/conversion.moon4
-rw-r--r--mmm/mmmfs/init.moon11
-rw-r--r--mmm/mmmfs/plugins/code.moon16
-rw-r--r--mmm/mmmfs/plugins/init.moon (renamed from mmm/mmmfs/converts.moon)142
-rw-r--r--mmm/mmmfs/plugins/markdown.moon33
-rw-r--r--mmm/mmmfs/plugins/mermaid.moon29
-rw-r--r--mmm/mmmfs/plugins/twitter.moon22
-rw-r--r--mmm/mmmfs/plugins/youtube.moon27
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}"
+ }
+ }
+ }
+}