2 * This file is part of NeverNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\r
8 * Software distributed under the License is distributed
\r
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
\r
10 * express or implied. See the GPL for the specific language
\r
11 * governing rights and limitations.
\r
13 * You should have received a copy of the GPL along with this
\r
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
\r
15 * or write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
21 package cx.fbn.nevernote.xml;
\r
23 import java.util.ArrayList;
\r
24 import java.util.List;
\r
25 import java.util.regex.Matcher;
\r
26 import java.util.regex.Pattern;
\r
28 import com.trolltech.qt.xml.QDomDocument;
\r
29 import com.trolltech.qt.xml.QDomDocumentFragment;
\r
30 import com.trolltech.qt.xml.QDomElement;
\r
31 import com.trolltech.qt.xml.QDomNode;
\r
32 import com.trolltech.qt.xml.QDomNodeList;
\r
33 import com.trolltech.qt.xml.QDomText;
\r
35 public class XMLInsertHilight {
\r
36 private final QDomDocument doc;
\r
38 List<QDomNode> oldNodes;
\r
39 List<QDomNode> newNodes;
\r
41 public XMLInsertHilight(QDomDocument d, List<String> t) {
\r
44 oldNodes = new ArrayList<QDomNode>();
\r
45 newNodes = new ArrayList<QDomNode>();
\r
48 public QDomDocument getDoc() {
\r
49 for (int i=0; i<oldNodes.size(); i++) {
\r
50 oldNodes.get(i).parentNode().replaceChild(newNodes.get(i), oldNodes.get(i));
\r
54 // Start looking through the tree.
\r
55 private void scanTags() {
\r
56 // QDomElement element = doc.firstChildElement();
\r
57 // parseChildren(element.firstChild());
\r
58 if (doc.hasChildNodes())
\r
59 parseNodes(doc.childNodes());
\r
63 private void parseNodes(QDomNodeList nodes) {
\r
64 for (int i=0; i<nodes.size(); i++) {
\r
65 QDomNode node = nodes.at(i);
\r
66 if (node.hasChildNodes()) {
\r
67 parseNodes(node.childNodes());
\r
74 // Parse through individual nodes
\r
75 public void parseChildren(QDomNode node) {
\r
76 for(; !node.isNull(); node = node.nextSibling()) {
\r
77 if (node.hasChildNodes()) {
\r
78 QDomNodeList l = node.childNodes();
\r
79 for (int i=0; i<l.size(); i++)
\r
80 parseChildren(l.at(i));
\r
82 if (node.isText()) {
\r
88 // We found a text node, so we need to search for things to hilight
\r
89 private void scanWords(QDomNode node) {
\r
90 String value = node.nodeValue();
\r
91 QDomDocumentFragment fragment = doc.createDocumentFragment();
\r
92 boolean matchFound = false;
\r
93 int previousPosition = 0;
\r
94 String valueEnd = "";
\r
96 String regex = buildRegex();
\r
98 Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
\r
99 Matcher matcher = pattern.matcher(value);
\r
101 while (matcher.find()) {
\r
103 String valueStart = "";
\r
104 int start = matcher.start();
\r
105 int end = matcher.end();
\r
106 if (value.substring(start).startsWith(" "))
\r
108 if (value.substring(start, end).endsWith(" "))
\r
111 if (matcher.start() > 0) {
\r
112 valueStart = value.substring(previousPosition,start);
\r
114 String valueMiddle = value.substring(start, end);
\r
116 if (matcher.end() < value.length()) {
\r
117 valueEnd = value.substring(end);
\r
120 previousPosition = end;
\r
121 if (!valueStart.equals("")) {
\r
122 QDomText startText = doc.createTextNode(valueStart);
\r
123 fragment.appendChild(startText);
\r
126 QDomElement hilight = doc.createElement("en-hilight");
\r
127 hilight.appendChild(doc.createTextNode(valueMiddle));
\r
128 fragment.appendChild(hilight);
\r
131 if (previousPosition != value.length()) {
\r
132 QDomText endText = doc.createTextNode(valueEnd);
\r
133 fragment.appendChild(endText);
\r
135 newNodes.add(fragment);
\r
136 oldNodes.add(node);
\r
141 private String buildRegex() {
\r
142 StringBuffer regex = new StringBuffer();
\r
144 for (int i=0; i<terms.size(); i++) {
\r
145 String term = terms.get(i);
\r
146 if (term.indexOf("*") > -1) {
\r
147 term = term.replace("*", "");
\r
149 term = "\\b"+term+"\\b";
\r
151 regex.append(term);
\r
152 if (i<terms.size()-1)
\r
153 regex.append("|");
\r
156 return regex.toString();
\r