Search in sources :

Example 1 with Verse

use of biblemulticonverter.schema.usx.Verse in project BibleMultiConverter by schierlm.

the class USX method doImportBook.

@Override
protected ParatextBook doImportBook(File inputFile) throws Exception {
    if (!inputFile.getName().toLowerCase().endsWith(".usx"))
        return null;
    ValidateXML.validateFileBeforeParsing(getSchema(), inputFile);
    JAXBContext ctx = JAXBContext.newInstance(ObjectFactory.class.getPackage().getName());
    XMLInputFactory xif = XMLInputFactory.newFactory();
    XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream(inputFile));
    Unmarshaller u = ctx.createUnmarshaller();
    u.setListener(unmarshallerLocationListener);
    unmarshallerLocationListener.setXMLStreamReader(inputFile.getName(), xsr);
    Usx doc = (Usx) u.unmarshal(xsr);
    xsr.close();
    ParatextID id = ParatextID.fromIdentifier(doc.getBook().getCode().toUpperCase());
    if (id == null) {
        System.out.println("WARNING: Skipping book with unknown ID: " + doc.getBook().getCode());
        return null;
    }
    ParatextBook result = new ParatextBook(id, doc.getBook().getContent());
    ParatextCharacterContent charContent = null;
    ImportContext context = new ImportContext();
    for (Object o : doc.getParaOrTableOrChapter()) {
        if (o instanceof Para) {
            Para para = (Para) o;
            if (BOOK_HEADER_ATTRIBUTE_TAGS.contains(para.getStyle().value())) {
                String value = "";
                for (Object oo : para.getContent()) {
                    if (oo instanceof String) {
                        value += ((String) oo).replaceAll("[ \r\n\t]+", " ");
                    } else {
                        throw new RuntimeException("Unsupported content in attribute: " + oo.getClass());
                    }
                }
                result.getAttributes().put(para.getStyle().value(), value);
                charContent = null;
            } else if (para.getStyle() == ParaStyle.PB) {
                if (charContent == null) {
                    charContent = new ParatextCharacterContent();
                    result.getContent().add(charContent);
                }
                charContent.getContent().add(new AutoClosingFormatting(AutoClosingFormattingKind.PAGE_BREAK, false));
            } else if (PARA_STYLE_UNSUPPORTED.contains(para.getStyle())) {
                // skip
                charContent = null;
            } else {
                result.getContent().add(new ParagraphStart(PARA_STYLE_MAP.get(para.getStyle())));
                charContent = null;
                if (!para.getContent().isEmpty()) {
                    charContent = new ParatextCharacterContent();
                    result.getContent().add(charContent);
                    parseCharContent(para.getContent(), charContent, result, context);
                }
            }
        } else if (o instanceof Table) {
            Table table = (Table) o;
            for (Row row : table.getRow()) {
                result.getContent().add(new ParagraphStart(ParagraphKind.TABLE_ROW));
                for (Object oo : row.getVerseOrCell()) {
                    if (oo instanceof Verse) {
                        ImportUtilities.closeOpenVerse(result, context.openVerse);
                        context.openVerse = handleVerse(result, (Verse) oo);
                        charContent = new ParatextCharacterContent();
                        result.getContent().add(charContent);
                        charContent.getContent().add(context.openVerse);
                    } else if (oo instanceof Cell) {
                        Cell cell = (Cell) oo;
                        result.getContent().add(new ParatextBook.TableCellStart(cell.getStyle().value()));
                        charContent = new ParatextCharacterContent();
                        result.getContent().add(charContent);
                        parseCharContent(cell.getContent(), charContent, result, context);
                    } else {
                        throw new IOException("Unsupported table row element: " + o.getClass().getName());
                    }
                }
            }
            charContent = null;
        } else if (o instanceof Chapter) {
            ImportUtilities.closeOpenVerse(result, context.openVerse);
            context.openVerse = null;
            // There is not really a good way to accurately determine where the end of a chapter should be placed
            // based on USX 2 content. Maybe a title above this chapter marker was already intended to be part of
            // this chapter. This is basically a best guess. This should not really matter when converting from
            // USX 2 to USFM 2 or USFX (which is based on USFM 2), however when up-converting to USX 3 or USFM 3
            // this might lead to unexpected results.
            ImportUtilities.closeOpenChapter(result, context.openChapter);
            context.openChapter = new ChapterStart(new ChapterIdentifier(result.getId(), ((Chapter) o).getNumber().intValue()));
            result.getContent().add(context.openChapter);
            charContent = null;
        } else if (o instanceof Note) {
            if (charContent == null) {
                charContent = new ParatextCharacterContent();
                result.getContent().add(charContent);
            }
            Note note = (Note) o;
            FootnoteXref nx = new FootnoteXref(NOTE_STYLE_MAP.get(note.getStyle()), note.getCaller());
            charContent.getContent().add(nx);
            parseCharContent(note.getContent(), nx, result, context);
        } else if (o instanceof Sidebar) {
            System.out.println("WARNING: Skipping sidebar (study bible content)");
            charContent = null;
        } else {
            throw new IOException("Unsupported book level element: " + o.getClass().getName());
        }
    }
    ImportUtilities.closeOpenVerse(result, context.openVerse);
    ImportUtilities.closeOpenChapter(result, context.openChapter);
    return result;
}
Also used : XMLStreamReader(javax.xml.stream.XMLStreamReader) JAXBContext(javax.xml.bind.JAXBContext) ParatextID(biblemulticonverter.format.paratext.ParatextBook.ParatextID) Unmarshaller(javax.xml.bind.Unmarshaller) Cell(biblemulticonverter.schema.usx.Cell) AutoClosingFormatting(biblemulticonverter.format.paratext.ParatextCharacterContent.AutoClosingFormatting) Table(biblemulticonverter.schema.usx.Table) Para(biblemulticonverter.schema.usx.Para) Chapter(biblemulticonverter.schema.usx.Chapter) IOException(java.io.IOException) ChapterStart(biblemulticonverter.format.paratext.ParatextBook.ChapterStart) FootnoteXref(biblemulticonverter.format.paratext.ParatextCharacterContent.FootnoteXref) FileInputStream(java.io.FileInputStream) Note(biblemulticonverter.schema.usx.Note) Usx(biblemulticonverter.schema.usx.Usx) Row(biblemulticonverter.schema.usx.Row) ChapterIdentifier(biblemulticonverter.format.paratext.model.ChapterIdentifier) ParagraphStart(biblemulticonverter.format.paratext.ParatextBook.ParagraphStart) XMLInputFactory(javax.xml.stream.XMLInputFactory) Verse(biblemulticonverter.schema.usx.Verse) Sidebar(biblemulticonverter.schema.usx.Sidebar)

