package org.zwobble.mammoth.internal.styles; import org.zwobble.mammoth.internal.documents.Break; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Run; import org.zwobble.mammoth.internal.documents.Table; import org.zwobble.mammoth.internal.util.Lists; import org.zwobble.mammoth.internal.util.Optionals; import java.util.List; import java.util.Optional; import static org.zwobble.mammoth.internal.util.Iterables.tryFind; public class StyleMap { public static StyleMapBuilder builder() { return new StyleMapBuilder(); } public static StyleMap merge(StyleMap high, StyleMap low) { // TODO: add appropriate tests return new StyleMap( Optionals.first(high.bold, low.bold), Optionals.first(high.italic, low.italic), Optionals.first(high.underline, low.underline), Optionals.first(high.strikethrough, low.strikethrough), Optionals.first(high.smallCaps, low.smallCaps), Optionals.first(high.commentReference, low.commentReference), Lists.eagerConcat(high.paragraphStyles, low.paragraphStyles), Lists.eagerConcat(high.runStyles, low.runStyles), Lists.eagerConcat(high.tableStyles, low.tableStyles), Lists.eagerConcat(high.breakStyles, low.breakStyles) ); } public static final StyleMap EMPTY = new StyleMapBuilder().build(); private final Optional bold; private final Optional italic; private final Optional underline; private final Optional strikethrough; private final Optional smallCaps; private final Optional commentReference; private final List> paragraphStyles; private final List> runStyles; private final List> tableStyles; private final List> breakStyles; public StyleMap( Optional bold, Optional italic, Optional underline, Optional strikethrough, Optional smallCaps, Optional commentReference, List> paragraphStyles, List> runStyles, List> tableStyles, List> breakStyles ) { this.bold = bold; this.italic = italic; this.underline = underline; this.strikethrough = strikethrough; this.smallCaps = smallCaps; this.commentReference = commentReference; this.paragraphStyles = paragraphStyles; this.runStyles = runStyles; this.tableStyles = tableStyles; this.breakStyles = breakStyles; } public StyleMap update(StyleMap styleMap) { // TODO: add appropriate tests return merge(styleMap, this); } public Optional getBold() { return bold; } public Optional getItalic() { return italic; } public Optional getUnderline() { return underline; } public Optional getStrikethrough() { return strikethrough; } public Optional getSmallCaps() { return smallCaps; } public Optional getCommentReference() { return commentReference; } public Optional getParagraphHtmlPath(Paragraph paragraph) { return tryFind(paragraphStyles, styleMapping -> styleMapping.matches(paragraph)) .map(StyleMapping::getHtmlPath); } public Optional getRunHtmlPath(Run run) { return tryFind(runStyles, styleMapping -> styleMapping.matches(run)) .map(StyleMapping::getHtmlPath); } public Optional getTableHtmlPath(Table table) { return tryFind(tableStyles, styleMapping -> styleMapping.matches(table)) .map(StyleMapping::getHtmlPath); } public Optional getBreakHtmlPath(Break breakElement) { return tryFind(breakStyles, styleMapping -> styleMapping.matches(breakElement)) .map(StyleMapping::getHtmlPath); } }