From 543c7f7dff26a7801fedf1f9f903049cc852f9b0 Mon Sep 17 00:00:00 2001 From: Florin Iucha Date: Sat, 25 Apr 2020 13:01:13 -0400 Subject: [PATCH] [Core] Merge grids and general grids --- .idea/codeStyles/codeStyleConfig.xml | 5 + src/main/antlr/SamXParser.g4 | 22 +- .../java/net/signbit/samx/GridVisitor.java | 68 ++++-- .../signbit/samx/PrettyPrinterVisitor.java | 173 ++-------------- .../java/net/signbit/samx/VisitorUtils.java | 193 ++++++++++-------- .../java/net/signbit/samx/XmlTextVisitor.java | 74 +------ .../signbit/samx/parser/XmlConverterTest.java | 1 - src/test/resources/grids/general_grid.samx | 12 +- .../resources/grids/gengrid_rowspan_only.samx | 4 +- src/test/resources/grids/missing_cells.samx | 11 +- src/test/resources/grids/missing_cells.xml | 2 +- src/test/resources/grids/multispan.samx | 2 +- src/test/resources/grids/simple-docbook.xml | 178 ++++++++-------- src/test/resources/grids/simple-pretty.samx | 23 ++- src/test/resources/grids/simple.samx | 23 ++- src/test/resources/grids/simple.xml | 14 +- 16 files changed, 334 insertions(+), 471 deletions(-) create mode 100644 .idea/codeStyles/codeStyleConfig.xml diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..641f056 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/main/antlr/SamXParser.g4 b/src/main/antlr/SamXParser.g4 index e85d3ef..e39ea80 100644 --- a/src/main/antlr/SamXParser.g4 +++ b/src/main/antlr/SamXParser.g4 @@ -192,26 +192,9 @@ spanGridElement : MUL_COLSEP attribute* optionalFlow ; generalGridElement : gridElement | spanGridElement ; -gridHeaderRow - locals [ int columnCount = 0; ] - : attribute* ( gridElement { $ctx.columnCount ++; } )+ NEWLINE { currentHeaderLength = $ctx.columnCount; }; - -gridRecordRow - locals [ int columnCount = 0; ] - : metadata ( gridElement { $ctx.columnCount ++; } )+ NEWLINE - { - if (currentHeaderLength != $ctx.columnCount) - { - throw new ParseCancellationException("line " + $start.getLine() + - ":" + $start.getCharPositionInLine() + - " incorrect number of columns; expected " + currentHeaderLength + - " but observed " + $ctx.columnCount); - } - }; - generalGridHeaderSep : STT_HDR_SEP NEWLINE ; -generalGridRowData : metadata generalGridElement+ COLSEP ; +generalGridRowData : metadata generalGridElement+ ; generalGridRow : (generalGridRowData | GEN_ROW_SEP) NEWLINE ; @@ -246,8 +229,7 @@ block : | STT_INCL reference=text CLOSE_PAR metadata { parseFile($reference.text); } # IncludeFile | STT_IMAGE text CLOSE_PAR blockMetadata # InsertImage | CODE_MARKER language=text CLOSE_PAR metadata NEWLINE+ INDENT (externalCode? NEWLINE)+ DEDENT # CodeBlock - | STT_GRID blockMetadata NEWLINE+ INDENT gridHeaderRow (gridRecordRow | NEWLINE) + DEDENT # Grid - | STT_GEN_GRID blockMetadata NEWLINE+ INDENT + | STT_GRID blockMetadata NEWLINE+ INDENT (header=generalGridGroup? generalGridHeaderSep)? body=generalGridGroup (generalGridHeaderSep? footer=generalGridGroup)? diff --git a/src/main/java/net/signbit/samx/GridVisitor.java b/src/main/java/net/signbit/samx/GridVisitor.java index 6e15e8a..a2c329b 100644 --- a/src/main/java/net/signbit/samx/GridVisitor.java +++ b/src/main/java/net/signbit/samx/GridVisitor.java @@ -114,6 +114,11 @@ public String getAttributesPlain() } return av.toPlainString(); } + + public boolean empty() + { + return flow == null && attributes.isEmpty(); + } } static class GeneralGridRow @@ -135,12 +140,12 @@ public int getColumnCount() { if (ggec.gridElement() != null) { - GridVisitor.GridCell gc = new GridVisitor.GridCell(ggec.gridElement().attribute(), ggec.gridElement().optionalFlow()); + GridCell gc = new GridCell(ggec.gridElement().attribute(), ggec.gridElement().optionalFlow()); cells.add(gc); } else if (ggec.spanGridElement() != null) { - GridVisitor.GridCell gc = new GridVisitor.GridCell(ggec.spanGridElement().attribute(), ggec.spanGridElement().optionalFlow()); + GridCell gc = new GridCell(ggec.spanGridElement().attribute(), ggec.spanGridElement().optionalFlow()); gc.setSpan(ggec.spanGridElement().MUL_COLSEP().getText()); for (int ii = 0; ii < gc.colSpan; ++ii) @@ -154,20 +159,25 @@ else if (ggec.spanGridElement() != null) static class GeneralGridGroup { - ArrayList rows = new ArrayList<>(); + ArrayList rows = new ArrayList<>(); + + final int columnCount; int conditionColumnWidth = 0; int columnWidths[]; + boolean isInteger[]; + boolean isCurrency[]; + boolean isNumeric[]; GeneralGridGroup(SamXParser.GeneralGridGroupContext gggc, SamXParserVisitor visitor) { - HashSet columnCount = new HashSet<>(); + HashSet columnLengths = new HashSet<>(); for (SamXParser.GeneralGridRowContext rc : gggc.generalGridRow()) { final SamXParser.GeneralGridRowDataContext rdc = rc.generalGridRowData(); if (rdc != null) { - final GridVisitor.GeneralGridRow ggr = new GridVisitor.GeneralGridRow(rdc); + final GeneralGridRow ggr = new GeneralGridRow(rdc); if (visitor != null) { @@ -180,24 +190,35 @@ static class GeneralGridGroup } rows.add(ggr); - columnCount.add(ggr.getColumnCount()); + columnLengths.add(ggr.getColumnCount()); } } - if (columnCount.size() != 1) + if (columnLengths.size() != 1) { - throw new RuntimeException("Invalid table specification: multiple table column sizes: " + columnCount.toString()); + throw new RuntimeException("Invalid table specification: multiple table column sizes: " + columnLengths.toString()); } - columnWidths = new int[columnCount.iterator().next()]; + int localColumnCount = columnLengths.iterator().next(); + columnWidths = new int[localColumnCount]; + isInteger = new boolean[localColumnCount]; - if (visitor != null) + for (int ii = 0; ii < localColumnCount; ++ii) { - for (GridVisitor.GeneralGridRow ggr : rows) + isInteger[ii] = true; + } + + boolean lastColumnEmpty = true; + + for (GeneralGridRow ggr : rows) + { + if (visitor != null) { for (int ii = 0; ii < ggr.cells.size(); ++ii) { - final GridVisitor.GridCell gc = ggr.cells.get(ii); + final GridCell gc = ggr.cells.get(ii); + + final String attributes = gc.getAttributesPlain(); final String content = gc.getContent(visitor); int rowSpanIndicator = 0; @@ -206,15 +227,36 @@ static class GeneralGridGroup rowSpanIndicator = gc.rowSpan; } - final int thisWidth = (int) Math.ceil((content.length() + rowSpanIndicator) / (double) (gc.colSpan)); + final int thisWidth = (int) Math.ceil((attributes.length() + content.length() + rowSpanIndicator) / (double) (gc.colSpan)); if (columnWidths[ii] < thisWidth) { columnWidths[ii] = thisWidth; } + + if (!VisitorUtils.isInteger(content)) + { + isInteger[ii] = false; + } + } + } + + if (lastColumnEmpty) + { + final GridCell lastCell = ggr.cells.get(localColumnCount - 1); + if (! lastCell.empty()) + { + lastColumnEmpty = false; } } } + + if (lastColumnEmpty) + { + localColumnCount--; + } + + columnCount = localColumnCount; } } } diff --git a/src/main/java/net/signbit/samx/PrettyPrinterVisitor.java b/src/main/java/net/signbit/samx/PrettyPrinterVisitor.java index 578f7a9..09cfc8f 100644 --- a/src/main/java/net/signbit/samx/PrettyPrinterVisitor.java +++ b/src/main/java/net/signbit/samx/PrettyPrinterVisitor.java @@ -1003,152 +1003,14 @@ public StringBuilder visitMetadata(SamXParser.MetadataContext mc) return builder; } - @Override - public StringBuilder visitGrid(SamXParser.GridContext ctx) - { - StringBuilder builder = new StringBuilder(); - - addIndent(builder); - builder.append("+++"); - builder.append(visitBlockMetadata(ctx.blockMetadata())); - builder.append('\n'); - - indentLevel++; - - int[] columnWidths = new int[ctx.gridHeaderRow().gridElement().size() + 1]; - boolean[] isInteger = new boolean[ctx.gridHeaderRow().gridElement().size() + 1]; - - final SamXParser.GridHeaderRowContext ghrc = ctx.gridHeaderRow(); - ArrayList headerElements = renderGridElementList(null, ghrc.attribute(), ghrc.gridElement()); - for (int ii = 0; ii < headerElements.size(); ++ii) - { - final String value = headerElements.get(ii); - int length = value.length(); - if (value.charAt(0) == '(') - { - length--; - } - columnWidths[ii] = length; - isInteger[ii] = true; - } - - ArrayList> rows = new ArrayList<>(ctx.gridRecordRow().size()); - - for (SamXParser.GridRecordRowContext rrc : ctx.gridRecordRow()) - { - ArrayList rowElements = renderGridElementList(rrc.metadata().condition(), rrc.metadata().attribute(), rrc.gridElement()); - rows.add(rowElements); - - { - final int conditionLength = rowElements.get(0).length(); - if (columnWidths[0] < conditionLength) - { - columnWidths[0] = conditionLength; - } - } - - for (int ii = 0; ii < headerElements.size(); ++ii) - { - final String value = rowElements.get(ii); - int length = value.length(); - if ((!value.isEmpty()) && (value.charAt(0) == '(')) - { - length--; - } - if (columnWidths[ii] < length) - { - columnWidths[ii] = length; - } - - if ((value != null) && (!value.isEmpty())) - { - if (!VisitorUtils.isInteger(value)) - { - isInteger[ii] = false; - } - } - } - } - - addIndent(builder); - if (columnWidths[0] != 0) - { - builder.append(String.format("%1$-" + columnWidths[0] + "s", headerElements.get(0))); - } - for (int ii = 1; ii < headerElements.size(); ++ii) - { - builder.append(" |"); - if (ii != (headerElements.size() - 1)) - { - final String text = headerElements.get(ii); - if (text.charAt(0) != '(') - { - builder.append(' '); - } - builder.append(String.format("%1$-" + columnWidths[ii] + "s", text)); - } - else - { - final String text = headerElements.get(headerElements.size() - 1); - if (text.charAt(0) != '(') - { - builder.append(' '); - } - builder.append(text); - } - } - builder.append('\n'); - - for (ArrayList rowData : rows) - { - addIndent(builder); - if (columnWidths[0] != 0) - { - builder.append(String.format("%1$-" + columnWidths[0] + "s", rowData.get(0))); - } - for (int ii = 1; ii < headerElements.size(); ++ii) - { - builder.append(" |"); - final String text = rowData.get(ii); - if (text.isEmpty() || (text.charAt(0) != '(')) - { - builder.append(' '); - } - if (isInteger[ii]) - { - builder.append(String.format("%1$" + columnWidths[ii] + "s", text)); - } - else - { - if (ii != (headerElements.size() - 1)) - { - builder.append(String.format("%1$-" + columnWidths[ii] + "s", text)); - } - else - { - builder.append(rowData.get(headerElements.size() - 1)); - } - } - } - builder.append('\n'); - } - - indentLevel--; - - builder.append('\n'); - - return builder; - } - - @Override public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) { final GridVisitor.GeneralGridGroup body = new GridVisitor.GeneralGridGroup(ctx.body, this); int conditionColumnWidth = body.conditionColumnWidth; - int columnWidths[] = new int[body.columnWidths.length]; - for (int ii = 0; ii < body.columnWidths.length; ++ii) + int columnWidths[] = new int[body.columnCount]; + for (int ii = 0; ii < body.columnCount; ++ii) { columnWidths[ii] = body.columnWidths[ii]; } @@ -1157,7 +1019,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) if (ctx.header != null) { header = new GridVisitor.GeneralGridGroup(ctx.header, this); - if (header.columnWidths.length != body.columnWidths.length) + if (header.columnCount != body.columnCount) { throw new RuntimeException(String.format("Invalid table specification: multiple table column sizes between header (%d) and body (%d)", header.columnWidths.length, body.columnWidths.length)); } @@ -1167,7 +1029,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) conditionColumnWidth = header.conditionColumnWidth; } - for (int ii = 0; ii < body.columnWidths.length; ++ii) + for (int ii = 0; ii < body.columnCount; ++ii) { if (columnWidths[ii] < header.columnWidths[ii]) { @@ -1180,7 +1042,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) if (ctx.footer != null) { footer = new GridVisitor.GeneralGridGroup(ctx.footer, this); - if (footer.columnWidths.length != body.columnWidths.length) + if (footer.columnCount != body.columnCount) { throw new RuntimeException(String.format("Invalid table specification: multiple table column sizes between footer (%d) and body (%d)", footer.columnWidths.length, body.columnWidths.length)); } @@ -1190,7 +1052,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) conditionColumnWidth = footer.conditionColumnWidth; } - for (int ii = 0; ii < body.columnWidths.length; ++ii) + for (int ii = 0; ii < body.columnCount; ++ii) { if (columnWidths[ii] < footer.columnWidths[ii]) { @@ -1201,7 +1063,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) StringBuilder builder = new StringBuilder(); - builder.append("-+-"); + builder.append("+++"); builder.append(visitBlockMetadata(ctx.blockMetadata())); builder.append('\n'); @@ -1211,14 +1073,14 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) { renderGeneralTableGroup(conditionColumnWidth, columnWidths, header, builder); - renderGeneralTableSeparator(conditionColumnWidth, columnWidths, builder); + renderGeneralTableSeparator(conditionColumnWidth, columnWidths, header.columnCount, builder); } renderGeneralTableGroup(conditionColumnWidth, columnWidths, body, builder); if (footer != null) { - renderGeneralTableSeparator(conditionColumnWidth, columnWidths, builder); + renderGeneralTableSeparator(conditionColumnWidth, columnWidths, footer.columnCount, builder); renderGeneralTableGroup(conditionColumnWidth, columnWidths, footer, builder); } @@ -1230,14 +1092,14 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) return builder; } - private void renderGeneralTableSeparator(int conditionColumnWidth, int[] columnWidths, StringBuilder builder) + private void renderGeneralTableSeparator(int conditionColumnWidth, int[] columnWidths, int columnCount, StringBuilder builder) { addIndent(builder); for (int jj = 0; jj < conditionColumnWidth + 1; ++jj) { builder.append(' '); } - for (int jj = 0; jj < columnWidths.length; ++jj) + for (int jj = 0; jj < columnCount; ++jj) { builder.append('+'); for (int kk = 0; kk < columnWidths[jj] + 2; kk++) @@ -1260,7 +1122,7 @@ private void renderGeneralTableGroup(int conditionColumnWidth, int[] columnWidth builder.append(String.format("%1$-" + conditionColumnWidth + "s", attributeCondition)); } - for (int jj = 0; jj < columnWidths.length; ++jj) + for (int jj = 0; jj < gridGroup.columnCount; ++jj) { final GridVisitor.GridCell gc = ggr.cells.get(jj); if (gc.colSpan > 0) @@ -1289,7 +1151,16 @@ private void renderGeneralTableGroup(int conditionColumnWidth, int[] columnWidth builder.append(' '); columnWidth -= attributes.length(); - builder.append(String.format("%1$-" + columnWidth + "s", gc.getContent(PrettyPrinterVisitor.this))); + final String cellContent = gc.getContent(PrettyPrinterVisitor.this); + + if (gridGroup.isInteger[jj]) + { + builder.append(String.format("%1$" + columnWidth + "s", cellContent)); + } + else + { + builder.append(String.format("%1$-" + columnWidth + "s", cellContent)); + } } } diff --git a/src/main/java/net/signbit/samx/VisitorUtils.java b/src/main/java/net/signbit/samx/VisitorUtils.java index fa63214..4b7d1d7 100644 --- a/src/main/java/net/signbit/samx/VisitorUtils.java +++ b/src/main/java/net/signbit/samx/VisitorUtils.java @@ -30,11 +30,90 @@ public class VisitorUtils { + private static class TestSequence + { + final String string; + final int length; + + int index = 0; + + int line = 1; + int column = 1; + + private TestSequence(String string) + { + this.string = string; + this.length = string.length(); + } + + boolean isExhausted() + { + return index >= length; + } + + char get() + { + return string.charAt(index); + } + + void advance() + { + if (get() == '\n') + { + line++; + column = 1; + } + else + { + column++; + } + index++; + } + + boolean advancePastWhitespace() + { + boolean advanced = false; + + while (! isExhausted()) + { + final char ch = get(); + if ((ch == ' ') || (ch == '\t') || (ch == '\n')) + { + advanced = true; + advance(); + } + else + { + break; + } + } + + return advanced; + } + + void advancePastHeaderSeparator() + { + while (! isExhausted()) + { + final char ch = get(); + if ((ch == '+') || (ch == '=')) + { + advance(); + } + else + { + break; + } + } + } + } + + public static int getTokenIndent(ParserRuleContext ctx, BufferedTokenStream tokenStream) { final Interval blockPosition = ctx.getSourceInterval(); final List whitespacePrecedingBlockPosition = tokenStream.getHiddenTokensToLeft(blockPosition.a, SamXLexer.INDENTS); - if ((whitespacePrecedingBlockPosition != null) && (!whitespacePrecedingBlockPosition.isEmpty())) + if ((whitespacePrecedingBlockPosition != null) && (! whitespacePrecedingBlockPosition.isEmpty())) { return whitespacePrecedingBlockPosition.get(0).getText().length(); } @@ -44,114 +123,54 @@ public static int getTokenIndent(ParserRuleContext ctx, BufferedTokenStream toke } } - public static boolean compareFilesExceptWhitespace(String original, String pretty) + public static boolean compareFilesExceptWhitespace(String originalString, String prettyString) { - int originalIdx = 0; - int prettyIdx = 0; + TestSequence original = new TestSequence(originalString); + TestSequence pretty = new TestSequence(prettyString); int commonSubstring = 0; - final int originalLen = original.length(); - final int prettyLen = pretty.length(); - - int originalLine = 1; - int originalColumn = 1; - - int prettyLine = 1; - int prettyColumn = 1; - - while ((originalIdx < originalLen) && (prettyIdx < prettyLen)) + while ((!original.isExhausted()) && (!pretty.isExhausted())) { - final char originalChr = original.charAt(originalIdx); - if ((originalChr == ' ') || (originalChr == '\t')) + if (original.advancePastWhitespace()) { - originalIdx++; - originalColumn++; continue; } - - if (originalChr == '\n') + if (pretty.advancePastWhitespace()) { - originalIdx++; - originalLine++; - originalColumn = 1; continue; } - final char prettyChr = pretty.charAt(prettyIdx); - if ((prettyChr == ' ') || (prettyChr == '\t')) - { - prettyIdx++; - prettyColumn++; - continue; - } - - if (prettyChr == '\n') - { - prettyIdx++; - prettyLine++; - prettyColumn++; - continue; - } + final char originalChr = original.get(); + final char prettyChr = pretty.get(); if (originalChr == prettyChr) { - originalIdx++; - originalColumn++; - - prettyIdx++; - prettyColumn++; - commonSubstring++; - continue; - } - - throw new RuntimeException(String.format("[stripped] Mismatch at offset %d (line %d, column %d): input has '%c', pretty has '%c' at offset %d (line %d, column %d)", - originalIdx, originalLine, originalColumn, originalChr, prettyChr, prettyIdx, prettyLine, prettyColumn)); - } + if (originalChr == '+') + { + original.advancePastHeaderSeparator(); + pretty.advancePastHeaderSeparator(); + } + else + { + original.advance(); + pretty.advance(); + } - // drain trailing space - while (originalIdx < originalLen) - { - final char originalChr = original.charAt(originalIdx); - if ((originalChr == ' ') || (originalChr == '\t')) - { - originalIdx++; - originalColumn++; continue; } - if (originalChr == '\n') - { - originalIdx++; - originalLine++; - originalColumn = 1; - continue; - } + throw new RuntimeException(String.format("[stripped] Mismatch at offset %d (line %d, column %d): input has '%c', pretty has '%c' at offset %d (line %d, column %d)", + original.index, original.line, original.column, originalChr, prettyChr, pretty.index, pretty.line, pretty.column)); } // drain trailing space - while (prettyIdx < prettyLen) - { - final char prettyChr = pretty.charAt(prettyIdx); - if ((prettyChr == ' ') || (prettyChr == '\t')) - { - prettyIdx++; - prettyColumn++; - continue; - } - - if (prettyChr == '\n') - { - prettyIdx++; - prettyLine++; - prettyColumn++; - continue; - } - } + original.advancePastWhitespace(); + pretty.advancePastWhitespace(); - if ((originalIdx == originalLen) && (prettyIdx == prettyLen)) + if (original.isExhausted() && pretty.isExhausted()) { return true; } @@ -193,12 +212,12 @@ public static void checkMatch(String originalFileName, String pretty) throws IOE { if (original.charAt(ii) == '\n') { - ++lineNumber; + ++ lineNumber; columnNumber = 0; } - ++columnNumber; + ++ columnNumber; - ++ii; + ++ ii; } if (ii == compareLength) diff --git a/src/main/java/net/signbit/samx/XmlTextVisitor.java b/src/main/java/net/signbit/samx/XmlTextVisitor.java index 1554299..dfc0582 100644 --- a/src/main/java/net/signbit/samx/XmlTextVisitor.java +++ b/src/main/java/net/signbit/samx/XmlTextVisitor.java @@ -1003,6 +1003,7 @@ private void renderTitle(ParserRuleContext prc) } } + /* @Override public Object visitGrid(SamXParser.GridContext ctx) { @@ -1093,6 +1094,7 @@ public Object visitGrid(SamXParser.GridContext ctx) return null; } + */ private ArrayList renderGeneralGridRow(SamXParser.GeneralGridRowDataContext ggrdc) { @@ -1138,7 +1140,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) if (ctx.header != null) { header = new GridVisitor.GeneralGridGroup(ctx.header, null); - if (header.columnWidths.length != body.columnWidths.length) + if (header.columnCount != body.columnCount) { throw new RuntimeException(String.format("Invalid table specification: multiple table column sizes between header (%d) and body (%d)", header.columnWidths.length, body.columnWidths.length)); } @@ -1148,7 +1150,7 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) if (ctx.footer != null) { footer = new GridVisitor.GeneralGridGroup(ctx.footer, null); - if (footer.columnWidths.length != body.columnWidths.length) + if (footer.columnCount != body.columnCount) { throw new RuntimeException(String.format("Invalid table specification: multiple table column sizes between footer (%d) and body (%d)", footer.columnWidths.length, body.columnWidths.length)); } @@ -1169,10 +1171,10 @@ public StringBuilder visitGeneralGrid(SamXParser.GeneralGridContext ctx) if (docBookMode) { addIndent(); - append(String.format("", body.columnWidths.length)); + append(String.format("", body.columnCount)); appendNewline(); - for (int ii = 1; ii <= body.columnWidths.length; ++ ii) + for (int ii = 1; ii <= body.columnCount; ++ ii) { addIndent(); append(String.format("", ii)); @@ -1219,7 +1221,7 @@ private void renderGeneralTableGroup(GridVisitor.GeneralGridGroup gridGroup, Str indentLevel++; } - int rowSpans[] = new int[gridGroup.columnWidths.length]; + int rowSpans[] = new int[gridGroup.columnCount]; for (GridVisitor.GeneralGridRow ggr : gridGroup.rows) { @@ -1235,7 +1237,7 @@ private void renderGeneralTableGroup(GridVisitor.GeneralGridGroup gridGroup, Str final ArrayList rowCells = ggr.cells; int jj = 0; - while (jj < rowCells.size()) + while (jj < gridGroup.columnCount) { if (rowSpans[jj] > 0) { @@ -1243,7 +1245,7 @@ private void renderGeneralTableGroup(GridVisitor.GeneralGridGroup gridGroup, Str final int beginEmptySpan = jj; jj ++; - while ((jj < rowCells.size()) && (rowSpans[jj] > 0)) + while ((jj < gridGroup.columnCount) && (rowSpans[jj] > 0)) { rowSpans[jj] --; @@ -1312,64 +1314,6 @@ private void renderGeneralTableGroup(GridVisitor.GeneralGridGroup gridGroup, Str appendCloseTag(getTableRowTag()); } - // TODO: -/* - for (int ii = 0; ii < cells.size(); ++ii) - { - String cellTag = "td"; - if ((headerOffsetAt != 0) && (ii < headerOffsetAt)) - { - cellTag = "th"; - } - - addIndent(); - renderElementWithAttributes("tr", rowAttributes.get(ii)); - appendNewline(); - - indentLevel++; - - final ArrayList rowCells = cells.get(ii); - int jj = 0; - while (jj < rowCells.size()) - { - final GridVisitor.GridCell gc = rowCells.get(jj); - - addIndent(); - - renderElementWithAttributesOpen(cellTag, gc.attributes); - if (gc.colSpan > 1) - { - append(String.format(" colspan=\"%d\"", gc.colSpan)); - } - - if ((gc.flow != null && (!gc.flow.getText().isEmpty()))) - { - append('>'); - gc.renderContent(this); - append('<'); - append('/'); - append(cellTag); - } - else - { - append('/'); - } - append('>'); - appendNewline(); - - jj += gc.colSpan; - } - - indentLevel--; - - addIndent(); - append(""); - appendNewline(); - } - - */ - - if (docBookMode) { indentLevel--; diff --git a/src/test/java/net/signbit/samx/parser/XmlConverterTest.java b/src/test/java/net/signbit/samx/parser/XmlConverterTest.java index 25af80c..6a3eb8a 100644 --- a/src/test/java/net/signbit/samx/parser/XmlConverterTest.java +++ b/src/test/java/net/signbit/samx/parser/XmlConverterTest.java @@ -104,7 +104,6 @@ public void testGrids() throws IOException testConversion("grids/missing_cells.samx", "grids/missing_cells.xml"); - testDocBook("build/resources/test/grids/simple.samx", "article", "grids/simple-docbook.xml"); } diff --git a/src/test/resources/grids/general_grid.samx b/src/test/resources/grids/general_grid.samx index 24392d5..e2514c6 100644 --- a/src/test/resources/grids/general_grid.samx +++ b/src/test/resources/grids/general_grid.samx @@ -2,25 +2,17 @@ RFC793 defines the following Transmission Control Protocol Header Format\: --+-(#tcp-header) ++++(#tcp-header) - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || Source Port || Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |||| Sequence Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |||| Acknowledgment Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data Offset | Reserved | Flags | Window | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || Checksum || Urgent Pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || Options || Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |||| data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --+-(#large-cells) ++++(#large-cells) | || Grouping | | First Header | Second Header | Third Header | diff --git a/src/test/resources/grids/gengrid_rowspan_only.samx b/src/test/resources/grids/gengrid_rowspan_only.samx index fd31ae3..193e0b8 100644 --- a/src/test/resources/grids/gengrid_rowspan_only.samx +++ b/src/test/resources/grids/gengrid_rowspan_only.samx @@ -1,4 +1,4 @@ --+-(#tcp-header) Equal size cells ++++(#tcp-header) Equal size cells || Source Port || Destination Port | |||| Sequence Number | @@ -8,7 +8,7 @@ || Options || Padding | |||| data | --+-(#large-cells) Example spans ++++(#large-cells) Example spans | ||(.emphasize) Grouping | | First Header | Second Header | Third Header | diff --git a/src/test/resources/grids/missing_cells.samx b/src/test/resources/grids/missing_cells.samx index bec4de0..70cbdc4 100644 --- a/src/test/resources/grids/missing_cells.samx +++ b/src/test/resources/grids/missing_cells.samx @@ -2,9 +2,10 @@ This document contains a grid with some missing values. +++(#the-grid)(.fancy) - (.header) | Name | Position | {Office}(.location) | {Age}(.numeric) | Start date | Salary - | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 - (.highlight) | Angelica Ramos | | London | 47 | 2009/10/09 | $1,200,000 - | Ashton Cox | | San Francisco | 66 | 2009/01/12 | $86,000 - | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 + | Name | Position | {Office}(.location) | {Age}(.numeric) | Start date | Salary | + +================+===================+======================+=================+============+============+ + | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 | + (.highlight) | Angelica Ramos | | London | 47 | 2009/10/09 | $1,200,000 | + | Ashton Cox | | San Francisco | 66 | 2009/01/12 | $86,000 | + | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 | diff --git a/src/test/resources/grids/missing_cells.xml b/src/test/resources/grids/missing_cells.xml index d98ff7e..969cd44 100644 --- a/src/test/resources/grids/missing_cells.xml +++ b/src/test/resources/grids/missing_cells.xml @@ -2,7 +2,7 @@

