Пример #1
0
  private void handleListItem(Element node, LaTeXDocumentPortion ldp, Context oc) {
    // Are we ignoring this list?
    if (oc.isIgnoreLists()) {
      traverseBlockText(node, ldp, oc);
      return;
    }

    // Apply the style
    BeforeAfter ba = new BeforeAfter();
    palette
        .getListSc()
        .applyListItemStyle(
            oc.getListStyleName(),
            oc.getListLevel(),
            node.getNodeName().equals(XMLString.TEXT_LIST_HEADER),
            "true".equals(node.getAttribute(XMLString.TEXT_RESTART_NUMBERING)),
            Misc.getPosInteger(node.getAttribute(XMLString.TEXT_START_VALUE), 1) - 1,
            ba);

    // export the list item
    if (ba.getBefore().length() > 0) {
      ldp.append(ba.getBefore());
      if (config.formatting() >= LaTeXConfig.CONVERT_MOST) {
        ldp.nl();
      }
    }
    traverseBlockText(node, ldp, oc);
    if (ba.getAfter().length() > 0) {
      ldp.append(ba.getAfter()).nl();
    }
  }
Пример #2
0
  /**
   * Traverse block text (eg. content of body, section, list item). This is traversed in logical
   * order and dedicated handlers take care of each block element.
   *
   * <p>(Note: As a rule, all handling of block level elements should add a newline to the LaTeX
   * document at the end of the block)
   *
   * @param node The element containing the block text
   * @param ldp the <code>LaTeXDocumentPortion</code> to which LaTeX code should be added
   * @param oc the current context
   */
  public void traverseBlockText(Element node, LaTeXDocumentPortion ldp, Context oc) {
    Context ic = (Context) oc.clone();

    // The current paragraph block:
    StyleMap blockMap = config.getParBlockStyleMap();
    String sBlockName = null;

    if (node.hasChildNodes()) {
      NodeList list = node.getChildNodes();
      int nLen = list.getLength();

      for (int i = 0; i < nLen; i++) {
        Node childNode = list.item(i);

        if (childNode.getNodeType() == Node.ELEMENT_NODE) {
          Element child = (Element) childNode;
          String sTagName = child.getTagName();

          // Start/End a paragraph block (not in tables)
          if (!ic.isInTable()) {
            if (sTagName.equals(XMLString.TEXT_P)) {
              String sStyleName =
                  ofr.getParStyles().getDisplayName(child.getAttribute(XMLString.TEXT_STYLE_NAME));
              if (sBlockName != null && !blockMap.isNext(sBlockName, sStyleName)) {
                // end current block
                String sAfter = blockMap.getAfter(sBlockName);
                if (sAfter.length() > 0) ldp.append(sAfter).nl();
                sBlockName = null;
                ic.setVerbatim(false);
              }
              if (sBlockName == null && blockMap.contains(sStyleName)) {
                // start a new block
                sBlockName = sStyleName;
                String sBefore = blockMap.getBefore(sBlockName);
                if (sBefore.length() > 0) ldp.append(sBefore).nl();
                ic.setVerbatim(blockMap.getVerbatim(sStyleName));
              }
            } else if (sBlockName != null) {
              // non-paragraph: end current block
              String sAfter = blockMap.getAfter(sBlockName);
              if (sAfter.length() > 0) ldp.append(sAfter).nl();
              sBlockName = null;
              ic.setVerbatim(false);
            }
          }

          palette.getFieldCv().flushReferenceMarks(ldp, ic);
          palette.getIndexCv().flushIndexMarks(ldp, ic);

          palette.getInfo().addDebugInfo(child, ldp);

          // Basic block content; handle by this class
          if (sTagName.equals(XMLString.TEXT_P)) {
            // is this a caption?
            String sSequence = ofr.getSequenceName(child);
            if (ofr.isFigureSequenceName(sSequence)) {
              palette.getDrawCv().handleCaption(child, ldp, ic);
            } else if (ofr.isTableSequenceName(sSequence)) {
              // Next node *should* be a table
              if (i + 1 < nLen && Misc.isElement(list.item(i + 1), XMLString.TABLE_TABLE)) {
                // Found table with caption above
                palette.getTableCv().handleTable((Element) list.item(++i), child, true, ldp, ic);
              } else {
                // Found lonely caption
                palette.getTableCv().handleCaption(child, ldp, ic);
              }
            } else {
              palette.getParCv().handleParagraph(child, ldp, ic, i == nLen - 1);
            }
          } else if (sTagName.equals(XMLString.TEXT_H)) {
            palette.getHeadingCv().handleHeading(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_LIST)) { // oasis
            handleList(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_UNORDERED_LIST)) {
            handleList(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_ORDERED_LIST)) {
            handleList(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TABLE_TABLE)) {
            // Next node *could* be a caption
            if (i + 1 < nLen
                && Misc.isElement(list.item(i + 1), XMLString.TEXT_P)
                && ofr.isTableSequenceName(ofr.getSequenceName((Element) list.item(i + 1)))) {
              // Found table with caption below
              palette.getTableCv().handleTable(child, (Element) list.item(++i), false, ldp, oc);
            } else {
              // Found table without caption
              palette.getTableCv().handleTable(child, null, false, ldp, oc);
            }
          } else if (sTagName.equals(XMLString.TABLE_SUB_TABLE)) {
            palette.getTableCv().handleTable(child, null, true, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_SECTION)) {
            palette.getSectionCv().handleSection(child, ldp, ic);
          }

          // Draw elements may appear in block context if they are
          // anchored to page
          else if (sTagName.startsWith("draw:")) {
            palette.getDrawCv().handleDrawElement(child, ldp, ic);
          }

          // Indexes
          else if (sTagName.equals(XMLString.TEXT_TABLE_OF_CONTENT)) {
            palette.getIndexCv().handleTOC(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_ILLUSTRATION_INDEX)) {
            palette.getIndexCv().handleLOF(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_TABLE_INDEX)) {
            palette.getIndexCv().handleLOT(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_OBJECT_INDEX)) {
            palette.getIndexCv().handleObjectIndex(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_USER_INDEX)) {
            palette.getIndexCv().handleUserIndex(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_ALPHABETICAL_INDEX)) {
            palette.getIndexCv().handleAlphabeticalIndex(child, ldp, ic);
          } else if (sTagName.equals(XMLString.TEXT_BIBLIOGRAPHY)) {
            palette.getBibCv().handleBibliography(child, ldp, ic);
          }

          // Sequence declarations appear in the main text body (before the actual content)
          else if (sTagName.equals(XMLString.TEXT_SEQUENCE_DECLS)) {
            palette.getFieldCv().handleSequenceDecls(child);
          }
          // other tags are ignored
        }
      }
    }

    if (!oc.isInTable() && sBlockName != null) {
      // end current block
      String sAfter = blockMap.getAfter(sBlockName);
      if (sAfter.length() > 0) ldp.append(sAfter).nl();
      sBlockName = null;
    }
    palette.getFieldCv().flushReferenceMarks(ldp, ic);
    palette.getIndexCv().flushIndexMarks(ldp, ic);
  }
