Mercurial > hg > mpdl-group
view software/eXist/mpdl-modules/src/org/exist/xquery/modules/mpdltext/ToCLevelGenerator.java @ 0:408254cf2f1d
Erstellung
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Wed, 24 Nov 2010 17:24:23 +0100 |
parents | |
children |
line wrap: on
line source
/* * eXist Open Source Native XML Database: Extension module * Copyright (C) 2008 Josef Willenborg * jwillenborg@mpiwg-berlin.mpg.de * http://www.mpiwg-berlin.mpg.de * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: TextModule.java $ */ package org.exist.xquery.modules.mpdltext; import org.exist.memtree.NodeImpl; import org.exist.dom.NodeSet; import org.exist.dom.QName; import org.exist.memtree.DocumentImpl; import org.exist.memtree.MemTreeBuilder; import org.exist.xquery.BasicFunction; import org.exist.xquery.Cardinality; import org.exist.xquery.FunctionSignature; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.value.Item; import org.exist.xquery.value.MemoryNodeSet; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceType; import org.exist.xquery.value.Type; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author Josef Willenborg (jwillenborg@mpiwg-berlin.mpg.de) */ public class ToCLevelGenerator extends BasicFunction { public final static FunctionSignature signature = new FunctionSignature( new QName("generate-toc-levels", MPDLTextModule.NAMESPACE_URI, MPDLTextModule.PREFIX), "A function which generates toc levels of the given toc entries " + "and the starting levels", new SequenceType[] { new SequenceType(Type.ITEM, Cardinality.ZERO_OR_MORE) }, new SequenceType(Type.NODE, Cardinality.ZERO_OR_MORE)); public ToCLevelGenerator(XQueryContext context) { super(context, signature); } public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { Sequence tocEntriesSeq = args[0]; if (tocEntriesSeq.isEmpty()) return Sequence.EMPTY_SEQUENCE; boolean tocEntriesIsPersistent = tocEntriesSeq.isPersistentSet(); // Workaround: when entries are persistent (not in memory) if (tocEntriesIsPersistent) return evalAsPersistentSeq(args, contextSequence); int level = 0; int level1 = 0; int level2 = 0; int level3 = 0; int level4 = 0; int level5 = 0; int level6 = 0; int level7 = 0; DocumentImpl doc = null; MemTreeBuilder builder = context.getDocumentBuilder(); builder.startElement("", "toc-entries", "toc-entries", null); for (int i=0; i<tocEntriesSeq.getItemCount(); i++) { MemoryNodeSet nodeToNodeSet = tocEntriesSeq.toMemNodeSet(); Node node = nodeToNodeSet.get(i); NodeList childNodeList = node.getChildNodes(); int childsLength = childNodeList.getLength(); if (childsLength > 0) { builder.startElement("", "toc-entry", "toc-entry", null); for (int j=0; j<childsLength; j++) { NodeImpl childNode = (NodeImpl)childNodeList.item(j); String childNodeName = childNode.getLocalName(); String childNodeValue = childNode.getStringValue(); builder.startElement("", childNodeName, childNodeName, null); if (childNodeValue != null) builder.characters(childNodeValue); builder.endElement(); if (childNodeName.equals("level")) { int nodeLevel = 1; // default is a level one node try { nodeLevel = new Integer(childNodeValue).intValue(); } catch (NumberFormatException e) { // nothing } if (level > nodeLevel) { if (nodeLevel == 1) { level2 = 0; level3 = 0; level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 2) { level3 = 0; level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 3) { level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 4) { level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 5) { level6 = 0; level7 = 0; } else if (nodeLevel == 6) { level7 = 0; } } level = nodeLevel; if (level == 1) level1++; else if (level == 2) level2++; else if (level == 3) level3++; else if (level == 4) level4++; else if (level == 5) level5++; else if (level == 6) level6++; else if (level == 7) level7++; } } String levelString = ""; if (level1 != 0) levelString += level1 + "."; if (level2 != 0) levelString += level2 + "."; if (level3 != 0) levelString += level3 + "."; if (level4 != 0) levelString += level4 + "."; if (level5 != 0) levelString += level5 + "."; if (level6 != 0) levelString += level6 + "."; if (level7 != 0) levelString += level7 + "."; builder.startElement("", "level-string", "level-string", null); builder.characters(levelString); builder.endElement(); String[] splitStr = levelString.split("\\."); int realLevel = splitStr.length; builder.startElement("", "real-level", "real-level", null); builder.characters("" + realLevel); builder.endElement(); builder.endElement(); } } builder.endElement(); doc = ((DocumentImpl)builder.getDocument()); return doc; } public Sequence evalAsPersistentSeq(Sequence[] args, Sequence contextSequence) throws XPathException { Sequence tocEntriesSeq = args[0]; if (tocEntriesSeq.isEmpty()) return Sequence.EMPTY_SEQUENCE; int level = 0; int level1 = 0; int level2 = 0; int level3 = 0; int level4 = 0; int level5 = 0; int level6 = 0; int level7 = 0; DocumentImpl doc = null; MemTreeBuilder builder = context.getDocumentBuilder(); builder.startElement("", "toc-entries", "toc-entries", null); for (int i=0; i<tocEntriesSeq.getItemCount(); i++) { Item item = tocEntriesSeq.itemAt(i); NodeValue nv = (NodeValue) item; NodeImpl nodeTmp = (NodeImpl) nv; NodeSet nodeToNodeSet = nodeTmp.toNodeSet(); Node node = nodeToNodeSet.item(0); NodeList childNodeList = node.getChildNodes(); int childsLength = childNodeList.getLength(); if (childsLength > 0) { builder.startElement("", "toc-entry", "toc-entry", null); for (int j=0; j<childsLength; j++) { Node childNode = childNodeList.item(j); String childNodeName = childNode.getLocalName(); String childNodeValue = childNode.getNodeValue(); builder.startElement("", childNodeName, childNodeName, null); if (childNodeValue != null) builder.characters(childNodeValue); builder.endElement(); if (childNodeName.equals("level")) { int nodeLevel = 1; // default is a level one node try { nodeLevel = new Integer(childNodeValue).intValue(); } catch (NumberFormatException e) { // nothing } if (level > nodeLevel) { if (nodeLevel == 1) { level2 = 0; level3 = 0; level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 2) { level3 = 0; level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 3) { level4 = 0; level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 4) { level5 = 0; level6 = 0; level7 = 0; } else if (nodeLevel == 5) { level6 = 0; level7 = 0; } else if (nodeLevel == 6) { level7 = 0; } } level = nodeLevel; if (level == 1) level1++; else if (level == 2) level2++; else if (level == 3) level3++; else if (level == 4) level4++; else if (level == 5) level5++; else if (level == 6) level6++; else if (level == 7) level7++; } } String levelString = ""; if (level1 != 0) levelString += level1 + "."; if (level2 != 0) levelString += level2 + "."; if (level3 != 0) levelString += level3 + "."; if (level4 != 0) levelString += level4 + "."; if (level5 != 0) levelString += level5 + "."; if (level6 != 0) levelString += level6 + "."; if (level7 != 0) levelString += level7 + "."; builder.startElement("", "level-string", "level-string", null); builder.characters(levelString); builder.endElement(); String[] splitStr = levelString.split("\\."); int realLevel = splitStr.length; builder.startElement("", "real-level", "real-level", null); builder.characters("" + realLevel); builder.endElement(); builder.endElement(); } } builder.endElement(); doc = ((DocumentImpl)builder.getDocument()); return doc; } }