Skip to content

Commit

Permalink
Add capability to include SAMx documents
Browse files Browse the repository at this point in the history
SAMx includes are automatically expanded when converting to XML. They
are not expanded when pretty-printing the SAMx document.
  • Loading branch information
0x8000-0000 committed Apr 7, 2020
1 parent cb4bb13 commit 6c980af
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 32 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group 'net.signbit.samx'
version '0.1.4'
version '0.1.5'

sourceCompatibility = 1.8

Expand Down
6 changes: 3 additions & 3 deletions doc/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ Roadmap for SAMx

To Do:

* Add support for including a SAMx document in another SAMx document.

* Add support for fragments.

* Add support for conditions.
Expand All @@ -19,4 +17,6 @@ To Do:

Done

* Initial support for XML serialization.
* [0.1.5] Add support for including a SAMx document in another SAMx document.

* [0.1.3] Initial support for XML serialization.
55 changes: 42 additions & 13 deletions src/main/antlr/net/signbit/samx/parser/SamX.g4
Original file line number Diff line number Diff line change
Expand Up @@ -142,31 +142,60 @@ tokens { INDENT, DEDENT, END, INVALID, CODE_INDENT }
@parser::members
{
public java.util.HashMap<String, SamXParser.DocumentContext> includedDocuments = new java.util.HashMap<>();
public java.util.HashMap<String, java.io.IOException> includedExceptions = new java.util.HashMap<>();
private java.util.HashMap<String, net.signbit.samx.Parser.Result> includedDocuments = null;
private java.util.HashMap<String, java.io.IOException> includedExceptions = null;
private java.util.HashMap<String, String> referencePaths = new java.util.HashMap<>();
private java.io.File basePath = null;
public void setReferencePath(java.io.File aPath)
public void setBasePath(java.io.File aPath)
{
basePath = aPath;
}

public java.util.HashMap<String, String> getReferencePaths()
{
return referencePaths;
}

public void setIncludeDictionary(java.util.HashMap<String, net.signbit.samx.Parser.Result> aDict)
{
includedDocuments = aDict;
}

public void setIncludeExceptionsDictionary(java.util.HashMap<String, java.io.IOException> aDict)
{
includedExceptions = aDict;
}

private void parseFile(String reference)
{
if (! includedDocuments.containsKey(reference))
java.io.File includeFile = new java.io.File(basePath, reference);
if (includeFile.exists())
{
try
{
java.io.File input = new java.io.File(basePath, reference);
// TODO: what to do about _its_ included documents?
SamXParser.DocumentContext document = net.signbit.samx.Parser.parse(reference).document;
includedDocuments.put(reference, document);
}
catch (java.io.IOException ioe)
referencePaths.put(reference, includeFile.getAbsolutePath());
if (! includedDocuments.containsKey(includeFile.getAbsolutePath()))
{
includedExceptions.put(reference, ioe);
try
{
net.signbit.samx.Parser.Result result = net.signbit.samx.Parser.parse(includeFile,
includedDocuments,
includedExceptions);
includedDocuments.put(includeFile.getAbsolutePath(), result);
}
catch (java.io.IOException ioe)
{
includedExceptions.put(includeFile.getAbsolutePath(), ioe);
}
}
}
else
{
includedExceptions.put(includeFile.getAbsolutePath(), new java.io.FileNotFoundException(includeFile.getAbsolutePath()));
}
}

}
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/net/signbit/samx/ConvertToXml.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ public static void main(String[] args) throws IOException
return;
}

SamXParser.DocumentContext document = Parser.parse(args[0]).document;
Parser.Result result = Parser.parse(args[0]);

FileWriter fileWriter = new FileWriter(args[1]);

BufferedWriter writer = new BufferedWriter(fileWriter);

XmlTextVisitor visitor = new XmlTextVisitor(writer);
XmlTextVisitor visitor = new XmlTextVisitor(writer, result.includedDocuments, result.includedExceptions, result.referencePaths);

visitor.visit(document);
visitor.visit(result.document);

writer.close();
fileWriter.close();
Expand Down
26 changes: 19 additions & 7 deletions src/main/java/net/signbit/samx/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ public class Parser
{
public static class Result
{
public SamXParser.DocumentContext document;
public File inputFile = null;
public SamXParser.DocumentContext document = null;

public HashMap<String, SamXParser.DocumentContext> includedDocuments;
public HashMap<String, IOException> includedExceptions;
public HashMap<String, Result> includedDocuments = new HashMap<>();
public HashMap<String, IOException> includedExceptions = new HashMap<>();
public HashMap<String, String> referencePaths;
}

public static Result parse(String inputFileName) throws IOException
Expand All @@ -50,7 +52,13 @@ public static Result parse(String inputFileName) throws IOException
}
}