Example 2 with Verse

use of biblemulticonverter.schema.usx.Verse in project BibleMultiConverter by schierlm.

the class USX method parseCharContent.

private void parseCharContent(List<Object> content, ParatextCharacterContentContainer container, ParatextBook result, ImportContext context) throws IOException {
    for (Object o : content) {
        if (o instanceof Optbreak) {
            // is ignored in USFM as well
            System.out.println("WARNING: Skipping optional break");
        } else if (o instanceof Ref) {
            Ref r = (Ref) o;
            try {
                container.getContent().add(ParatextCharacterContent.Reference.parse(r.getLoc(), r.getContent()));
            } catch (IllegalArgumentException e) {
                String location = unmarshallerLocationListener.getHumanReadableLocation(o);
                System.out.println("WARNING: Unsupported structured reference format at " + location + " - replaced by plain text: " + r.getLoc());
                final ParatextCharacterContent.Text text = ParatextCharacterContent.Text.from(r.getContent());
                if (text != null) {
                    container.getContent().add(text);
                }
            }
        } else if (o instanceof String) {
            final ParatextCharacterContent.Text text = ParatextCharacterContent.Text.from((String) o);
            if (text != null) {
                container.getContent().add(text);
            }
        } else if (o instanceof Figure) {
            System.out.println("WARNING: Skipping figure");
        } else if (o instanceof Char) {
            Char chr = (Char) o;
            if (CHAR_STYLE_UNSUPPORTED.contains(chr.getStyle())) {
                parseCharContent(chr.getContent(), container, result, context);
            } else {
                AutoClosingFormatting f = new AutoClosingFormatting(CHAR_STYLE_MAP.get(chr.getStyle()), false);
                String lemma = chr.getLemma();
                if (f.getKind() == AutoClosingFormattingKind.WORDLIST && lemma != null && !lemma.isEmpty()) {
                    f.getAttributes().put("lemma", lemma);
                }
                container.getContent().add(f);
                parseCharContent(chr.getContent(), f, result, context);
            }
        } else if (o instanceof Verse) {
            ImportUtilities.closeOpenVerse(result, context.openVerse);
            context.openVerse = handleVerse(result, (Verse) o);
            container.getContent().add(context.openVerse);
        } else if (o instanceof Note) {
            Note note = (Note) o;
            FootnoteXref nx = new FootnoteXref(NOTE_STYLE_MAP.get(note.getStyle()), note.getCaller());
            container.getContent().add(nx);
            parseCharContent(note.getContent(), nx, result, context);
        } else {
            throw new IOException("Unsupported character content element: " + o.getClass().getName());
        }
    }
}
Also used : AutoClosingFormatting(biblemulticonverter.format.paratext.ParatextCharacterContent.AutoClosingFormatting) IOException(java.io.IOException) FootnoteXref(biblemulticonverter.format.paratext.ParatextCharacterContent.FootnoteXref) Optbreak(biblemulticonverter.schema.usx.Optbreak) Figure(biblemulticonverter.schema.usx.Figure) Ref(biblemulticonverter.schema.usx.Ref) Char(biblemulticonverter.schema.usx.Char) Note(biblemulticonverter.schema.usx.Note) Verse(biblemulticonverter.schema.usx.Verse)

Aggregations

AutoClosingFormatting (biblemulticonverter.format.paratext.ParatextCharacterContent.AutoClosingFormatting)2 FootnoteXref (biblemulticonverter.format.paratext.ParatextCharacterContent.FootnoteXref)2 Note (biblemulticonverter.schema.usx.Note)2 Verse (biblemulticonverter.schema.usx.Verse)2 IOException (java.io.IOException)2 ChapterStart (biblemulticonverter.format.paratext.ParatextBook.ChapterStart)1 ParagraphStart (biblemulticonverter.format.paratext.ParatextBook.ParagraphStart)1 ParatextID (biblemulticonverter.format.paratext.ParatextBook.ParatextID)1 ChapterIdentifier (biblemulticonverter.format.paratext.model.ChapterIdentifier)1 Cell (biblemulticonverter.schema.usx.Cell)1 Chapter (biblemulticonverter.schema.usx.Chapter)1 Char (biblemulticonverter.schema.usx.Char)1 Figure (biblemulticonverter.schema.usx.Figure)1 Optbreak (biblemulticonverter.schema.usx.Optbreak)1 Para (biblemulticonverter.schema.usx.Para)1 Ref (biblemulticonverter.schema.usx.Ref)1 Row (biblemulticonverter.schema.usx.Row)1 Sidebar (biblemulticonverter.schema.usx.Sidebar)1 Table (biblemulticonverter.schema.usx.Table)1 Usx (biblemulticonverter.schema.usx.Usx)1