| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 IBM Corporation and others. |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // Contributors: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.publishing.services.index; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.epf.library.util.ResourceHelper; |
| |
| |
| class KeyWordStatic { |
| |
| // note: pattern with [^>] does not match when there are non-english |
| // characters, maybe it's a jre bug? |
| static final Pattern p_index_ref = Pattern.compile( |
| "<a\\s+?(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ |
| // "<a\\s+?([^>]*?(name\\s*=\\s*\"XE_|class\\s*=\\s*\"index).*?)>", |
| // Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ |
| |
| /** |
| * get the key words with key and text description. There are two types of |
| * index format: 1. old format: <a name="KEY__TEXT" ...> 2. new format: <a |
| * class="index" name="bookmark" key="KEY" text="TEXT" ...> TEXT part is |
| * optional |
| */ |
| static List getKeyWords(String realString) { |
| if (realString == null) { |
| System.err |
| .println("KeyWordStatic:getKeyWords\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$ |
| return null; |
| } |
| |
| List anchors = new ArrayList(2); //$NON-NLS-1$ |
| |
| Matcher m = p_index_ref.matcher(realString); |
| while (m.find()) { |
| String attributes = m.group(1); |
| if (attributes.length() == 0) { |
| continue; |
| } |
| |
| Map attrMap = ResourceHelper.getTagAttributes(attributes); |
| String keyWord = (String) attrMap.get(ResourceHelper.TAG_ATTR_NAME); |
| if (keyWord == null || keyWord.length() == 0) { |
| continue; |
| } |
| |
| String cls = (String) attrMap.get(ResourceHelper.TAG_ATTR_CLASS); |
| String key = null; |
| String text = null; |
| if ((cls != null) |
| && cls.equals(ResourceHelper.TAG_ATTR_VALUE_INDEX)) { |
| key = (String) attrMap.get(ResourceHelper.TAG_ATTR_KEY); |
| text = (String) attrMap.get(ResourceHelper.TAG_ATTR_TEXT); |
| } |
| // The getKeyWordPrefix() returns the tag which is used to delimit |
| // keywords. |
| // Currently this tag is XE and is defined in keywordconfig.txt |
| if ((key != null) |
| || keyWord.startsWith(KeyWordIndexHelper.defObj |
| .getKeyWordPrefix())) { |
| anchors.add(new KeyWordDef(keyWord, key, text)); |
| } |
| } |
| return anchors; |
| |
| } |
| |
| static String convertKeyWord(String keyWord) { |
| return convertKeyWord(keyWord, null, null); |
| } |
| |
| static String convertKeyWord(String keyWord, String key, String text) { |
| |
| if (keyWord == null) { |
| System.err |
| .println("KeyWordStatic:convertKeyWord\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$ |
| return null; |
| } |
| IO.printDebug("convertKeyWord " + keyWord); // Error if we get a keyword //$NON-NLS-1$ |
| // that does not contain the |
| // tag. //$NON-NLS-1$ |
| if ((key != null) && (key.length() > 0)) { |
| if (text == null || text.length() == 0) { |
| return key; |
| } else { |
| return key + KeyWordIndexHelper.defObj.levelSeparatorReplace |
| + text; |
| } |
| } |
| |
| if (!keyWord.startsWith(KeyWordIndexHelper.defObj.getKeyWordPrefix())) { |
| System.out |
| .println("KeyWordStatic:convertKeyWord\n" + keyWord + HelpMessages.KEYWORD_SYNTAX_ERROR + KeyWordIndexHelper.defObj.getKeyWordPrefix()); //$NON-NLS-1$ |
| return null; |
| } |
| |
| // Remove the first three characters from the keyWord (namely XE_). |
| String tmpK = keyWord.substring(3); |
| String tmp = ""; //$NON-NLS-1$ |
| int i = 0; |
| int pos = 0; |
| while (i != -1) { |
| // getKeyWordLevelSeparator() is hard-coded as __ |
| i = tmpK.indexOf(KeyWordIndexHelper.defObj |
| .getKeyWordLevelSeparator(), pos); |
| if (i != -1) { |
| // Insert a separator between keywords, which in this case is |
| // the ":" |
| tmp += tmpK.substring(pos, i); |
| tmp += KeyWordIndexHelper.defObj.levelSeparatorReplace; |
| pos = i + 2; |
| } else { |
| tmp += tmpK.substring(pos); |
| } |
| } |
| return tmp.replace('_', ' '); |
| } |
| |
| } |