Пример #3
0
  /**
   * Process a list (text:ordered-lst or text:unordered-list tag)
   *
   * @param node The element containing the list
   * @param ldp the <code>LaTeXDocumentPortion</code> to which LaTeX code should be added
   * @param oc the current context
   */
  public void handleList(Element node, LaTeXDocumentPortion ldp, Context oc) {
    // Set up new context
    Context ic = (Context) oc.clone();
    ic.incListLevel();

    // Get the style name, if we don't know it already
    if (ic.getListStyleName() == null) {
      ic.setListStyleName(node.getAttribute(XMLString.TEXT_STYLE_NAME));
    }

    // Use the style to determine the type of list
    ListStyle style = ofr.getListStyle(ic.getListStyleName());
    boolean bOrdered = style != null && style.isNumber(ic.getListLevel());

    // If the list contains headings, ignore it!
    if (ic.isIgnoreLists() || listContainsHeadings(node)) {
      ic.setIgnoreLists(true);
      traverseList(node, ldp, ic);
      return;
    }

    // Apply the style
    BeforeAfter ba = new BeforeAfter();
    palette
        .getListSc()
        .applyListStyle(
            ic.getListStyleName(),
            ic.getListLevel(),
            bOrdered,
            "true".equals(node.getAttribute(XMLString.TEXT_CONTINUE_NUMBERING)),
            ba);

    // Export the list
    if (ba.getBefore().length() > 0) {
      ldp.append(ba.getBefore()).nl();
    }
    traverseList(node, ldp, ic);
    if (ba.getAfter().length() > 0) {
      ldp.append(ba.getAfter()).nl();
    }
  }