diff options
Diffstat (limited to 'bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup')
7 files changed, 0 insertions, 1121 deletions
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/AbstractNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/AbstractNodeCleanupHandler.java deleted file mode 100644 index 37ff30a16f..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/AbstractNodeCleanupHandler.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Preferences; -import org.eclipse.wst.html.core.internal.HTMLCorePlugin; -import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences; -import org.eclipse.wst.sse.core.internal.cleanup.StructuredCleanupPreferences; -import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; - -abstract class AbstractNodeCleanupHandler implements IStructuredCleanupHandler { - - protected IStructuredCleanupPreferences fCleanupPreferences = null; - protected IProgressMonitor fProgressMonitor = null; - - public void setCleanupPreferences(IStructuredCleanupPreferences cleanupPreferences) { - - fCleanupPreferences = cleanupPreferences; - } - - - public IStructuredCleanupPreferences getCleanupPreferences() { - if (fCleanupPreferences == null) { - fCleanupPreferences = new StructuredCleanupPreferences(); - - Preferences preferences = getModelPreferences(); - if (preferences != null) { - fCleanupPreferences.setTagNameCase(preferences.getInt(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE)); - fCleanupPreferences.setAttrNameCase(preferences.getInt(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE)); - fCleanupPreferences.setCompressEmptyElementTags(preferences.getBoolean(HTMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS)); - fCleanupPreferences.setInsertRequiredAttrs(preferences.getBoolean(HTMLCorePreferenceNames.INSERT_REQUIRED_ATTRS)); - fCleanupPreferences.setInsertMissingTags(preferences.getBoolean(HTMLCorePreferenceNames.INSERT_MISSING_TAGS)); - fCleanupPreferences.setQuoteAttrValues(preferences.getBoolean(HTMLCorePreferenceNames.QUOTE_ATTR_VALUES)); - fCleanupPreferences.setFormatSource(preferences.getBoolean(HTMLCorePreferenceNames.FORMAT_SOURCE)); - fCleanupPreferences.setConvertEOLCodes(preferences.getBoolean(HTMLCorePreferenceNames.CONVERT_EOL_CODES)); - fCleanupPreferences.setEOLCode(preferences.getString(HTMLCorePreferenceNames.CLEANUP_EOL_CODE)); - } - } - - return fCleanupPreferences; - } - - - public void setProgressMonitor(IProgressMonitor progressMonitor) { - - fProgressMonitor = progressMonitor; - } - - static protected StructuredDocumentEvent replaceSource(IDOMModel model, Object requester, int offset, int length, String source) { - - StructuredDocumentEvent result = null; - if (model == null) - return result; - IStructuredDocument structuredDocument = model.getStructuredDocument(); - if (structuredDocument == null) - return result; - if (source == null) - source = new String(); - if (structuredDocument.containsReadOnly(offset, length)) - return result; - if (requester == null) { - requester = structuredDocument; - } - return structuredDocument.replaceText(requester, offset, length, source); - } - - protected Preferences getModelPreferences() { - return HTMLCorePlugin.getDefault().getPluginPreferences(); - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java deleted file mode 100644 index ff8006ca84..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - - - -import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter; -import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter; -import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; -import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; -import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; -import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.w3c.dom.Node; - -// nakamori_TODO: check and remove - -public class CSSTextNodeCleanupHandler extends AbstractNodeCleanupHandler { - - public Node cleanup(Node node) { - if (node == null) - return node; - IDOMModel model = ((IDOMNode) node).getModel(); - if (model == null) - return node; - IStructuredDocument structuredDocument = model.getStructuredDocument(); - if (structuredDocument == null) - return node; - - String content = getCSSContent(node); - if (content == null) - return node; - - int offset = ((IDOMNode) node).getStartOffset(); - int length = ((IDOMNode) node).getEndOffset() - offset; - replaceSource(model, this, offset, length, content); - return (IDOMNode) model.getIndexedRegion(offset); - } - - /** - */ - private String getCSSContent(Node text) { - ICSSModel model = getCSSModel(text); - if (model == null) - return null; - ICSSNode document = model.getDocument(); - if (document == null) - return null; - INodeNotifier notifier = (INodeNotifier) document; - INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class); - if (adapter == null) - return null; - CSSSourceFormatter formatter = (CSSSourceFormatter) adapter; - StringBuffer buffer = formatter.cleanup(document); - if (buffer == null) - return null; - return buffer.toString(); - } - - /** - */ - private ICSSModel getCSSModel(Node text) { - if (text == null) - return null; - INodeNotifier notifier = (INodeNotifier) text.getParentNode(); - if (notifier == null) - return null; - INodeAdapter adapter = notifier.getAdapterFor(IStyleSheetAdapter.class); - if (adapter == null) - return null; - if (!(adapter instanceof IStyleSheetAdapter)) - return null; - IStyleSheetAdapter styleAdapter = (IStyleSheetAdapter) adapter; - return styleAdapter.getModel(); - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java deleted file mode 100644 index bd5b56f434..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java +++ /dev/null @@ -1,693 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - - - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.text.edits.InsertEdit; -import org.eclipse.text.edits.MultiTextEdit; -import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter; -import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter; -import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; -import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; -import org.eclipse.wst.html.core.internal.Logger; -import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; -import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter; -import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; -import org.eclipse.wst.sse.core.internal.util.StringUtils; -import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; -import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; -import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; -import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; -import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator; -import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - -// nakamori_TODO: check and remove CSS formatting - -public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler { - - /** Non-NLS strings */ - protected static final String START_TAG_OPEN = "<"; //$NON-NLS-1$ - protected static final String END_TAG_OPEN = "</"; //$NON-NLS-1$ - protected static final String TAG_CLOSE = ">"; //$NON-NLS-1$ - protected static final String EMPTY_TAG_CLOSE = "/>"; //$NON-NLS-1$ - protected static final String SINGLE_QUOTES = "''"; //$NON-NLS-1$ - protected static final String DOUBLE_QUOTES = "\"\""; //$NON-NLS-1$ - protected static final char SINGLE_QUOTE = '\''; //$NON-NLS-1$ - protected static final char DOUBLE_QUOTE = '\"'; //$NON-NLS-1$ - - public Node cleanup(Node node) { - IDOMNode renamedNode = (IDOMNode) cleanupChildren(node); - - // call quoteAttrValue() first so it will close any unclosed attr - // quoteAttrValue() will return the new start tag if there is a - // structure change - renamedNode = quoteAttrValue(renamedNode); - - // insert tag close if missing - // if node is not comment tag - // and not implicit tag - if (!((IDOMElement) renamedNode).isCommentTag() && (renamedNode.getStartStructuredDocumentRegion() != null)) { - IDOMModel structuredModel = renamedNode.getModel(); - - // save start offset before insertTagClose() - // or else renamedNode.getStartOffset() will be zero if - // renamedNode replaced by insertTagClose() - int startTagStartOffset = renamedNode.getStartOffset(); - - // for start tag - IStructuredDocumentRegion startTagStructuredDocumentRegion = renamedNode.getStartStructuredDocumentRegion(); - insertTagClose(structuredModel, startTagStructuredDocumentRegion); - - // update renamedNode and startTagStructuredDocumentRegion after - // insertTagClose() - renamedNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); - startTagStructuredDocumentRegion = renamedNode.getStartStructuredDocumentRegion(); - - // for end tag - IStructuredDocumentRegion endTagStructuredDocumentRegion = renamedNode.getEndStructuredDocumentRegion(); - if (endTagStructuredDocumentRegion != startTagStructuredDocumentRegion) - insertTagClose(structuredModel, endTagStructuredDocumentRegion); - } - - // call insertMissingTags() next, it will generate implicit tags if - // there are any - // insertMissingTags() will return the new missing start tag if one is - // missing - // applyTagNameCase() will return the renamed node. - // The renamed/new node will be saved and returned to caller when all - // cleanup is done. - renamedNode = insertMissingTags(renamedNode); - renamedNode = insertRequiredAttrs(renamedNode); - renamedNode = applyTagNameCase(renamedNode); - applyAttrNameCase(renamedNode); - cleanupCSSAttrValue(renamedNode); - - return renamedNode; - } - - /** - * Checks if cleanup should modify case. Returns true case should be - * preserved, false otherwise. - * - * @param element - * @return true if element is case sensitive, false otherwise - */ - private boolean shouldPreserveCase(IDOMElement element) { - // case option can be applied to no namespace tags - return !element.isGlobalTag(); - /* - * ModelQueryAdapter mqadapter = (ModelQueryAdapter) - * element.getAdapterFor(ModelQueryAdapter.class); ModelQuery mq = - * null; CMNode nodedecl = null; if (mqadapter != null) mq = - * mqadapter.getModelQuery(); if (mq != null) nodedecl = - * mq.getCMNode(node); // if a Node isn't recognized as HTML or is and - * cares about case, do not alter it // if (nodedecl == null || - * (nodedecl instanceof HTMLCMNode && ((HTMLCMNode) - * nodedecl).shouldIgnoreCase())) if (! - * nodedecl.supports(HTMLCMProperties.SHOULD_IGNORE_CASE)) return - * false; return - * ((Boolean)cmnode.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue(); - */ - } - - /** - * Checks if cleanup should force modifying element name to all lowercase. - * - * @param element - * @return true if cleanup should lowercase element name, false otherwise - */ - private boolean isXMLTag(IDOMElement element) { - return element.isXMLTag(); - } - - protected void applyAttrNameCase(IDOMNode node) { - IDOMElement element = (IDOMElement) node; - if (element.isCommentTag()) - return; // do nothing - - int attrNameCase = HTMLCorePreferenceNames.ASIS; - if (!shouldPreserveCase(element)) { - if (isXMLTag(element)) - attrNameCase = HTMLCorePreferenceNames.LOWER; - else - attrNameCase = getCleanupPreferences().getAttrNameCase(); - } - - NamedNodeMap attributes = node.getAttributes(); - int attributesLength = attributes.getLength(); - - for (int i = 0; i < attributesLength; i++) { - IDOMNode eachAttr = (IDOMNode) attributes.item(i); - String oldAttrName = eachAttr.getNodeName(); - String newAttrName = oldAttrName; - // 254961 - all HTML tag names and attribute names should be in - // English - // even for HTML files in other languages like Japanese or - // Turkish. - // English locale should be used to convert between uppercase and - // lowercase - // (otherwise "link" would be converted to "L�NK" in Turkish, - // where '?' in "L�NK" - // is the "I Overdot Capital" in Turkish). - if (attrNameCase == HTMLCorePreferenceNames.LOWER) - newAttrName = oldAttrName.toLowerCase(Locale.US); - else if (attrNameCase == HTMLCorePreferenceNames.UPPER) - newAttrName = oldAttrName.toUpperCase(Locale.US); - - if (newAttrName.compareTo(oldAttrName) != 0) { - int attrNameStartOffset = eachAttr.getStartOffset(); - int attrNameLength = oldAttrName.length(); - - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - replaceSource(structuredModel, structuredDocument, attrNameStartOffset, attrNameLength, newAttrName); - } - } - } - - protected IDOMNode applyTagNameCase(IDOMNode node) { - IDOMElement element = (IDOMElement) node; - if (element.isCommentTag()) - return node; // do nothing - - int tagNameCase = HTMLCorePreferenceNames.ASIS; - - if (!shouldPreserveCase(element)) { - if (isXMLTag(element)) - tagNameCase = HTMLCorePreferenceNames.LOWER; - else - tagNameCase = getCleanupPreferences().getTagNameCase(); - } - - String oldTagName = node.getNodeName(); - String newTagName = oldTagName; - IDOMNode newNode = node; - - // 254961 - all HTML tag names and attribute names should be in - // English - // even for HTML files in other languages like Japanese or Turkish. - // English locale should be used to convert between uppercase and - // lowercase - // (otherwise "link" would be converted to "L�NK" in Turkish, where - // '?' in "L�NK" - // is the "I Overdot Capital" in Turkish). - if (tagNameCase == HTMLCorePreferenceNames.LOWER) - newTagName = oldTagName.toLowerCase(Locale.US); - else if (tagNameCase == HTMLCorePreferenceNames.UPPER) - newTagName = oldTagName.toUpperCase(Locale.US); - - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - - IStructuredDocumentRegion startTagStructuredDocumentRegion = node.getStartStructuredDocumentRegion(); - if (startTagStructuredDocumentRegion != null) { - ITextRegionList regions = startTagStructuredDocumentRegion.getRegions(); - if (regions != null && regions.size() > 0) { - ITextRegion startTagNameRegion = regions.get(1); - int startTagNameStartOffset = startTagStructuredDocumentRegion.getStartOffset(startTagNameRegion); - int startTagNameLength = startTagStructuredDocumentRegion.getTextEndOffset(startTagNameRegion) - startTagNameStartOffset; - - replaceSource(structuredModel, structuredDocument, startTagNameStartOffset, startTagNameLength, newTagName); - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagNameStartOffset); // save - // new - // node - } - } - - IStructuredDocumentRegion endTagStructuredDocumentRegion = node.getEndStructuredDocumentRegion(); - if (endTagStructuredDocumentRegion != null) { - ITextRegionList regions = endTagStructuredDocumentRegion.getRegions(); - if (regions != null && regions.size() > 0) { - ITextRegion endTagNameRegion = regions.get(1); - int endTagNameStartOffset = endTagStructuredDocumentRegion.getStartOffset(endTagNameRegion); - int endTagNameLength = endTagStructuredDocumentRegion.getTextEndOffset(endTagNameRegion) - endTagNameStartOffset; - - if (startTagStructuredDocumentRegion != endTagStructuredDocumentRegion) - replaceSource(structuredModel, structuredDocument, endTagNameStartOffset, endTagNameLength, newTagName); - } - } - - return newNode; - } - - protected Node cleanupChildren(Node node) { - Node parentNode = node; - - if (node != null) { - Node childNode = node.getFirstChild(); - HTMLCleanupHandlerFactory factory = HTMLCleanupHandlerFactory.getInstance(); - while (childNode != null) { - // cleanup this child node - IStructuredCleanupHandler cleanupHandler = factory.createHandler(childNode, getCleanupPreferences()); - childNode = cleanupHandler.cleanup(childNode); - - // get new parent node - parentNode = childNode.getParentNode(); - - // get next child node - childNode = childNode.getNextSibling(); - } - } - - return parentNode; - } - - /** - */ - protected void cleanupCSSAttrValue(IDOMNode node) { - if (node == null || node.getNodeType() != Node.ELEMENT_NODE) - return; - IDOMElement element = (IDOMElement) node; - if (!element.isGlobalTag()) - return; - - Attr attr = element.getAttributeNode("style"); //$NON-NLS-1$ - if (attr == null) - return; - String value = getCSSValue(attr); - if (value == null) - return; - String oldValue = ((IDOMNode) attr).getValueSource(); - if (oldValue != null && value.equals(oldValue)) - return; - attr.setValue(value); - } - - /** - */ - private ICSSModel getCSSModel(Attr attr) { - if (attr == null) - return null; - INodeNotifier notifier = (INodeNotifier) attr.getOwnerElement(); - if (notifier == null) - return null; - INodeAdapter adapter = notifier.getAdapterFor(IStyleDeclarationAdapter.class); - if (adapter == null) - return null; - if (!(adapter instanceof IStyleDeclarationAdapter)) - return null; - IStyleDeclarationAdapter styleAdapter = (IStyleDeclarationAdapter) adapter; - return styleAdapter.getModel(); - } - - /** - */ - private String getCSSValue(Attr attr) { - ICSSModel model = getCSSModel(attr); - if (model == null) - return null; - ICSSNode document = model.getDocument(); - if (document == null) - return null; - INodeNotifier notifier = (INodeNotifier) document; - INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class); - if (adapter == null) - return null; - CSSSourceFormatter formatter = (CSSSourceFormatter) adapter; - StringBuffer buffer = formatter.cleanup(document); - if (buffer == null) - return null; - return buffer.toString(); - } - - private boolean isEmptyElement(IDOMElement element) { - Document document = element.getOwnerDocument(); - if (document == null) - // undefined tag, return default - return false; - - ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document); - if (modelQuery == null) - // undefined tag, return default - return false; - - CMElementDeclaration decl = modelQuery.getCMElementDeclaration(element); - if (decl == null) - // undefined tag, return default - return false; - - return (decl.getContentType() == CMElementDeclaration.EMPTY); - } - - protected IDOMNode insertEndTag(IDOMNode node) { - IDOMElement element = (IDOMElement) node; - - int startTagStartOffset = node.getStartOffset(); - IDOMModel structuredModel = node.getModel(); - IDOMNode newNode = null; - - if (element.isCommentTag()) { - // do nothing - } - else if (isEmptyElement(element)) { - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion(); - ITextRegionList regions = startStructuredDocumentRegion.getRegions(); - ITextRegion lastRegion = regions.get(regions.size() - 1); - replaceSource(structuredModel, structuredDocument, startStructuredDocumentRegion.getStartOffset(lastRegion), lastRegion.getLength(), EMPTY_TAG_CLOSE); - - if (regions.size() > 1) { - ITextRegion regionBeforeTagClose = regions.get(regions.size() - 1 - 1); - - // insert a space separator before tag close if the previous - // region does not have extra spaces - if (regionBeforeTagClose.getTextLength() == regionBeforeTagClose.getLength()) - replaceSource(structuredModel, structuredDocument, startStructuredDocumentRegion.getStartOffset(lastRegion), 0, " "); //$NON-NLS-1$ - } - } - else { - String tagName = node.getNodeName(); - String endTag = END_TAG_OPEN.concat(tagName).concat(TAG_CLOSE); - - IDOMNode lastChild = (IDOMNode) node.getLastChild(); - int endTagStartOffset = 0; - if (lastChild != null) - // if this node has children, insert the end tag after the - // last child - endTagStartOffset = lastChild.getEndOffset(); - else - // if this node does not has children, insert the end tag - // after the start tag - endTagStartOffset = node.getEndOffset(); - - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - replaceSource(structuredModel, structuredDocument, endTagStartOffset, 0, endTag); - } - - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); // save - // new - // node - - return newNode; - } - - protected IDOMNode insertMissingTags(IDOMNode node) { - boolean insertMissingTags = getCleanupPreferences().getInsertMissingTags(); - IDOMNode newNode = node; - - if (insertMissingTags) { - IStructuredDocumentRegion startTagStructuredDocumentRegion = node.getStartStructuredDocumentRegion(); - if (startTagStructuredDocumentRegion == null) { - // implicit start tag; generate tag for it - newNode = insertStartTag(node); - startTagStructuredDocumentRegion = newNode.getStartStructuredDocumentRegion(); - } - - IStructuredDocumentRegion endTagStructuredDocumentRegion = newNode.getEndStructuredDocumentRegion(); - - ITextRegionList regionList = startTagStructuredDocumentRegion.getRegions(); - if (startTagStructuredDocumentRegion != null && regionList != null && regionList.get(regionList.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { - - } - else { - if (startTagStructuredDocumentRegion == null) { - // start tag missing - if (isStartTagRequired(newNode)) - newNode = insertStartTag(newNode); - } - else if (endTagStructuredDocumentRegion == null) { - // end tag missing - if (isEndTagRequired(newNode)) - newNode = insertEndTag(newNode); - } - } - } - - return newNode; - } - - protected IDOMNode insertStartTag(IDOMNode node) { - IDOMElement element = (IDOMElement) node; - if (element.isCommentTag()) - return node; // do nothing - - IDOMNode newNode = null; - - String tagName = node.getNodeName(); - String startTag = START_TAG_OPEN.concat(tagName).concat(TAG_CLOSE); - int startTagStartOffset = node.getStartOffset(); - - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - replaceSource(structuredModel, structuredDocument, startTagStartOffset, 0, startTag); - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); // save - // new - // node - - return newNode; - } - - protected void insertTagClose(IDOMModel structuredModel, IStructuredDocumentRegion flatNode) { - if ((flatNode != null) && (flatNode.getRegions() != null)) { - ITextRegionList regionList = flatNode.getRegions(); - ITextRegion lastRegion = regionList.get(regionList.size() - 1); - if (lastRegion != null) { - String regionType = lastRegion.getType(); - if ((regionType != DOMRegionContext.XML_EMPTY_TAG_CLOSE) && (regionType != DOMRegionContext.XML_TAG_CLOSE)) { - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - - // insert ">" after lastRegion of flatNode - // as in "<a</a>" if flatNode is for start tag, or in - // "<a></a" if flatNode is for end tag - replaceSource(structuredModel, structuredDocument, flatNode.getTextEndOffset(lastRegion), 0, ">"); //$NON-NLS-1$ - } - } - } - } - - protected boolean isEndTagRequired(IDOMNode node) { - if (node == null) - return false; - return node.isContainer(); - } - - /** - * The end tags of HTML EMPTY content type, such as IMG, and HTML - * undefined tags are parsed separately from the start tags. So inserting - * the missing start tag is useless and even harmful. - */ - protected boolean isStartTagRequired(IDOMNode node) { - if (node == null) - return false; - return node.isContainer(); - } - - protected boolean isXMLType(IDOMModel structuredModel) { - boolean result = false; - - if (structuredModel != null && structuredModel != null) { - IDOMDocument document = structuredModel.getDocument(); - - if (document != null) - result = document.isXMLType(); - } - - return result; - } - - protected IDOMNode quoteAttrValue(IDOMNode node) { - IDOMElement element = (IDOMElement) node; - if (element.isCommentTag()) - return node; // do nothing - - boolean quoteAttrValues = getCleanupPreferences().getQuoteAttrValues(); - IDOMNode newNode = node; - - if (quoteAttrValues) { - NamedNodeMap attributes = newNode.getAttributes(); - int attributesLength = attributes.getLength(); - ISourceGenerator generator = node.getModel().getGenerator(); - - for (int i = 0; i < attributesLength; i++) { - attributes = newNode.getAttributes(); - attributesLength = attributes.getLength(); - IDOMAttr eachAttr = (IDOMAttr) attributes.item(i); - // ITextRegion oldAttrValueRegion = eachAttr.getValueRegion(); - String oldAttrValue = eachAttr.getValueRegionText(); - if (oldAttrValue == null) { - IDOMModel structuredModel = node.getModel(); - if (isXMLType(structuredModel)) { - // TODO: Kit, please check. Is there any way to not - // rely on getting regions from attributes? - String newAttrValue = "=\"" + eachAttr.getNameRegionText() + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - replaceSource(structuredModel, structuredDocument, eachAttr.getNameRegionEndOffset(), 0, newAttrValue); - newNode = (IDOMNode) structuredModel.getIndexedRegion(node.getStartOffset()); // save - // new - // node - } - } - else { - - char quote = StringUtils.isQuoted(oldAttrValue) ? oldAttrValue.charAt(0) : DOUBLE_QUOTE; - String newAttrValue = generator.generateAttrValue(eachAttr, quote); - - // There is a problem in - // StructuredDocumentRegionUtil.getAttrValue(ITextRegion) - // when the region is instanceof ContextRegion. - // Workaround for now... - if (oldAttrValue.length() == 1) { - char firstChar = oldAttrValue.charAt(0); - if (firstChar == SINGLE_QUOTE) - newAttrValue = SINGLE_QUOTES; - else if (firstChar == DOUBLE_QUOTE) - newAttrValue = DOUBLE_QUOTES; - } - - if (newAttrValue != null) { - if (newAttrValue.compareTo(oldAttrValue) != 0) { - int attrValueStartOffset = eachAttr.getValueRegionStartOffset(); - int attrValueLength = oldAttrValue.length(); - int startTagStartOffset = node.getStartOffset(); - - IDOMModel structuredModel = node.getModel(); - IStructuredDocument structuredDocument = structuredModel.getStructuredDocument(); - replaceSource(structuredModel, structuredDocument, attrValueStartOffset, attrValueLength, newAttrValue); - newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); // save - // new - // node - } - } - } - } - } - - return newNode; - } - - private IDOMNode insertRequiredAttrs(IDOMNode node) { - boolean insertRequiredAttrs = getCleanupPreferences().getInsertRequiredAttrs(); - IDOMNode newNode = node; - - if (insertRequiredAttrs) { - List requiredAttrs = getRequiredAttrs(newNode); - if (requiredAttrs.size() > 0) { - NamedNodeMap currentAttrs = node.getAttributes(); - List insertAttrs = new ArrayList(); - if (currentAttrs.getLength() == 0) - insertAttrs.addAll(requiredAttrs); - else { - for (int i = 0; i < requiredAttrs.size(); i++) { - String requiredAttrName = ((CMAttributeDeclaration) requiredAttrs.get(i)).getAttrName(); - boolean found = false; - for (int j = 0; j < currentAttrs.getLength(); j++) { - String currentAttrName = currentAttrs.item(j).getNodeName(); - if (requiredAttrName.compareToIgnoreCase(currentAttrName) == 0) { - found = true; - break; - } - } - if (!found) - insertAttrs.add(requiredAttrs.get(i)); - } - } - if (insertAttrs.size() > 0) { - IStructuredDocumentRegion startStructuredDocumentRegion = newNode.getStartStructuredDocumentRegion(); - int index = startStructuredDocumentRegion.getEndOffset(); - ITextRegion lastRegion = startStructuredDocumentRegion.getLastRegion(); - if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) { - index--; - lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1); - } - else if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) { - index = index - 2; - lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1); - } - MultiTextEdit multiTextEdit = new MultiTextEdit(); - try { - for (int i = insertAttrs.size() - 1; i >= 0; i--) { - CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) insertAttrs.get(i); - String requiredAttributeName = attrDecl.getAttrName(); - String defaultValue = attrDecl.getDefaultValue(); - if (defaultValue == null) - defaultValue = ""; //$NON-NLS-1$ - String nameAndDefaultValue = " "; //$NON-NLS-1$ - if (i == 0 && lastRegion.getLength() > lastRegion.getTextLength()) - nameAndDefaultValue = ""; //$NON-NLS-1$ - nameAndDefaultValue += requiredAttributeName + "=\"" + defaultValue + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - multiTextEdit.addChild(new InsertEdit(index, nameAndDefaultValue)); - // BUG3381: MultiTextEdit applies all child - // TextEdit's basing on offsets - // in the document before the first TextEdit, not - // after each - // child TextEdit. Therefore, do not need to - // advance the index. - // index += nameAndDefaultValue.length(); - } - multiTextEdit.apply(newNode.getStructuredDocument()); - } - catch (BadLocationException e) { - // log or now, unless we find reason not to - Logger.log(Logger.INFO, e.getMessage()); - } - } - } - } - - return newNode; - } - - - protected ModelQuery getModelQuery(Node node) { - if (node.getNodeType() == Node.DOCUMENT_NODE) { - return ModelQueryUtil.getModelQuery((Document) node); - } - else { - return ModelQueryUtil.getModelQuery(node.getOwnerDocument()); - } - } - - protected List getRequiredAttrs(Node node) { - List result = new ArrayList(); - - ModelQuery modelQuery = getModelQuery(node); - if (modelQuery != null) { - CMElementDeclaration elementDecl = modelQuery.getCMElementDeclaration((Element) node); - if (elementDecl != null) { - CMNamedNodeMap attrMap = elementDecl.getAttributes(); - Iterator it = attrMap.iterator(); - CMAttributeDeclaration attr = null; - while (it.hasNext()) { - attr = (CMAttributeDeclaration) it.next(); - if (attr.getUsage() == CMAttributeDeclaration.REQUIRED) { - result.add(attr); - } - } - } - } - - return result; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java deleted file mode 100644 index 21ea68fc3a..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java +++ /dev/null @@ -1,147 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - - - -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; -import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; -import org.w3c.dom.Node; - -// nakamori_TODO: check and remove CSS formatting - -class HTMLCleanupHandlerFactory { - - - - private static HTMLCleanupHandlerFactory fInstance = null; - - static synchronized HTMLCleanupHandlerFactory getInstance() { - if (fInstance == null) { - fInstance = new HTMLCleanupHandlerFactory(); - } - return fInstance; - } - - private HTMLCleanupHandlerFactory() { - super(); - } - - IStructuredCleanupHandler createHandler(Node node, IStructuredCleanupPreferences cleanupPreferences) { - short nodeType = node.getNodeType(); - IStructuredCleanupHandler handler = null; - switch (nodeType) { - case Node.ELEMENT_NODE : { - if (isJSPTag(node)) - handler = new JSPElementNodeCleanupHandler(); - else - handler = new ElementNodeCleanupHandler(); - break; - } - case Node.TEXT_NODE : { - if (isParentStyleTag(node)) - handler = new CSSTextNodeCleanupHandler(); - else - handler = new NodeCleanupHandler(); - break; - } - default : { - handler = new NodeCleanupHandler(); - } - } - - handler.setCleanupPreferences(cleanupPreferences); - - return handler; - } - - /** - * ISSUE: this is a bit of hidden JSP knowledge that was implemented this - * way for expedency. Should be evolved in future to depend on "nestedContext". - */ - - private boolean isJSPTag(Node node) { - - final String JSP_CLOSE = "JSP_CLOSE"; //$NON-NLS-1$ - // final String JSP_COMMENT_CLOSE = "JSP_COMMENT_CLOSE"; //$NON-NLS-1$ - - // final String JSP_COMMENT_OPEN = "JSP_COMMENT_OPEN"; //$NON-NLS-1$ - // final String JSP_COMMENT_TEXT = "JSP_COMMENT_TEXT"; //$NON-NLS-1$ - - final String JSP_CONTENT = "JSP_CONTENT"; //$NON-NLS-1$ - final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$ - final String JSP_DIRECTIVE_CLOSE = "JSP_DIRECTIVE_CLOSE"; //$NON-NLS-1$ - final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$ - - final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$ - final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$ - - // final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$ - - final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$ - - boolean result = false; - - if (node instanceof IDOMNode) { - IStructuredDocumentRegion flatNode = ((IDOMNode) node).getFirstStructuredDocumentRegion(); - // in some cases, the nodes exists, but hasn't been associated - // with - // a flatnode yet (the screen updates can be initiated on a - // different thread, - // so the request for a flatnode can come in before the node is - // fully formed. - // if the flatnode is null, we'll just allow the defaults to - // apply. - if (flatNode != null) { - String flatNodeType = flatNode.getType(); - // should not be null, but just to be sure - if (flatNodeType != null) { - if ((flatNodeType.equals(JSP_CONTENT)) || (flatNodeType.equals(JSP_EXPRESSION_OPEN)) || (flatNodeType.equals(JSP_SCRIPTLET_OPEN)) || (flatNodeType.equals(JSP_DECLARATION_OPEN)) || (flatNodeType.equals(JSP_DIRECTIVE_CLOSE)) || (flatNodeType.equals(JSP_DIRECTIVE_NAME)) || (flatNodeType.equals(JSP_DIRECTIVE_OPEN)) || (flatNodeType.equals(JSP_CLOSE))) { - result = true; - } - } - } - } - - return result; - } - - private boolean isParentStyleTag(Node node) { - if (node == null) - return false; - if (node.getNodeType() != Node.TEXT_NODE) - return false; - if (!(node instanceof IDOMNode)) - return false; - IStructuredDocumentRegion flatNode = ((IDOMNode) node).getFirstStructuredDocumentRegion(); - if (flatNode == null) - return false; - if (flatNode.getType() != DOMRegionContext.BLOCK_TEXT) - return false; - - // check if the parent is STYLE element - Node parent = node.getParentNode(); - if (parent == null) - return false; - if (parent.getNodeType() != Node.ELEMENT_NODE) - return false; - String name = parent.getNodeName(); - if (name == null) - return false; - if (!name.equalsIgnoreCase("STYLE"))//$NON-NLS-1$ - return false; - return true; - } - -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java deleted file mode 100644 index 5b765c4f54..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - -import org.eclipse.core.runtime.Preferences; -import org.eclipse.wst.html.core.internal.HTMLCorePlugin; -import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl; -import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames; -import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML; -import org.eclipse.wst.sse.core.internal.cleanup.AbstractStructuredCleanupProcessor; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler; -import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences; -import org.eclipse.wst.sse.core.internal.cleanup.StructuredCleanupPreferences; -import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor; -import org.w3c.dom.Node; - -public class HTMLCleanupProcessorImpl extends AbstractStructuredCleanupProcessor { - private IStructuredCleanupPreferences fCleanupPreferences = null; - - protected String getContentType() { - return ContentTypeIdForHTML.ContentTypeID_HTML; - } - - protected IStructuredCleanupHandler getCleanupHandler(Node node) { - return HTMLCleanupHandlerFactory.getInstance().createHandler(node, getCleanupPreferences()); - } - - public IStructuredCleanupPreferences getCleanupPreferences() { - if (fCleanupPreferences == null) { - fCleanupPreferences = new StructuredCleanupPreferences(); - - Preferences preferences = getModelPreferences(); - if (preferences != null) { - fCleanupPreferences.setTagNameCase(preferences.getInt(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE)); - fCleanupPreferences.setAttrNameCase(preferences.getInt(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE)); - fCleanupPreferences.setCompressEmptyElementTags(preferences.getBoolean(HTMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS)); - fCleanupPreferences.setInsertRequiredAttrs(preferences.getBoolean(HTMLCorePreferenceNames.INSERT_REQUIRED_ATTRS)); - fCleanupPreferences.setInsertMissingTags(preferences.getBoolean(HTMLCorePreferenceNames.INSERT_MISSING_TAGS)); - fCleanupPreferences.setQuoteAttrValues(preferences.getBoolean(HTMLCorePreferenceNames.QUOTE_ATTR_VALUES)); - fCleanupPreferences.setFormatSource(preferences.getBoolean(HTMLCorePreferenceNames.FORMAT_SOURCE)); - fCleanupPreferences.setConvertEOLCodes(preferences.getBoolean(HTMLCorePreferenceNames.CONVERT_EOL_CODES)); - fCleanupPreferences.setEOLCode(preferences.getString(HTMLCorePreferenceNames.CLEANUP_EOL_CODE)); - } - } - - return fCleanupPreferences; - } - - protected IStructuredFormatProcessor getFormatProcessor() { - return new HTMLFormatProcessorImpl(); - } - - protected Preferences getModelPreferences() { - return HTMLCorePlugin.getDefault().getPluginPreferences(); - } - - protected void refreshCleanupPreferences() { - fCleanupPreferences = null; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/JSPElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/JSPElementNodeCleanupHandler.java deleted file mode 100644 index 4b0a78381d..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/JSPElementNodeCleanupHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - - - -import org.w3c.dom.Node; - -public class JSPElementNodeCleanupHandler extends AbstractNodeCleanupHandler { - - public Node cleanup(Node node) { - return node; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/NodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/NodeCleanupHandler.java deleted file mode 100644 index 9bb6109690..0000000000 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/NodeCleanupHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 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 API and implementation - *******************************************************************************/ -package org.eclipse.wst.html.core.internal.cleanup; - - - -import org.w3c.dom.Node; - -public class NodeCleanupHandler extends AbstractNodeCleanupHandler { - - public Node cleanup(Node node) { - return node; - } -}
\ No newline at end of file |