From 9e0a6a78616ab9ede6830c078245a195791e5ee4 Mon Sep 17 00:00:00 2001 From: rsiddharth Date: Sun, 11 Nov 2012 19:09:17 +0530 Subject: new feature: special text (symbols) are quoted to HTML number inside a code-block modified: parsers/CodeBlocks.java (new class 'SymbolMap' which has a list of symbols & their corresponding HTML number) ( quote() in 'CodeBlock' class uses the SymbolMap to quote text) parsers/ParserList.java (list re-ordered, CodeBlock has gone up) parsers/QuoteSpecialText.java ( if regex matches '#', it leaves the text un-quoted) --- parsers/CodeBlocks.java | 85 ++++++++++++++++++++++++++++++++++++++----- parsers/ParserList.java | 2 +- parsers/QuoteSpecialText.java | 4 +- 3 files changed, 78 insertions(+), 13 deletions(-) (limited to 'parsers') diff --git a/parsers/CodeBlocks.java b/parsers/CodeBlocks.java index 64e8841..251c4de 100644 --- a/parsers/CodeBlocks.java +++ b/parsers/CodeBlocks.java @@ -22,10 +22,12 @@ package scruf.parsers; import java.util.regex.*; +import java.util.*; public class CodeBlocks implements Parser { + private SymbolMap symbolMap = new SymbolMap(); public String parse(String fileContent) { - Pattern pattern = Pattern.compile("(\\#\\#\\#)(\\n+)(.+?)(\\n+)(\\1)", + Pattern pattern = Pattern.compile("(\\#\\#\\#)(\\n)(.+?)(\\n)(\\1)", Pattern.DOTALL); Matcher matcher = pattern.matcher(fileContent); LineBreak lbreak = new LineBreak(); @@ -34,7 +36,7 @@ public class CodeBlocks implements Parser { while(matcher.find()) { replacement.delete(0,replacement.length()); replacement.append("
"); - replacement.append(lbreak.parse(quote(matcher.group(3)))); + replacement.append(lbreak.parse(quote(matcher.group(3)))); replacement.append("
"); matcher.appendReplacement(sbuffer,replacement.toString()); } @@ -42,21 +44,84 @@ public class CodeBlocks implements Parser { return sbuffer.toString(); } /** - * this method quotes special characters -- `\` & - * `$`, in the replacment string as they have - * special meaning. - * + * this method quotes symbols to a HTML number. */ private String quote(String string) { - Pattern pattern = Pattern.compile("\\$|\\\\"); + Pattern pattern = Pattern.compile("(\\&(amp|lt|gt|(\\#35))\\;)|(\\p{Punct})"); Matcher matcher = pattern.matcher(string); StringBuffer sbuffer = new StringBuffer(); - String rep; while(matcher.find()) { - rep = "\\\\\\"+matcher.group(); - matcher.appendReplacement(sbuffer,rep); + if(matcher.group(4)!=null) { + matcher.appendReplacement(sbuffer, + symbolMap.get(matcher.group())); + } } matcher.appendTail(sbuffer); return sbuffer.toString(); } } + +/** + * Map of Symbols & their HTML equivalent numbers. + */ +class SymbolMap extends HashMap { + public SymbolMap() { + put("!","!"); + put("\"","""); + put("#","#"); + put("$","$"); + put("%","%"); + put("&","&"); + put("'","'"); + put("(","("); + put(")",")"); + put("*","*"); + put("+","+"); + put(",",","); + put("-","-"); + put(".","."); + put("/","/"); + put(":",":"); + put(";",";"); + put("<","<"); + put("=","="); + put(">",">"); + put("?","?"); + put("@","@"); + put("[","["); + put("\\","\"); + put("]","]"); + put("^","^"); + put("_","_"); + put("`","`"); + put("{","{"); + put("|","|"); + put("}","}"); + put("~","~"); + } +} +/** + +Special Case: + +### + +. +{ +### +oced +### +. +### +code +### +. +### +fizz +### +} +. +### + + +*/ \ No newline at end of file diff --git a/parsers/ParserList.java b/parsers/ParserList.java index 999dadc..685de25 100644 --- a/parsers/ParserList.java +++ b/parsers/ParserList.java @@ -30,9 +30,9 @@ public class ParserList { // add Parsers. NOTE: parser order is significant. parsers.add(new QuoteSpecialText()); parsers.add(new DocumentName()); + parsers.add(new CodeBlocks()); parsers.add(new DocumentDate()); parsers.add(new WordDecoration()); - parsers.add(new CodeBlocks()); parsers.add(new Headings()); parsers.add(new Links()); parsers.add(new Images()); diff --git a/parsers/QuoteSpecialText.java b/parsers/QuoteSpecialText.java index 165ffa9..76241cc 100644 --- a/parsers/QuoteSpecialText.java +++ b/parsers/QuoteSpecialText.java @@ -33,10 +33,10 @@ public class QuoteSpecialText implements Parser { qmap.put(">",">"); } public String parse(String fileContent) { - Pattern pattern = Pattern.compile("(\\&)|(\\<)|(\\>)"); + Pattern pattern = Pattern.compile("(\\&\\#35\\;)|(\\&)|(\\<)|(\\>)"); Matcher matcher = pattern.matcher(fileContent); StringBuffer sbuffer = new StringBuffer(); - while(matcher.find()) { + while(matcher.find() && matcher.group(1)==null) { matcher.appendReplacement(sbuffer, qmap.get(matcher.group())); } -- cgit v1.2.3