diff src/lib/Bbcode.luan @ 20:3ea49246d6a7

bbcode work
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 13 Jul 2022 22:00:00 -0600
parents 0edde02b908c
children 33731231093a
line wrap: on
line diff
--- a/src/lib/Bbcode.luan	Wed Jul 13 08:47:13 2022 -0600
+++ b/src/lib/Bbcode.luan	Wed Jul 13 22:00:00 2022 -0600
@@ -16,6 +16,7 @@
 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 to_list = Shared.to_list or error()
 local Logging = require "luan:logging/Logging.luan"
 local logger = Logging.logger "Bbcode"
 
@@ -25,46 +26,60 @@
 local to_html
 local html = {}
 
-function html.b(bbcode)
-	%><b><% to_html(bbcode.contents) %></b><%
+function html.b(bbcode,options)
+	%><b><% to_html(bbcode.contents,options) %></b><%
+end
+
+function html.i(bbcode,options)
+	%><i><% to_html(bbcode.contents,options) %></i><%
+end
+
+function html.u(bbcode,options)
+	%><u><% to_html(bbcode.contents,options) %></u><%
 end
 
-function html.i(bbcode)
-	%><i><% to_html(bbcode.contents) %></i><%
+function html.s(bbcode,options)
+	%><s><% to_html(bbcode.contents,options) %></s><%
 end
 
-function html.u(bbcode)
-	%><u><% to_html(bbcode.contents) %></u><%
+function html.sup(bbcode,options)
+	%><sup><% to_html(bbcode.contents,options) %></sup><%
 end
 
-function html.url(bbcode)
+function html.brackets(bbcode,options)
+	%>[<% to_html(bbcode.contents,options) %>]<%
+end
+
+function html.url(bbcode,options)
 	local url = bbcode.param
 	if url == nil then
 		url = html_encode(bbcode.contents)
 		%><a href="<%=url%>"><%=url%></a><%
 	else
 		url = html_encode(url)
-		%><a href="<%=url%>"><% to_html(bbcode.contents) %></a><%
+		%><a href="<%=url%>"><% to_html(bbcode.contents,options) %></a><%
 	end
 end
 
-function html.code(bbcode)
-	%><code><%= html_encode(bbcode.contents) %></code><%
+function html.code(bbcode,options)
+	local s = gsub(bbcode.contents,[[^\n]],"")
+	%><code><%= html_encode(s) %></code><%
+	options.strip_newline = true
 end
 
-function html.img(bbcode)
+function html.img(bbcode,options)
 	%><img src="<%= html_encode(bbcode.contents) %>"><%
 end
 
-function html.color(bbcode)
-	%><span style="color:<%=bbcode.param%>"><% to_html(bbcode.contents) %></span><%
+function html.color(bbcode,options)
+	%><span style="color:<%=bbcode.param%>"><% to_html(bbcode.contents,options) %></span><%
 end
 
-function html.size(bbcode)
-	%><span style="font-size:<%=bbcode.param%>%"><% to_html(bbcode.contents) %></span><%
+function html.size(bbcode,options)
+	%><span style="font-size:<%=bbcode.param%>%"><% to_html(bbcode.contents,options) %></span><%
 end
 
-function html.quote(bbcode)
+function html.quote(bbcode,options)
 	%><blockquote><%
 	local user_name = bbcode.param
 	if user_name ~= nil then
@@ -74,12 +89,15 @@
 		else
 			%><a href="/user_something"><%= user_name %></a> wrote:<%
 		end
+	else
+		options.strip_newline = true
 	end
-	to_html(bbcode.contents)
+	to_html(bbcode.contents,options)
 	%></blockquote><%
+	options.strip_newline = true
 end
 
-function html.video(bbcode)
+function html.video(bbcode,options)
 	local url = html_encode(bbcode.contents)
 	local site = bbcode.site
 	if site == "youtube" then
@@ -96,25 +114,55 @@
 	end
 end
 
-function to_html(bbcode)
+local function list_to_html(bbcode,options)
+	local list = to_list(bbcode.contents)
+	for _, item in ipairs(list) do
+		if type(item) == "table" and item.name == "li" then
+			%><li><% to_html(item.contents,options) %></li><%
+		end
+	end
+	options.strip_newline = true
+end
+
+function html.ul(bbcode,options)
+	%><ul><%
+	list_to_html(bbcode,options)
+	%></ul><%
+end
+
+function html.ol(bbcode,options)
+	%><ol><%
+	list_to_html(bbcode,options)
+	%></ol><%
+end
+
+function to_html(bbcode,options)
+	if options.strip_newline then
+		if type(bbcode) == "string" then
+			bbcode = gsub(bbcode,[[^\n]],"")
+		end
+		options.strip_newline = false
+	end
 	if type(bbcode) == "string" then
 		%><%= html_encode(bbcode) %><%
 	else
 		type(bbcode) == "table" or error()
 		if is_list(bbcode) then
 			for _, v in ipairs(bbcode) do
-				to_html(v)
+				to_html(v,options)
 			end
 		else
 			local fn = html[bbcode.name] or error(bbcode.name.." not handled")
-			fn(bbcode)
+			fn(bbcode,options)
 		end
 	end
 end
 
 function Bbcode.to_html(bbcode)
 	bbcode = bbcode_parse(bbcode)
-	%><div message><% to_html(bbcode) %></div><%
+	%><div message><%
+	to_html(bbcode,{strip_newline=false})
+	%></div><%
 end
 
 
@@ -148,7 +196,11 @@
 			else
 				preprocess(bbcode.contents)
 			end
-			%>[/<%=name%>]<%
+			if name == "code" and param ~= nil then
+				%>[/<%=name%>=<%=param%>]<%
+			else
+				%>[/<%=name%>]<%
+			end
 		end
 	end
 end