@@ -25,14 +25,20 @@ return new end local function -main(input, output, log, mode, vars) +main(input, output, log, mode, suggestions, vars) local doc = ct.parse(input.stream, input.src, mode) input.stream:close() if mode['parse:show-tree'] then log:write(dump(doc)) end + + -- the document has now had a chance to give its say; if it hasn't specified + -- any modes of its own, we now merge in the 'weak modes' (suggestions) + for k,v in pairs(suggestions) do + if not mode[k] then mode[k] = v end + end if not mode['render:format'] then error 'what output format should i translate the input to?' end @@ -54,8 +60,9 @@ doc.stage = { kind = 'render'; format = mode['render:format']; mode = mode; + suggestions = suggestions; } output:write(ct.render[mode['render:format']](doc, render_opts)) return 0 @@ -63,23 +70,30 @@ local inp,outp,log = io.stdin, io.stdout, io.stderr local function entry_cli() - local mode, vars, input = default_mode, {}, { + local suggestions, vars, input = default_mode, {}, { stream = inp; src = { file = '(stdin)'; } } + + local mode = {} local optnparams = function(o) local param_opts = { out = 1; log = 1; define = 2; -- key value + ['mode-set'] = 1; ['mode-clear'] = 1; mode = 2; + + ['mode-set-weak'] = 1; + ['mode-clear-weak'] = 1; + ['mode-weak'] = 2; } return param_opts[o] or 0 end @@ -88,10 +102,11 @@ l = 'log'; d = 'define'; V = 'version'; h = 'help'; - y = 'mode-set', n = 'mode-clear'; - m = 'mode'; + y = 'mode-set', Y = 'mode-set-weak'; + n = 'mode-clear', N = 'mode-clear-weak'; + m = 'mode', M = 'mode-weak'; } local checkmodekey = function(key) if not key:match '[^:]+:.+' then @@ -120,8 +135,12 @@ end; mode = function(key,value) mode[checkmodekey(key)] = value end; ['mode-set'] = function(key) mode[checkmodekey(key)] = true end; ['mode-clear'] = function(key) mode[checkmodekey(key)] = false end; + + ['mode-weak'] = function(key,value) suggestions[checkmodekey(key)] = value end; + ['mode-set-weak'] = function(key) suggestions[checkmodekey(key)] = true end; + ['mode-clear-weak'] = function(key) suggestions[checkmodekey(key)] = false end; } local args = {} local keepParsing = true @@ -175,9 +194,9 @@ input.stream = file input.src.file = args[1] end - return main(input, outp, log, mode, vars) + return main(input, outp, log, mode, suggestions, vars) end local ok, e = pcall(entry_cli) -- local ok, e = true, entry_cli()