Compare commits

..

No commits in common. "1087e0d51185a3dbf1d1f732d307c20d77a89050" and "ea83a31b164e3e74f0a2b74a75ff67303ccee200" have entirely different histories.

4 changed files with 10 additions and 106 deletions

View File

@ -142,7 +142,6 @@ body {
margin-right: 25%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.post-inner {
@ -158,7 +157,6 @@ pre code {
border-bottom-left-radius: 8px;
border-left: 10px solid rgb(229.84, 231.92, 227.28);
padding: 20px;
overflow: scroll;
}
.inline-code {
@ -509,7 +507,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus, select:focus
height: 150px;
}
ul, ol {
ul {
margin: 10px 0 10px 30px;
padding: 0;
}

View File

@ -1,82 +1,16 @@
local babycode = {}
local string_trim = require("lapis.util").trim
local function s_split(s, delimiter, max_matches, trim, allow_empty)
local result = {}
if s == "" then
return result
end
trim = trim == nil and true or trim
local tr = function(subj)
if trim then return string_trim(subj) else return subj end
end
max_matches = max_matches or -1
allow_empty = allow_empty == nil and true or allow_empty
if delimiter == "" then
for i=1, #s do
local c = s:sub(i, 1)
if allow_empty or c ~= "" then
table.insert(result, c)
if max_matches > 0 and #result == max_matches then
break
end
end
end
return result
end
local current_pos = 1
local delim_len = #delimiter
while true do
if max_matches > 0 and #result >= max_matches then
break
end
---@diagnostic disable-next-line: param-type-mismatch
local start_pos, end_pos = s:find(delimiter, current_pos, true)
if not start_pos then
break
end
local substr = s:sub(current_pos, start_pos - 1)
if allow_empty or substr ~= "" then
table.insert(result, tr(substr))
end
current_pos = end_pos + 1
end
local substr = s:sub(current_pos)
if allow_empty or substr ~= "" then
table.insert(result, tr(substr))
end
return result
end
local function get_list_items(list_body, escape_html)
list_body = list_body:gsub(" +%s*\r?\n", "<br>")
list_body = list_body:gsub("(%S)(\r?\n\r?\n)\r?\n*", "%1\1")
local list_items = s_split(list_body, "\1")
local lis = ""
for _, li in ipairs(list_items) do
local rendered = babycode.to_html(li, escape_html)
lis = lis .. "<li>" .. rendered .. "</li>"
end
return lis
end
---renders babycode to html
---@param s string input babycode
---@param escape_html fun(s: string): string function that escapes html
function babycode.to_html(s, escape_html)
if not s or s == "" then return "" end
local text = escape_html(s)
-- extract code blocks and store them as placeholders
-- extract code blocks first and store them as placeholders
-- don't want to process bbcode embedded into a code block
local code_blocks = {}
local inline_codes = {}
text = text:gsub("%[code%](.-)%[/code%]", function(code)
s = escape_html(s)
local text = s:gsub("%[code%](.-)%[/code%]", function(code)
local is_inline = code:match("\n") == nil
if is_inline then
table.insert(inline_codes, code)
@ -89,17 +23,10 @@ function babycode.to_html(s, escape_html)
end
end)
text = text:gsub("%[ul%](.-)%[/ul%]", function(list_body)
return "<ul>" .. get_list_items(list_body, escape_html) .. "</ul>"
end)
text = text:gsub("%[ol%](.-)%[/ol%]", function(list_body)
return "<ol>" .. get_list_items(list_body, escape_html) .. "</ol>"
end)
text = text:gsub(" %s?\r?\n", "<br>")
-- normalize newlines
text = text:gsub("\r?\n\r?\n+", "<br>")
-- normalize newlines, attempt #4
text = text:gsub(" +%s*\r?\n", "<br>")
text = text:gsub("(%S)(\r?\n\r?\n)\r?\n*", "%1<br><br>")
local url_tags = {}
-- replace `[url=https://example.com]Example[/url] tags
text = text:gsub("%[url=([^%]]+)%](.-)%[/url%]", function(url, label)
@ -113,6 +40,8 @@ function babycode.to_html(s, escape_html)
text = text:gsub("%[s%](.-)%[/s%]", "<del>%1</del>")
-- these can be nested, so replace open and closed separately
-- text = text:gsub("%[quote%]", "<blockquote>")
-- text = text:gsub("%[/quote%]", "</blockquote>")
text = text:gsub("%[(/?)quote%]", "<%1blockquote>")
-- replace loose links

View File

@ -186,7 +186,6 @@ body {
margin-right: 25%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.post-inner {
@ -202,7 +201,6 @@ pre code {
border-bottom-left-radius: 8px;
border-left: 10px solid $lighter;
padding: 20px;
overflow: scroll;
}
.inline-code {
@ -525,7 +523,7 @@ input[type="text"], input[type="password"], textarea, select {
}
ul, ol {
ul {
margin: 10px 0 10px 30px;
padding: 0;
}

View File

@ -6,27 +6,6 @@
<li>[i]<i>italic</i>[/i]</li>
<li>[s]<del>strikethrough</del>[/s]</li>
<li>[url=https://example.com]<a href="https://example.com">labeled URL</a>[/url]</li>
<li>
[ul] and [ol] are unordered and ordered lists:
<details>
<summary>Show list example</summary>
<pre><span class="copy-code-container"><button type=button class="copy-code" value="[ul]
item 1
item 2
item 3
still item 3 (break line without inserting a new item by using two spaces at the end of a line)
[/ul]">Copy</button></span><code>[ul]
item 1
item 2
item 3
still item 3 (break line without inserting a new item by using two spaces at the end of a line)
[/ul]</code></pre>
</details>
</li>
<li>
[code]with<br>line breaks[/code] will produce a code block:
<details>