public static Result parse(File inputFile) throws IOException
{
return parse(inputFile, new HashMap<>(), new HashMap<>());
}

public static Result parse(File inputFile, HashMap<String, Result> includedDocuments, HashMap<String, IOException> includedExceptions) throws IOException
{
CharStream input = CharStreams.fromFileName(inputFile.getPath());

Expand All @@ -60,12 +68,16 @@ public static Result parse(File inputFile) throws IOException

SamXParser parser = new SamXParser(tokens);

parser.setReferencePath(inputFile.getParentFile());

Result result = new Result();
result.inputFile = inputFile;
result.includedDocuments = includedDocuments;
result.includedExceptions = includedExceptions;

parser.setBasePath(inputFile.getParentFile());
parser.setIncludeDictionary(includedDocuments);
parser.setIncludeExceptionsDictionary(includedExceptions);
result.document = parser.document();
result.includedDocuments = parser.includedDocuments;
result.includedExceptions = parser.includedExceptions;
result.referencePaths = parser.getReferencePaths();

return result;
}
Expand Down
79 changes: 74 additions & 5 deletions src/main/java/net/signbit/samx/XmlTextVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.io.BufferedWriter;
import java.io.IOException;
import java.util.HashMap;

import org.antlr.v4.runtime.tree.ParseTree;

Expand All @@ -18,11 +19,24 @@ public class XmlTextVisitor extends SamXBaseVisitor<Exception>
private int indentLevel = 0;

private boolean indentParagraph = true;
private boolean writeXmlDeclaration = true;
private boolean writeNewlines = true;

public XmlTextVisitor(BufferedWriter aWriter)
private HashMap<String, Parser.Result> includedDocuments;
private HashMap<String, IOException> includedExceptions;
private HashMap<String, String> referencePaths;

public XmlTextVisitor(BufferedWriter aWriter, HashMap<String, Parser.Result> docDict, HashMap<String, IOException> errDict, HashMap<String, String> referenceDict)
{
writer = aWriter;
includedDocuments = docDict;
includedExceptions = errDict;
referencePaths = referenceDict;
}

public void skipXmlDeclaration()
{
writeXmlDeclaration = false;
}

private void addIndent()
Expand Down Expand Up @@ -99,15 +113,21 @@ private void appendNewline()
@Override
public Exception visitDocument(SamXParser.DocumentContext ctx)
{
append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
append("<document>\n");
if (writeXmlDeclaration)
{
append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
append("<document>\n");
}

for (ParseTree pt: ctx.children)
{
visit(pt);
}

append("</document>\n");
if (writeXmlDeclaration)
{
append("</document>\n");
}

return exception;
}
Expand Down Expand Up @@ -356,8 +376,57 @@ public Exception visitRecordSet(SamXParser.RecordSetContext ctx)
}

@Override
public Exception visitRecordRow(SamXParser.RecordRowContext ctx)
public Exception visitIncludeFile(SamXParser.IncludeFileContext ctx)
{
StringBuilder builder = new StringBuilder();

builder.append("<!-- ");
builder.append("include: ");

final String reference = ctx.reference.getText();

builder.append(reference);

String absolutePath = referencePaths.get(reference);

Parser.Result includedResult = includedDocuments.get(absolutePath);
if (includedResult == null)
{
builder.append(" is not found: ");

IOException ioe = includedExceptions.get(absolutePath);

if (ioe != null)
{
builder.append(ioe.getMessage());
}
else
{
builder.append(" exception missing");
}
}

builder.append(" -->");

append(builder);
appendNewline();

if (includedResult != null)
{
XmlTextVisitor visitor = new XmlTextVisitor(writer, includedDocuments, includedExceptions, includedResult.referencePaths);
visitor.skipXmlDeclaration();

visitor.visit(includedResult.document);

StringBuilder endBuilder = new StringBuilder();
endBuilder.append("<!-- ");
endBuilder.append("include: ");
endBuilder.append(reference);
endBuilder.append(" -->");
append(endBuilder);
appendNewline();
}

return null;
}
}
1 change: 1 addition & 0 deletions src/test/resources/includes/header.samx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a header.
1 change: 1 addition & 0 deletions src/test/resources/includes/license.samx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a license.
5 changes: 5 additions & 0 deletions src/test/resources/includes/top.samx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Hello.

<<<(header.samx)
<<<(license.samx)

0 comments on commit 6c980af

Please sign in to comment.