Index: jrst2/src/java/org/codelutin/jrst/ReStructuredText.java diff -u jrst2/src/java/org/codelutin/jrst/ReStructuredText.java:1.7 jrst2/src/java/org/codelutin/jrst/ReStructuredText.java:1.8 --- jrst2/src/java/org/codelutin/jrst/ReStructuredText.java:1.7 Wed May 9 08:36:15 2007 +++ jrst2/src/java/org/codelutin/jrst/ReStructuredText.java Wed May 9 12:12:19 2007 @@ -23,9 +23,9 @@ * Created: 27 oct. 06 11:10:30 * * @author poussin - * @version $Revision: 1.7 $ + * @version $Revision: 1.8 $ * - * Last update: $Date: 2007/05/09 08:36:15 $ + * Last update: $Date: 2007/05/09 12:12:19 $ * by : $Author: sletellier $ */ @@ -197,6 +197,7 @@ public static final Pattern REGEX_PROBLEMATIC = Pattern.compile("(.*?)"); public static final Pattern REGEX_GENERATED = Pattern.compile("(.*?)"); public static final Pattern REGEX_HYPERLINK_REFERENCE = Pattern.compile("('.+[^<>]+'_)|([^\\S]+[^\\s<>]+_)"); + public static final Pattern REGEX_ANONYMOUS_HYPERLINK_REFERENCE = Pattern.compile("(\\`[^<>`]+\\`__)|([^\\S]+[^\\s<>]+__)"); } Index: jrst2/src/java/org/codelutin/jrst/JRSTReader.java diff -u jrst2/src/java/org/codelutin/jrst/JRSTReader.java:1.18 jrst2/src/java/org/codelutin/jrst/JRSTReader.java:1.19 --- jrst2/src/java/org/codelutin/jrst/JRSTReader.java:1.18 Wed May 9 08:36:15 2007 +++ jrst2/src/java/org/codelutin/jrst/JRSTReader.java Wed May 9 12:12:19 2007 @@ -23,9 +23,9 @@ * Created: 27 oct. 06 00:15:34 * * @author poussin - * @version $Revision: 1.18 $ + * @version $Revision: 1.19 $ * - * Last update: $Date: 2007/05/09 08:36:15 $ + * Last update: $Date: 2007/05/09 12:12:19 $ * by : $Author: sletellier $ */ @@ -296,9 +296,11 @@ private int idMax = 0; private int symbolMax = 0; private int symbolMaxRef = 0; - private LinkedList lblFootnotes = new LinkedList(); - private LinkedList lblFootnotesRef = new LinkedList(); - private LinkedList eFootnotes = new LinkedList(); + private LinkedList lblFootnotes = new LinkedList(); + private LinkedList lblFootnotesRef = new LinkedList(); + private LinkedList eFootnotes = new LinkedList(); + private LinkedList eTarget = new LinkedList(); + private LinkedList eTargetAnonymous = new LinkedList(); static { defaultDirectives = new HashMap(); @@ -611,11 +613,19 @@ lexer.remove(); Element list =composeTarget(item); parent.add(list); - } else if (itemEquals("footnotes", item)) { + } else if (itemEquals("targetAnonymous",item)){ + lexer.remove(); + Element list = composeTargetAnonymous(item); + parent.add(list); + } else if (itemEquals("footnotes", item)) { lexer.remove(); Element[] list =composeFootnote(item); for (Element l : list) parent.add(l); + } else if (itemEquals(COMMENT, item)) { + lexer.remove(); + Element list = composeComment(item); + parent.add(list); } else { @@ -634,11 +644,29 @@ } return parent; } + private Element composeComment(Element item) { + + return item; + } + + + private Element composeTargetAnonymous(Element item) { + Element result = DocumentHelper.createElement(TARGET); + result.addAttribute("anonymous", "1"); + int id = ++idMax; + result.addAttribute("id", "id"+id); + result.addAttribute("refuri", item.attributeValue("refuri")); + eTargetAnonymous.add(result); + return result; + } + + /** * @param item * @return Element */ private Element composeTarget(Element item) { + eTarget.add(item); return item; } /** @@ -1368,7 +1396,6 @@ matcher = REGEX_FOOTNOTE_REFERENCE.matcher(text); - index = 0; while (matcher.find()){ String txtDebut=text.substring(0,matcher.start()); String txtFin=text.substring(matcher.end(),text.length()); @@ -1480,25 +1507,42 @@ done = true; } } - String key = FOOTNOTE_REFERENCE + index++; - temporaries.put(key, footnote.asXML()); text=txtDebut+footnote.asXML()+txtFin; matcher = REGEX_FOOTNOTE_REFERENCE.matcher(text); } + matcher = REGEX_ANONYMOUS_HYPERLINK_REFERENCE.matcher(text); + while (matcher.find()){ + String txtDebut=text.substring(0,matcher.start()); + String txtFin=text.substring(matcher.end(),text.length()); + String ref = text.substring(matcher.start(), matcher.end()-2); + ref = ref.replaceAll("`", ""); + Element anonym = DocumentHelper.createElement("reference"); + anonym.addAttribute("anonymous","1"); + Element target = eTargetAnonymous.getLast(); + eTargetAnonymous.removeLast(); + anonym.addAttribute("name", ref.trim()); + anonym.addAttribute("refuri", target.attributeValue("refuri")); + anonym.setText(ref); + text=txtDebut+anonym.asXML()+txtFin; + matcher = REGEX_ANONYMOUS_HYPERLINK_REFERENCE.matcher(text); + } matcher = REGEX_HYPERLINK_REFERENCE.matcher(text); - index = 0; while (matcher.find()){ String txtDebut=text.substring(0,matcher.start()); String txtFin=text.substring(matcher.end(),text.length()); String ref = text.substring(matcher.start(), matcher.end()-1); - String refFinal = ref.replaceAll("'", ""); - refFinal = refFinal.replaceAll("\\W", " ").trim(); + ref = ref.replaceAll("'", ""); + ref = ref.replaceAll("\\W", " ").trim(); Element hyper = DocumentHelper.createElement("reference"); - hyper.addAttribute("refname", refFinal); - hyper.setText(refFinal); - String key = "reference" + index++; - temporaries.put(key, hyper.asXML()); + hyper.addAttribute("name", ref); + for (Element el : eTarget){ + if (el.attributeValue("id").equals(ref)){ + hyper.addAttribute("refuri",el.attributeValue("refuri")); + } + } + + hyper.setText(ref); text=txtDebut+hyper.asXML()+txtFin; matcher = REGEX_HYPERLINK_REFERENCE.matcher(text); } Index: jrst2/src/java/org/codelutin/jrst/JRSTLexer.java diff -u jrst2/src/java/org/codelutin/jrst/JRSTLexer.java:1.17 jrst2/src/java/org/codelutin/jrst/JRSTLexer.java:1.18 --- jrst2/src/java/org/codelutin/jrst/JRSTLexer.java:1.17 Fri May 4 16:23:28 2007 +++ jrst2/src/java/org/codelutin/jrst/JRSTLexer.java Wed May 9 12:12:19 2007 @@ -23,9 +23,9 @@ * Created: 28 oct. 06 00:44:20 * * @author poussin - * @version $Revision: 1.17 $ + * @version $Revision: 1.18 $ * - * Last update: $Date: 2007/05/04 16:23:28 $ + * Last update: $Date: 2007/05/09 12:12:19 $ * by : $Author: sletellier $ */ @@ -345,6 +345,9 @@ public Element peekBodyElement() throws IOException { Element result = null; if (result == null) { + result = peekComment(); + } + if (result == null) { result = peekDoctestBlock(); } if (result == null) { @@ -384,6 +387,9 @@ result = peekTarget(); } if (result == null) { + result = peekTargetAnonymous(); + } + if (result == null) { result = peekFootnote(); } if (result == null) { @@ -1692,7 +1698,7 @@ Element result = null; String line = in.readLine(); if (line!=null){ - if (line.matches("^\\s*\\.\\.\\s_.+: .+$")){ + if (line.matches("^\\s*\\.\\.\\s_.+:.*")){ result = DocumentHelper.createElement(TARGET); Matcher matcher = Pattern.compile("\\.\\.\\s_").matcher(line); if (matcher.find()){ @@ -1702,7 +1708,13 @@ result.addAttribute("level", ""+level(line)); result.addAttribute("id", line.substring(matcher.end(), i).replaceAll("\\W", "-")); result.addAttribute("name", line.substring(matcher.end(), i)); - result.addAttribute("refuri", line.substring(i+2,line.length())); + if (i+2>line.length()){ + line=in.readLine(); + result.addAttribute("refuri", line.trim()); + } + else + result.addAttribute("refuri", line.substring(i+2,line.length())); + done=true; } } @@ -1712,6 +1724,47 @@ endPeek(); return result; } + private Element peekTargetAnonymous() throws IOException{ + beginPeek(); + Element result = null; + String line=in.readLine(); + if (line!=null){ + if (line.matches("^\\s*__ .+$")){ + result = DocumentHelper.createElement("targetAnonymous"); + result.addAttribute("level", ""+level(line)); + Matcher matcher = Pattern.compile("__ ").matcher(line); + if (matcher.find()){ + result.addAttribute("refuri", line.substring(matcher.end(),line.length())); + } + } + } + + endPeek(); + return result; + } + private Element peekComment() throws IOException{ + beginPeek(); + Element result = null; + String line = in.readLine(); + if (line!=null){ + if (line.matches("^\\.\\.\\s*$")){ + result = DocumentHelper.createElement("comment"); + result.addAttribute("level", "0"); + result.addAttribute("xml:space", "preserve"); + line = in.readLine(); + int level = level(line); + String[] lines = readBlock(level); + String text = line.substring(level); + for (String l : lines) + text+="\n"+l.substring(level); + result.setText(text); + } + } + + + endPeek(); + return result; + } /** * .. _frungible doodads: http://www.example.org/ *