This document contains a grid with some missing values.

- + diff --git a/src/test/resources/grids/multispan.samx b/src/test/resources/grids/multispan.samx index eb5df3c..a88b680 100644 --- a/src/test/resources/grids/multispan.samx +++ b/src/test/resources/grids/multispan.samx @@ -1,4 +1,4 @@ --+-(#multi-span) Example CALS table from DocBook Guide ++++(#multi-span) Example CALS table from DocBook Guide || Horizontal Span | a3 | a4 | a5 | +==========+==========+========+====+=================+ diff --git a/src/test/resources/grids/simple-docbook.xml b/src/test/resources/grids/simple-docbook.xml index 32b1121..8609d4a 100644 --- a/src/test/resources/grids/simple-docbook.xml +++ b/src/test/resources/grids/simple-docbook.xml @@ -4,98 +4,104 @@
Name Position Office
Example table + + + + + + - + Name Position Office - Age - Start date - Salary + Age + Start date + Salary - - Airi Satou - Accountant - Tokyo - 33 - 2008/11/28 - $162,700 - - - Angelica Ramos - Chief Executive Officer (CEO) - London - 47 - 2009/10/09 - $1,200,000 - - - Ashton Cox - Junior Technical Author - San Francisco - 66 - 2009/01/12 - $86,000 - - - Bradley Greer - Software Engineer - London - 41 - 2012/10/13 - $132,000 - - - Brenden Wagner - Software Engineer - San Francisco - 28 - 2011/06/07 - $206,850 - - - Brielle Williamson - Integration Specialist - New York - 61 - 2012/12/02 - $372,000 - - - Bruno Nash - Software Engineer - London - 38 - 2011/05/03 - $163,500 - - - Caesar Vance - Pre-Sales Support - New York - 21 - 2011/12/12 - $106,450 - - - Cara Stevens - Sales Assistant - New York - 46 - 2011/12/06 - $145,600 - - - Cedric Kelly - Senior Javascript Developer - Edinburgh - 22 - 2012/03/29 - $433,060 - - + + Airi Satou + Accountant + Tokyo + 33 + 2008/11/28 + $162,700 + + + Angelica Ramos + Chief Executive Officer (CEO) + London + 47 + 2009/10/09 + $1,200,000 + + + Ashton Cox + Junior Technical Author + San Francisco + 66 + 2009/01/12 + $86,000 + + + Bradley Greer + Software Engineer + London + 41 + 2012/10/13 + $132,000 + + + Brenden Wagner + Software Engineer + San Francisco + 28 + 2011/06/07 + $206,850 + + + Brielle Williamson + Integration Specialist + New York + 61 + 2012/12/02 + $372,000 + + + Bruno Nash + Software Engineer + London + 38 + 2011/05/03 + $163,500 + + + Caesar Vance + Pre-Sales Support + New York + 21 + 2011/12/12 + $106,450 + + + Cara Stevens + Sales Assistant + New York + 46 + 2011/12/06 + $145,600 + + + Cedric Kelly + Senior Javascript Developer + Edinburgh + 22 + 2012/03/29 + $433,060 + + -
+ diff --git a/src/test/resources/grids/simple-pretty.samx b/src/test/resources/grids/simple-pretty.samx index 28d185c..e6851ec 100644 --- a/src/test/resources/grids/simple-pretty.samx +++ b/src/test/resources/grids/simple-pretty.samx @@ -2,15 +2,16 @@ This document contains a grid. +++(#the-grid)(.fancy) Example table - (.header) | Name | Position | {Office}(.location) |(.pink) {Age}(.numeric) |(.header) Start date |(.cyan) Salary - | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 - (.highlight) | Angelica Ramos | Chief Executive Officer (CEO) | London | 47 | 2009/10/09 |(.top) $1,200,000 - | Ashton Cox | Junior Technical Author | San Francisco | 66 | 2009/01/12 | $86,000 - | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 - | Brenden Wagner | Software Engineer | San Francisco | 28 | 2011/06/07 | $206,850 - (.highlight)(.extra) | Brielle Williamson | Integration Specialist | New York | 61 | 2012/12/02 | $372,000 - | Bruno Nash | Software Engineer | London | 38 | 2011/05/03 | $163,500 - | Caesar Vance | Pre-Sales Support | New York | 21 | 2011/12/12 | $106,450 - | Cara Stevens | Sales Assistant | New York | 46 | 2011/12/06 | $145,600 - | Cedric Kelly |(.promo) Senior Javascript Developer | Edinburgh | 22 | 2012/03/29 |(.last) $433,060 + | Name | Position | {Office}(.location) |(.pink) {Age}(.numeric) |(.header) Start date |(.cyan) Salary | + +====================+=====================================+======================+========================+=====================+==================+ + | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 | + (.highlight) | Angelica Ramos | Chief Executive Officer (CEO) | London | 47 | 2009/10/09 |(.top) $1,200,000 | + | Ashton Cox | Junior Technical Author | San Francisco | 66 | 2009/01/12 | $86,000 | + | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 | + | Brenden Wagner | Software Engineer | San Francisco | 28 | 2011/06/07 | $206,850 | + (.highlight)(.extra) | Brielle Williamson | Integration Specialist | New York | 61 | 2012/12/02 | $372,000 | + | Bruno Nash | Software Engineer | London | 38 | 2011/05/03 | $163,500 | + | Caesar Vance | Pre-Sales Support | New York | 21 | 2011/12/12 | $106,450 | + | Cara Stevens | Sales Assistant | New York | 46 | 2011/12/06 | $145,600 | + | Cedric Kelly |(.promo) Senior Javascript Developer | Edinburgh | 22 | 2012/03/29 |(.last) $433,060 | diff --git a/src/test/resources/grids/simple.samx b/src/test/resources/grids/simple.samx index 7631c64..c20128c 100644 --- a/src/test/resources/grids/simple.samx +++ b/src/test/resources/grids/simple.samx @@ -2,15 +2,16 @@ This document contains a grid. +++(#the-grid)(.fancy) Example table - (.header)| Name | Position | {Office}(.location) |(.pink) {Age}(.numeric) |(.header) Start date |(.cyan) Salary - | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 - (.highlight)| Angelica Ramos | Chief Executive Officer (CEO) | London | 47 | 2009/10/09 |(.top) $1,200,000 - | Ashton Cox | Junior Technical Author | San Francisco | 66 | 2009/01/12 | $86,000 - | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 - | Brenden Wagner | Software Engineer | San Francisco | 28 | 2011/06/07 | $206,850 - (.highlight)(.extra)| Brielle Williamson | Integration Specialist | New York | 61 | 2012/12/02 | $372,000 - | Bruno Nash | Software Engineer | London | 38 | 2011/05/03 | $163,500 - | Caesar Vance | Pre-Sales Support | New York | 21 | 2011/12/12 | $106,450 - | Cara Stevens | Sales Assistant | New York | 46 | 2011/12/06 | $145,600 - | Cedric Kelly |(.promo) Senior Javascript Developer | Edinburgh | 22 | 2012/03/29 |(.last) $433,060 + | Name | Position | {Office}(.location) |(.pink) {Age}(.numeric) |(.header) Start date |(.cyan) Salary | + +============+ + | Airi Satou | Accountant | Tokyo | 33 | 2008/11/28 | $162,700 | + (.highlight)| Angelica Ramos | Chief Executive Officer (CEO) | London | 47 | 2009/10/09 |(.top) $1,200,000 | + | Ashton Cox | Junior Technical Author | San Francisco | 66 | 2009/01/12 | $86,000 | + | Bradley Greer | Software Engineer | {London}(.expensive) | 41 | 2012/10/13 | $132,000 | + | Brenden Wagner | Software Engineer | San Francisco | 28 | 2011/06/07 | $206,850 | + (.highlight)(.extra)| Brielle Williamson | Integration Specialist | New York | 61 | 2012/12/02 | $372,000 | + | Bruno Nash | Software Engineer | London | 38 | 2011/05/03 | $163,500 | + | Caesar Vance | Pre-Sales Support | New York | 21 | 2011/12/12 | $106,450 | + | Cara Stevens | Sales Assistant | New York | 46 | 2011/12/06 | $145,600 | + | Cedric Kelly |(.promo) Senior Javascript Developer | Edinburgh | 22 | 2012/03/29 |(.last) $433,060 | diff --git a/src/test/resources/grids/simple.xml b/src/test/resources/grids/simple.xml index 3093d6a..7ffe0c9 100644 --- a/src/test/resources/grids/simple.xml +++ b/src/test/resources/grids/simple.xml @@ -3,13 +3,13 @@

This document contains a grid.

Example table - + - - - + + + @@ -25,7 +25,7 @@ - + @@ -85,11 +85,11 @@ - + - +
Name Position OfficeAgeStart dateSalaryAgeStart dateSalary
Airi SatouLondon 47 2009/10/09$1,200,000$1,200,000
Ashton Cox
Cedric KellySenior Javascript DeveloperSenior Javascript Developer Edinburgh 22 2012/03/29$433,060$433,060