X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fcore%2Fdocument%2FHeading.java;h=f4a95130d65ea9ad0066797820a8518f300e6331;hb=9522b4873da0b7872cf033c0762a58a73c1ba517;hp=0ae9ad5433ab6e9a7063c364bab508d6bdfc29f2;hpb=e8052e0b1948260c3701bfe80dfaa8fdf5c38053;p=sixth.git diff --git a/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java b/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java index 0ae9ad5..f4a9513 100644 --- a/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java +++ b/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java @@ -1,5 +1,6 @@ package eu.svjatoslav.sixth.core.document; +import eu.svjatoslav.commons.string.String2; import eu.svjatoslav.commons.string.tokenizer.Tokenizer; import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch; import eu.svjatoslav.sixth.core.document.content.ListElement; @@ -16,7 +17,7 @@ public class Heading { public final Heading parent; private final List children = new ArrayList<>(); - public final ListElement rootListElement = new ListElement(null, -1, null, ""); + public final ListElement rootListElement = new ListElement(null, -2, null, ""); private ListElement currentListElement = rootListElement; public Heading(FormattedText name, int level, Heading parent){ @@ -46,12 +47,9 @@ public class Heading { } private String enlistTitleInMD() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < level; i++) - sb.append("#"); - - sb.append(" ").append(name.toMD()).append("\n"); - return sb.toString(); + String2 s = new String2(); + s.append("#", level).append(" ").append(name.toMD(0)).append("\n"); + return s.toString(); } public ListElement getCurrentHeading(){ @@ -72,23 +70,50 @@ public class Heading { String[] listSections = tm.getRegExpGroups(); int indent = listSections[0].length(); String type = listSections[1]; - - FormattedText title = FormattedText.fromOrg(parseFullListTitle(listSections.length > 2 ? listSections[2] : "", tm.getTokenizer(), indent)); - -// System.out.println(" indent: " + indent); -// System.out.println(" type: " + type); -// System.out.println(" title: " + title); - - ListElement parent = null; + FormattedText title = FormattedText.fromOrg(parseFullListTitle(getPartialTitle(listSections), tm.getTokenizer(), indent)); if (indent > currentListElement.indent){ - ListElement newElement = new ListElement(title, indent, parent, type); + // list dept increases + ListElement newElement = new ListElement(title, indent, currentListElement, type); currentListElement.addContent(newElement); currentListElement = newElement; + return; + } + + if (indent == currentListElement.indent){ + // list depth is the same + ListElement newElement = new ListElement(title, indent, currentListElement.parent, type); + currentListElement.parent.addContent(newElement); + currentListElement = newElement; + return; + } + + // list dept decreases + while (true){ + if (currentListElement.parent.indent <= indent){ + if (currentListElement.parent.indent < 0){ + // reached first depth level, cannot go any deeper. + // This special situation arisesbb only when lint indents are not properly aligned. + // That is, document structure is incorrect. + ListElement newElement = new ListElement(title, indent, currentListElement.parent, type); + currentListElement.parent.addContent(newElement); + currentListElement = newElement; + return; + } + + ListElement newElement = new ListElement(title, indent, currentListElement.parent.parent, type); + currentListElement.parent.parent.addContent(newElement); + currentListElement = newElement; + return; + } + currentListElement = currentListElement.parent; } } + private String getPartialTitle(String[] listSections) { + return listSections.length > 2 ? listSections[2] : ""; + } private String parseFullListTitle(String partialTitle, Tokenizer tokenizer, int listIndent){ StringBuilder sb = new StringBuilder(); @@ -97,7 +122,7 @@ public class Heading { while (tokenizer.hasMoreContent()){ final TokenizerMatch tm = tokenizer.getNextToken(); - if (isContentContinuation(tm, listIndent, null)){ + if (isContentContinuation(tm, listIndent, Helper.TG_NORMAL_TEXT)){ String titleContinuation = tm.token.substring(listIndent).trim(); sb.append("\n").append(titleContinuation); continue;