Mercurial Hosting > luan
comparison src/goodjava/bbcode/BBCode.java @ 1714:31a82b0d0a87
bbcode and html work
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 18 Jul 2022 23:49:47 -0600 |
parents | 36c28be6d432 |
children | 6c9aea554691 |
comparison
equal
deleted
inserted
replaced
1713:4d70e9543ef2 | 1714:31a82b0d0a87 |
---|---|
2 | 2 |
3 import java.util.List; | 3 import java.util.List; |
4 import java.util.ArrayList; | 4 import java.util.ArrayList; |
5 import java.util.Map; | 5 import java.util.Map; |
6 import java.util.LinkedHashMap; | 6 import java.util.LinkedHashMap; |
7 import java.util.regex.Matcher; | |
8 import java.util.regex.Pattern; | 7 import java.util.regex.Pattern; |
9 import goodjava.parser.Parser; | 8 import goodjava.parser.Parser; |
10 | 9 |
11 | 10 |
12 public final class BBCode { | 11 public final class BBCode { |
274 private Element parseColor() { | 273 private Element parseColor() { |
275 parser.begin(); | 274 parser.begin(); |
276 if( !parser.matchIgnoreCase("[color=") ) | 275 if( !parser.matchIgnoreCase("[color=") ) |
277 return parser.failure(null); | 276 return parser.failure(null); |
278 int start = parser.currentIndex(); | 277 int start = parser.currentIndex(); |
279 parser.match('#'); | |
280 while( parser.inCharRange('0','9') | 278 while( parser.inCharRange('0','9') |
281 || parser.inCharRange('a','z') | 279 || parser.inCharRange('a','z') |
282 || parser.inCharRange('A','Z') | 280 || parser.inCharRange('A','Z') |
281 || parser.anyOf("#(, )") | |
283 ); | 282 ); |
284 String color = parser.textFrom(start); | 283 String color = parser.textFrom(start); |
285 if( !parser.match(']') ) | 284 if( !parser.match(']') ) |
286 return parser.failure(null); | 285 return parser.failure(null); |
287 Object content = parseUntil("[/color]"); | 286 Object content = parseUntil("[/color]"); |
295 parser.begin(); | 294 parser.begin(); |
296 if( !parser.matchIgnoreCase("[size=") ) | 295 if( !parser.matchIgnoreCase("[size=") ) |
297 return parser.failure(null); | 296 return parser.failure(null); |
298 int start = parser.currentIndex(); | 297 int start = parser.currentIndex(); |
299 while( parser.match('.') || parser.inCharRange('0','9') ); | 298 while( parser.match('.') || parser.inCharRange('0','9') ); |
299 if( parser.matchIgnoreCase("pt") || parser.match('%') ) | |
300 ; // ok | |
300 String size = parser.textFrom(start); | 301 String size = parser.textFrom(start); |
301 if( !parser.match(']') ) | 302 if( !parser.match(']') ) |
302 return parser.failure(null); | 303 return parser.failure(null); |
303 Object content = parseUntil("[/size]"); | 304 Object content = parseUntil("[/size]"); |
304 if( content==null ) | 305 if( content==null ) |
305 return parser.failure(null); | 306 return parser.failure(null); |
306 Element rtn = new Element("size",size,content); | 307 Element rtn = new Element("size",size,content); |
307 return parser.success(rtn); | 308 return parser.success(rtn); |
308 } | 309 } |
309 | 310 |
310 private static final Pattern youtubePtn1 = Pattern.compile("https://youtu.be/([a-zA-Z0-9_-]+)(?:\\?t=([0-9]+))?"); | |
311 private static final Pattern youtubePtn2 = Pattern.compile("https://www.youtube.com/watch?v=([a-zA-Z0-9_-]+)(?:\\?t=([0-9]+)s)?"); | |
312 private static final Pattern bitchutePtn = Pattern.compile("https://www.bitchute.com/video/([a-zA-Z0-9]+)/"); | |
313 | |
314 private static Matcher find(Pattern ptn,String s) { | |
315 Matcher m = ptn.matcher(s); | |
316 return m.find() ? m : null; | |
317 } | |
318 | |
319 private Element parseVideo() { | 311 private Element parseVideo() { |
320 parser.begin(); | 312 parser.begin(); |
321 if( !parser.matchIgnoreCase("[video]") ) | 313 if( !parser.matchIgnoreCase("[video]") ) |
322 return parser.failure(null); | 314 return parser.failure(null); |
323 String url = parseRealUrl(); | 315 String url = parseRealUrl(); |
324 if( !parser.matchIgnoreCase("[/video]") ) | 316 if( !parser.matchIgnoreCase("[/video]") ) |
325 return parser.failure(null); | 317 return parser.failure(null); |
326 Map<String,String> extra = new LinkedHashMap<String,String>(); | 318 Element rtn = new Element("video",null,url); |
327 Element rtn = new Element("video",null,url,extra); | |
328 Matcher m; | |
329 m = find(youtubePtn1,url); | |
330 if( m == null ) | |
331 m = find(youtubePtn2,url); | |
332 if( m != null ) { | |
333 extra.put( "site", "youtube" ); | |
334 extra.put( "id", m.group(1) ); | |
335 String t = m.group(2); | |
336 if( t != null ) | |
337 extra.put( "start", t ); | |
338 return parser.success(rtn); | |
339 } | |
340 m = find(bitchutePtn,url); | |
341 if( m != null ) { | |
342 extra.put( "site", "bitchute" ); | |
343 extra.put( "id", m.group(1) ); | |
344 return parser.success(rtn); | |
345 } | |
346 return parser.success(rtn); | 319 return parser.success(rtn); |
347 } | 320 } |
348 | 321 |
349 | 322 |
350 private Element parseQuote() { | 323 private Element parseQuote() { |