Search in sources :

Example 11 with EntityDef

use of us.parr.bookish.model.entity.EntityDef in project bookish by parrt.

the class Translator method visitSubsection.

@Override
public OutputModelObject visitSubsection(BookishParser.SubsectionContext ctx) {
    String title = ctx.sec.getText();
    title = title.substring(title.indexOf(' ') + 1).trim();
    Pair<String, String> results = splitSectionTitle(title);
    title = results.a;
    String anchor = results.b;
    EntityDef def = null;
    if (anchor != null) {
        def = document.getEntity(anchor);
        if (def == null) {
            System.err.printf("line %d: Unknown label '%s'\n", ctx.start.getLine(), anchor);
            return null;
        }
    }
    List<ContainerWithTitle> subsubsections = new ArrayList<>();
    for (ParseTree el : ctx.subsubsection()) {
        subsubsections.add((SubSection) visit(el));
    }
    Join sec = (Join) visitSection_content(ctx.section_content());
    return new SubSection(def, title, anchor, sec != null ? sec.elements : null, subsubsections);
}
Also used : ContainerWithTitle(us.parr.bookish.model.ContainerWithTitle) SubSubSection(us.parr.bookish.model.SubSubSection) SubSection(us.parr.bookish.model.SubSection) ArrayList(java.util.ArrayList) Join(us.parr.bookish.model.Join) ParseTree(org.antlr.v4.runtime.tree.ParseTree) EntityDef(us.parr.bookish.model.entity.EntityDef)

Example 12 with EntityDef

use of us.parr.bookish.model.entity.EntityDef in project bookish by parrt.

the class Translator method visitRef.

