Mercurial Hosting > freedit
comparison src/lib/Bbcode.luan @ 29:a1db5223ced1
luan changes
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 25 Jul 2022 21:28:10 -0600 |
parents | d9d7aa2a79db |
children | 8ff35379cc89 |
comparison
equal
deleted
inserted
replaced
28:d9d7aa2a79db | 29:a1db5223ced1 |
---|---|
13 local html_parse = Html.parse or error() | 13 local html_parse = Html.parse or error() |
14 local Table = require "luan:Table.luan" | 14 local Table = require "luan:Table.luan" |
15 local is_list = Table.is_list or error() | 15 local is_list = Table.is_list or error() |
16 local concat = Table.concat or error() | 16 local concat = Table.concat or error() |
17 local String = require "luan:String.luan" | 17 local String = require "luan:String.luan" |
18 local gsub = String.gsub or error() | 18 local regex = String.regex or error() |
19 local matches = String.matches or error() | 19 local ends_with = String.ends_with or error() |
20 local match = String.match or error() | |
21 local User = require "site:/lib/User.luan" | 20 local User = require "site:/lib/User.luan" |
22 local Shared = require "site:/lib/Shared.luan" | 21 local Shared = require "site:/lib/Shared.luan" |
23 local list_to_set = Shared.list_to_set or error() | 22 local list_to_set = Shared.list_to_set or error() |
24 local to_list = Shared.to_list or error() | 23 local to_list = Shared.to_list or error() |
25 local Logging = require "luan:logging/Logging.luan" | 24 local Logging = require "luan:logging/Logging.luan" |
26 local logger = Logging.logger "Bbcode" | 25 local logger = Logging.logger "Bbcode" |
27 | 26 |
28 | 27 |
29 local Bbcode = {} | 28 local Bbcode = {} |
29 | |
30 local starting_cr_regex = regex[[^\n]] | |
30 | 31 |
31 local to_html | 32 local to_html |
32 local html = {} | 33 local html = {} |
33 | 34 |
34 function html.b(bbcode,options) | 35 function html.b(bbcode,options) |
65 %><a href="<%=url%>"><% to_html(bbcode.contents,options) %></a><% | 66 %><a href="<%=url%>"><% to_html(bbcode.contents,options) %></a><% |
66 end | 67 end |
67 end | 68 end |
68 | 69 |
69 function html.code(bbcode,options) | 70 function html.code(bbcode,options) |
70 local s = gsub(bbcode.contents,[[^\n]],"") | 71 local s = starting_cr_regex.gsub(bbcode.contents,"") |
71 %><code><%= html_encode(s) %></code><% | 72 %><code><%= html_encode(s) %></code><% |
72 options.strip_newline = true | 73 options.strip_newline = true |
73 end | 74 end |
74 | 75 |
75 function html.img(bbcode,options) | 76 function html.img(bbcode,options) |
106 %><iframe width="560" height="315" frameborder="0" allowfullscreen src="<%=url%>"></iframe><% | 107 %><iframe width="560" height="315" frameborder="0" allowfullscreen src="<%=url%>"></iframe><% |
107 end | 108 end |
108 | 109 |
109 local video_handlers = {} | 110 local video_handlers = {} |
110 do | 111 do |
111 local ptn1 = [[https://youtu.be/([a-zA-Z0-9_-]+)(?:\?t=([0-9]+))?]] | 112 local ptn1 = regex[[https://youtu.be/([a-zA-Z0-9_-]+)(?:\?t=([0-9]+))?]] |
112 local ptn2 = [[https://www.youtube.com/watch\?v=([a-zA-Z0-9_-]+)(?:&t=([0-9]+)s)?]] | 113 local ptn2 = regex[[https://www.youtube.com/watch\?v=([a-zA-Z0-9_-]+)(?:&t=([0-9]+)s)?]] |
113 function video_handlers.youtube(url) | 114 function video_handlers.youtube(url) |
114 local id, start = match(url,ptn1) | 115 local id, start = ptn1.match(url) |
115 if id == nil then | 116 if id == nil then |
116 id, start = match(url,ptn2) | 117 id, start = ptn2.match(url) |
117 end | 118 end |
118 if id == nil then | 119 if id == nil then |
119 return false | 120 return false |
120 end | 121 end |
121 url = "https://www.youtube.com/embed/"..id | 122 url = "https://www.youtube.com/embed/"..id |
125 video_iframe(url) | 126 video_iframe(url) |
126 return true | 127 return true |
127 end | 128 end |
128 end | 129 end |
129 do | 130 do |
130 local ptn = [[https://rumble.com/embed/[a-z0-9]+/\?pub=[a-z0-9]+]] | 131 local ptn = regex[[https://rumble.com/embed/[a-z0-9]+/\?pub=[a-z0-9]+]] |
131 function video_handlers.rumble(url) | 132 function video_handlers.rumble(url) |
132 if not matches(url,ptn) then | 133 if not ptn.matches(url) then |
133 return false | 134 return false |
134 end | 135 end |
135 video_iframe(url) | 136 video_iframe(url) |
136 return true | 137 return true |
137 end | 138 end |
138 end | 139 end |
139 do | 140 do |
140 local ptn = [[https://www.bitchute.com/video/([a-zA-Z0-9]+)/]] | 141 local ptn = regex[[https://www.bitchute.com/video/([a-zA-Z0-9]+)/]] |
141 function video_handlers.bitchute(url) | 142 function video_handlers.bitchute(url) |
142 local id = match(url,ptn) | 143 local id = ptn.match(url) |
143 if id == nil then | 144 if id == nil then |
144 return false | 145 return false |
145 end | 146 end |
146 url = "https://www.bitchute.com/embed/"..id.."/" | 147 url = "https://www.bitchute.com/embed/"..id.."/" |
147 video_iframe(url) | 148 video_iframe(url) |
148 return true | 149 return true |
149 end | 150 end |
150 end | 151 end |
151 do | 152 do |
152 local ptn = [[https://vimeo.com/([0-9]+)]] | 153 local ptn = regex[[https://vimeo.com/([0-9]+)]] |
153 function video_handlers.vimeo(url) | 154 function video_handlers.vimeo(url) |
154 local id = match(url,ptn) | 155 local id = ptn.match(url) |
155 if id == nil then | 156 if id == nil then |
156 return false | 157 return false |
157 end | 158 end |
158 url = "https://player.vimeo.com/video/"..id | 159 url = "https://player.vimeo.com/video/"..id |
159 video_iframe(url) | 160 video_iframe(url) |
160 return true | 161 return true |
161 end | 162 end |
162 end | 163 end |
163 do | 164 do |
164 local ptn = [[https://dai.ly/([a-z0-9]+)]] | 165 local ptn = regex[[https://dai.ly/([a-z0-9]+)]] |
165 function video_handlers.dailymotion(url) | 166 function video_handlers.dailymotion(url) |
166 local id = match(url,ptn) | 167 local id = ptn.match(url) |
167 if id == nil then | 168 if id == nil then |
168 return false | 169 return false |
169 end | 170 end |
170 url = "https://www.dailymotion.com/embed/video/"..id | 171 url = "https://www.dailymotion.com/embed/video/"..id |
171 video_iframe(url) | 172 video_iframe(url) |
172 return true | 173 return true |
173 end | 174 end |
174 end | 175 end |
175 do | 176 do |
176 local ptn = [[https://www.tiktok.com/[^/]+/video/([0-9]+)]] | 177 local ptn = regex[[https://www.tiktok.com/[^/]+/video/([0-9]+)]] |
177 function video_handlers.tiktok(url) | 178 function video_handlers.tiktok(url) |
178 local id = match(url,ptn) | 179 local id = ptn.match(url) |
179 if id == nil then | 180 if id == nil then |
180 return false | 181 return false |
181 end | 182 end |
182 %><blockquote class="tiktok-embed" data-video-id="<%=id%>" style="max-width: 560px; margin-left: 0;"><section></section></blockquote><% | 183 %><blockquote class="tiktok-embed" data-video-id="<%=id%>" style="max-width: 560px; margin-left: 0;"><section></section></blockquote><% |
183 %><script async src="https://www.tiktok.com/embed.js"></script><% | 184 %><script async src="https://www.tiktok.com/embed.js"></script><% |
184 return true | 185 return true |
185 end | 186 end |
186 end | 187 end |
187 do | 188 do |
188 local ptn = [[\.[a-zA-Z0-9]+$]] | 189 local ptn = regex[[\.[a-zA-Z0-9]+$]] |
189 function video_handlers.file(url) | 190 function video_handlers.file(url) |
190 if not matches(url,ptn) then | 191 if not ptn.matches(url) then |
191 return false | 192 return false |
192 end | 193 end |
193 %><video controls width="560"><source src="<%=html_encode(url)%>"></video><% | 194 %><video controls width="560"><source src="<%=html_encode(url)%>"></video><% |
194 return true | 195 return true |
195 end | 196 end |
227 end | 228 end |
228 | 229 |
229 function to_html(bbcode,options) | 230 function to_html(bbcode,options) |
230 if options.strip_newline then | 231 if options.strip_newline then |
231 if type(bbcode) == "string" then | 232 if type(bbcode) == "string" then |
232 bbcode = gsub(bbcode,[[^\n]],"") | 233 bbcode = starting_cr_regex.gsub(bbcode,"") |
233 end | 234 end |
234 options.strip_newline = false | 235 options.strip_newline = false |
235 end | 236 end |
236 if type(bbcode) == "string" then | 237 if type(bbcode) == "string" then |
237 %><%= html_encode(bbcode) %><% | 238 %><%= html_encode(bbcode) %><% |
261 "code" | 262 "code" |
262 "img" | 263 "img" |
263 "video" | 264 "video" |
264 } | 265 } |
265 | 266 |
267 local url_regex = regex[[(^|\s)(https?://\S+)]] | |
268 | |
266 local function preprocess(bbcode) | 269 local function preprocess(bbcode) |
267 if type(bbcode) == "string" then | 270 if type(bbcode) == "string" then |
268 bbcode = gsub( bbcode, [[(^|\s)(https?://\S+)]], "$1[url]$2[/url]" ) | 271 bbcode = url_regex.gsub( bbcode, "$1[url]$2[/url]" ) |
269 %><%= bbcode %><% | 272 %><%= bbcode %><% |
270 else | 273 else |
271 type(bbcode) == "table" or error() | 274 type(bbcode) == "table" or error() |
272 if is_list(bbcode) then | 275 if is_list(bbcode) then |
273 for _, v in ipairs(bbcode) do | 276 for _, v in ipairs(bbcode) do |
301 preprocess(bbcode) | 304 preprocess(bbcode) |
302 end) | 305 end) |
303 end | 306 end |
304 | 307 |
305 function Bbcode.remove_html(text) | 308 function Bbcode.remove_html(text) |
306 local ends_with_newline = matches(text,[[\n$]]) | 309 local ends_with_newline = ends_with(text,"\n") |
307 local t = {} | 310 local t = {} |
308 local html = html_parse(text) | 311 local html = html_parse(text) |
309 local is_first = true | 312 local is_first = true |
310 for _, v in ipairs(html) do | 313 for _, v in ipairs(html) do |
311 if type(v) == "string" then | 314 if type(v) == "string" then |