Mercurial Hosting > freedit
diff src/lib/Bbcode.luan @ 13:24668255cede
preprocess urls
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 03 Jul 2022 23:59:41 -0600 |
parents | ad1604c72156 |
children | 0edde02b908c |
line wrap: on
line diff
--- a/src/lib/Bbcode.luan Sun Jul 03 22:01:23 2022 -0600 +++ b/src/lib/Bbcode.luan Sun Jul 03 23:59:41 2022 -0600 @@ -3,13 +3,19 @@ local type = Luan.type or error() local ipairs = Luan.ipairs or error() local stringify = Luan.stringify or error() +local Io = require "luan:Io.luan" +local output_of = Io.output_of or error() local Parsers = require "luan:Parsers.luan" local bbcode_parse = Parsers.bbcode_parse or error() local Html = require "luan:Html.luan" local html_encode = Html.encode or error() local Table = require "luan:Table.luan" local is_list = Table.is_list or error() +local String = require "luan:String.luan" +local gsub = String.gsub or error() local User = require "site:/lib/User.luan" +local Shared = require "site:/lib/Shared.luan" +local list_to_set = Shared.list_to_set or error() local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "Bbcode" @@ -111,4 +117,47 @@ %><div post><% to_html(bbcode) %></div><% end + +local doesnt_nest = list_to_set{ + "url" + "code" + "img" + "video" +} + +local function preprocess(bbcode) + if type(bbcode) == "string" then + bbcode = gsub( bbcode, [[(^|\s)(https?://\S+)]], "$1[url]$2[/url]" ) + %><%= bbcode %><% + else + type(bbcode) == "table" or error() + if is_list(bbcode) then + for _, v in ipairs(bbcode) do + preprocess(v) + end + else + local name = bbcode.name + local param = bbcode.param + %>[<%=name%><% + if param ~= nil then + %>=<%=param%><% + end + %>]<% + if doesnt_nest[name] then + %><%=bbcode.contents%><% + else + preprocess(bbcode.contents) + end + %>[/<%=name%>]<% + end + end +end + +function Bbcode.preprocess(bbcode) + bbcode = bbcode_parse(bbcode) + return output_of(function() + preprocess(bbcode) + end) +end + return Bbcode