@Override
public OutputModelObject visitRef(BookishParser.RefContext ctx) {
    String label = stripQuotes(ctx.REF().getText());
    EntityDef def = document.getEntity(label);
    System.out.println("Ref to " + def);
    if (def == null) {
        System.err.printf("line %d: Unknown label '%s'\n", ctx.start.getLine(), label);
        return new UnknownRef(ctx.REF().getSymbol());
    }
    Class<? extends EntityRef> refClass = defToRefMap.get(def.getClass());
    try {
        Constructor<? extends EntityRef> ctor = refClass.getConstructor(EntityDef.class);
        EntityRef entityRef = ctor.newInstance(def);
        return entityRef;
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
    return null;
}
Also used : UnknownRef(us.parr.bookish.model.ref.UnknownRef) EntityRef(us.parr.bookish.model.ref.EntityRef) IOException(java.io.IOException) EntityDef(us.parr.bookish.model.entity.EntityDef)

Example 13 with EntityDef

use of us.parr.bookish.model.entity.EntityDef in project bookish by parrt.

the class Tool method process.

public void process(String[] args) throws Exception {
    options = handleArgs(args);
    String metadataFilename = option("metadataFilename");
    inputDir = new File(metadataFilename).getParent();
    outputDir = option("o");
    String outFilename;
    Translator trans;
    Target target = (Target) optionO("target");
    ParrtIO.mkdir(outputDir + "/images");
    String snippetsDir = getBuildDir(metadataFilename) + "/snippets";
    ParrtIO.mkdir(snippetsDir);
    if (metadataFilename.endsWith(".md")) {
        // just one file (legacy stuff)
        String inputFilename = metadataFilename;
        Book book = new Book(this, "", "");
        book.entities = new HashMap<>();
        trans = new Translator(book, book.entities, target, outputDir);
        if (target == Target.HTML) {
            outFilename = "index.html";
        } else {
            outFilename = stripFileExtension(basename(inputFilename)) + ".tex";
        }
        Pair<Document, String> results = legacy_translate(trans, inputDir, basename(inputFilename));
        String output = results.b;
        ParrtIO.save(outputDir + "/" + outFilename, output);
        // System.out.println("Wrote "+outputDir+"/"+outFilename);
        copyImages(book, inputDir, outputDir);
        return;
    }
    // otherwise, read and use metadata
    JsonReader jsonReader = Json.createReader(new FileReader(metadataFilename));
    JsonObject metadata = jsonReader.readObject();
    // System.out.println(metadata);
    String title = metadata.getString("title");
    Book book = new Book(this, title, null);
    String author = metadata.getString("author");
    dataDir = metadata.getString("data");
    // Rule paragraph needs blank line on the front
    author = "\n\n" + author;
    trans = new Translator(book, null, target, outputDir);
    book.author = translateString(trans, author, "paragraph");
    String mainOutFilename;
    if (target == Target.HTML) {
        mainOutFilename = "index.html";
    } else {
        mainOutFilename = "book.tex";
    }
    // parse all documents first to get entity defs
    List<BookishParser.DocumentContext> trees = new ArrayList<>();
    List<Map<String, EntityDef>> entities = new ArrayList<>();
    List<List<ExecutableCodeDef>> codeBlocks = new ArrayList<>();
    JsonArray markdownFilenames = metadata.getJsonArray("chapters");
    for (JsonValue f : markdownFilenames) {
        String fname = stripQuotes(f.toString());
        book.filenames.add(fname);
        Pair<BookishParser.DocumentContext, BookishParser> results = parseChapter(inputDir, fname, book.chapCounter);
        book.chapCounter++;
        trees.add(results.a);
        entities.add(results.b.entities);
        codeBlocks.add(results.b.codeBlocks);
    }
    executeCodeSnippets(book, getBuildDir(metadataFilename), codeBlocks);
    // now walk all trees and translate
    List<Document> documents = new ArrayList<>();
    for (int i = 0; i < book.filenames.size(); i++) {
        String fname = book.filenames.get(i);
        BookishParser.DocumentContext tree = trees.get(i);
        Map<String, EntityDef> thisDocsEntities = entities.get(i);
        trans = new Translator(book, thisDocsEntities, target, outputDir);
        // get doc for single chapter
        Document doc = (Document) trans.visit(tree);
        book.addChapterDocument(doc);
        doc.chapter.connectContainerTree();
        ModelConverter converter = new ModelConverter(trans.templates);
        ST outputST = converter.walk(doc);
        // walk all OutputModelObjects created as labeled entities to convert those entities
        // unlabeled entities are done in-line
        ArrayList<String> labels = new ArrayList<>(thisDocsEntities.keySet());
        for (String label : labels) {
            EntityDef def = thisDocsEntities.get(label);
            def.template = converter.walk(def.model);
            if (def.isGloballyVisible()) {
                // move to global space
                book.entities.put(label, def);
                thisDocsEntities.remove(label);
            }
        }
        String output = outputST.render();
        doc.markdownFilename = fname;
        documents.add(doc);
        if (target == Target.HTML) {
            outFilename = stripFileExtension(fname) + ".html";
        } else {
            outFilename = stripFileExtension(fname) + ".tex";
        }
        ParrtIO.save(outputDir + "/" + outFilename, output);
        doc.generatedFilename = outFilename;
    // System.out.println("Wrote "+outputDir+"/"+outFilename);
    }
    ST bookTemplate = trans.templates.getInstanceOf("Book");
    bookTemplate.add("model", book);
    ParrtIO.save(outputDir + "/" + mainOutFilename, bookTemplate.render());
    // System.out.println("Wrote "+outputDir+"/"+mainOutFilename);
    copyImages(book, inputDir, outputDir);
    execCommandLine(String.format("cp -r %s/css %s", inputDir, outputDir));
// copyImages(BUILD_DIR, outputDir);
}
Also used : ArrayList(java.util.ArrayList) JsonObject(javax.json.JsonObject) Document(us.parr.bookish.model.Document) EntityDef(us.parr.bookish.model.entity.EntityDef) Translator(us.parr.bookish.translate.Translator) Book(us.parr.bookish.model.Book) JsonReader(javax.json.JsonReader) FileReader(java.io.FileReader) ArrayList(java.util.ArrayList) List(java.util.List) ST(org.stringtemplate.v4.ST) JsonValue(javax.json.JsonValue) ModelConverter(us.parr.bookish.translate.ModelConverter) BookishParser(us.parr.bookish.parse.BookishParser) JsonArray(javax.json.JsonArray) File(java.io.File) STGroupFile(org.stringtemplate.v4.STGroupFile) HashMap(java.util.HashMap) Map(java.util.Map) MultiMap(org.antlr.v4.runtime.misc.MultiMap)

Aggregations

EntityDef (us.parr.bookish.model.entity.EntityDef)13 ArrayList (java.util.ArrayList)5 ParseTree (org.antlr.v4.runtime.tree.ParseTree)4 Join (us.parr.bookish.model.Join)4 ContainerWithTitle (us.parr.bookish.model.ContainerWithTitle)3 SubSubSection (us.parr.bookish.model.SubSubSection)3 OutputModelObject (us.parr.bookish.model.OutputModelObject)2 Paragraph (us.parr.bookish.model.Paragraph)2 SubSection (us.parr.bookish.model.SubSection)2 TextBlock (us.parr.bookish.model.TextBlock)2 BookishParser (us.parr.bookish.parse.BookishParser)2 File (java.io.File)1 FileReader (java.io.FileReader)1 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 JsonArray (javax.json.JsonArray)1 JsonObject (javax.json.JsonObject)1 JsonReader (javax.json.JsonReader)1