diff options
Diffstat (limited to 'bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslator.java')
-rw-r--r-- | bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslator.java | 787 |
1 files changed, 0 insertions, 787 deletions
diff --git a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslator.java b/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslator.java deleted file mode 100644 index 24672ddbad..0000000000 --- a/bundles/org.eclipse.wst.jsdt.web.core/src/org/eclipse/wst/jsdt/web/core/javascript/JsTranslator.java +++ /dev/null @@ -1,787 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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 - * - * Provisional API: This class/interface is part of an interim API that is still under development and expected to - * change significantly before reaching stability. It is being made available at this early stage to solicit feedback - * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken - * (repeatedly) as the API evolves. - * - *******************************************************************************/ - - -package org.eclipse.wst.jsdt.web.core.javascript; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.DocumentRewriteSessionEvent; -import org.eclipse.jface.text.IDocumentExtension4; -import org.eclipse.jface.text.IDocumentListener; -import org.eclipse.jface.text.IDocumentRewriteSessionListener; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.wst.jsdt.core.IBuffer; -import org.eclipse.wst.jsdt.web.core.internal.Logger; -import org.eclipse.wst.sse.core.StructuredModelManager; -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.ITextRegionCollection; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer; -import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; -import org.eclipse.wst.sse.core.utils.StringUtils; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; -import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; -/** -* - -* Provisional API: This class/interface is part of an interim API that is still under development and expected to -* change significantly before reaching stability. It is being made available at this early stage to solicit feedback -* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken -* (repeatedly) as the API evolves. - - * Translates a web page into its JavaScript pieces. - * - */ -public class JsTranslator extends Job implements IJsTranslator, IDocumentListener { - - protected static final boolean DEBUG; - private static final boolean DEBUG_SAVE_OUTPUT = false; //"true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.jsdt.web.core/debug/jstranslationstodisk")); //$NON-NLS-1$ //$NON-NLS-2$ -// private static final String ENDL = "\n"; //$NON-NLS-1$ - - private static final String XML_COMMENT_START = "<!--"; //$NON-NLS-1$ -// private static final String XML_COMMENT_END = "-->"; //$NON-NLS-1$ - - private static final String CDATA_START = "<![CDATA["; //$NON-NLS-1$ - private static final String CDATA_START_PAD = new String(Util.getPad(CDATA_START.length())); - private static final String CDATA_END = "]]>"; //$NON-NLS-1$ - private static final String CDATA_END_PAD = new String(Util.getPad(CDATA_END.length())); - - - //TODO: should be an inclusive rule rather than exclusive - private static final Pattern fClientSideTagPattern = Pattern.compile("<[^<%?)!>]+/?>"); //$NON-NLS-1$ - - // FIXME: Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=307401 - private String[][] fServerSideDelimiters = new String[][]{{"<%","%>"},{"<?","?>"}}; - private int fShortestServerSideDelimiterPairLength = 4; - - static { - String value = Platform.getDebugOption("org.eclipse.wst.jsdt.web.core/debug/jsjavamapping"); //$NON-NLS-1$ - DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ - } - - private class DocumentRewriteSessionListener implements IDocumentRewriteSessionListener { - public void documentRewriteSessionChanged(DocumentRewriteSessionEvent event) { - if (DocumentRewriteSessionEvent.SESSION_START.equals(event.getChangeType())) { - fIsInRewriteSession = true; - } - else if (DocumentRewriteSessionEvent.SESSION_STOP.equals(event.getChangeType())) { - fIsInRewriteSession = false; - schedule(); - } - } - } - - private IStructuredDocumentRegion fCurrentNode; - boolean fIsInRewriteSession = false; - protected StringBuffer fScriptText = new StringBuffer(); - protected IStructuredDocument fStructuredDocument = null; - protected ArrayList importLocationsInHtml = new ArrayList(); - /* use java script by default */ - protected boolean fIsGlobalJs = true; - protected ArrayList rawImports = new ArrayList(); // translated - protected ArrayList scriptLocationInHtml = new ArrayList(); - protected int scriptOffset = 0; - - protected byte[] fLock = new byte[0]; - protected byte[] finished = new byte[0]; - - protected IBuffer fCompUnitBuff; - protected boolean cancelParse = false; - protected int missingEndTagRegionStart = -1; - protected static final boolean ADD_SEMICOLON_AT_INLINE=true; - private IDocumentRewriteSessionListener fDocumentRewriteSessionListener = new DocumentRewriteSessionListener(); - - /* - * org.eclipse.jface.text.Regions that contain purely generated code, for - * which no validation messages should be reported to the user - */ - private List fGeneratedRanges = new ArrayList(); - - protected boolean isGlobalJs() { - return fIsGlobalJs; - } - - protected IBuffer getCompUnitBuffer() { - return fCompUnitBuff; - } - - protected StringBuffer getScriptTextBuffer() { - return fScriptText; - } - - - protected void setIsGlobalJs(boolean value) { - this.fIsGlobalJs = value; - } - - protected void advanceNextNode() { - setCurrentNode(getCurrentNode().getNext()); - } - - public JsTranslator(IStructuredDocument document, String fileName) { - this(document, fileName, false); - } - - /** - * @deprecated - */ - public JsTranslator() { - super("JavaScript Translation"); - } - - public JsTranslator(IStructuredDocument document, String fileName, boolean listenForChanges) { - super("JavaScript translation for : " + fileName); //$NON-NLS-1$ - fStructuredDocument = document; - if (listenForChanges) { - fStructuredDocument.addDocumentListener(this); - if (fStructuredDocument instanceof IDocumentExtension4) { - ((IDocumentExtension4) fStructuredDocument).addDocumentRewriteSessionListener(fDocumentRewriteSessionListener); - } - setPriority(Job.LONG); - setSystem(true); - schedule(); - } - reset(); - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getJsText() - */ - public String getJsText() { - synchronized(finished) { - /* if mid re-write session doc changes have been ignored, - * but if jsText is specifically request we should re-translate - * to pick up any changes thus far - */ - if(this.fIsInRewriteSession) { - this.reset(); - } - - return fScriptText.toString(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getCurrentNode() - */ - protected final IStructuredDocumentRegion getCurrentNode() { - - return fCurrentNode; - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#setBuffer(org.eclipse.wst.jsdt.core.IBuffer) - */ - public void setBuffer(IBuffer buffer) { - fCompUnitBuff = buffer; - synchronized(finished) { - fCompUnitBuff.setContents(fScriptText.toString()); - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getHtmlLocations() - */ - public Position[] getHtmlLocations() { - synchronized(finished) { - return (Position[]) scriptLocationInHtml.toArray(new Position[scriptLocationInHtml.size()]); - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getMissingEndTagRegionStart() - */ - public int getMissingEndTagRegionStart() { - return missingEndTagRegionStart; - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getImportHtmlRanges() - */ - public Position[] getImportHtmlRanges() { - synchronized(finished) { - return (Position[]) importLocationsInHtml.toArray(new Position[importLocationsInHtml.size()]); - } - } - - - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#getRawImports() - */ - public String[] getRawImports() { - synchronized(finished) { - return (String[]) this.rawImports.toArray(new String[rawImports.size()]); - } - } - - - - /** - * - * @return the status of the translator's progrss monitor, false if the - * monitor is null - */ - protected boolean isCanceled() { - return cancelParse; - } - - /** - * Reinitialize some fields - */ - protected void reset() { - synchronized(fLock) { - scriptOffset = 0; - // reset progress monitor - fScriptText = new StringBuffer(); - fCurrentNode = fStructuredDocument.getFirstStructuredDocumentRegion(); - rawImports.clear(); - importLocationsInHtml.clear(); - scriptLocationInHtml.clear(); - missingEndTagRegionStart = -1; - cancelParse = false; - fGeneratedRanges.clear(); - } - translate(); - } - - - - protected IStructuredDocumentRegion setCurrentNode(IStructuredDocumentRegion currentNode) { - synchronized(fLock) { - return this.fCurrentNode = currentNode; - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#translate() - */ - public void translate() { - //setCurrentNode(fStructuredDocument.getFirstStructuredDocumentRegion()); - - synchronized(finished) { - if(getCurrentNode() != null) { - NodeHelper nh = new NodeHelper(getCurrentNode()); - while (getCurrentNode() != null && !isCanceled()) { - nh.setDocumentRegion(getCurrentNode()); - - // System.out.println("Translator Looking at Node - // type:"+getCurrentNode().getType()+"---------------------------------:"); - // System.out.println(new NodeHelper(getCurrentNode())); - // i.println("/---------------------------------------------------"); - if (getCurrentNode().getType() == DOMRegionContext.XML_TAG_NAME) { - if ((!nh.isEndTag() || nh.isSelfClosingTag()) && nh.nameEquals("script")) { //$NON-NLS-1$ - /* - * Handles the following cases: <script - * type="javascriptype"> <script language="javascriptype> - * <script src='' type=javascriptype> <script src='' - * language=javascripttype <script src=''> global js type. - * <script> (global js type) - */ - if (NodeHelper.isInArray(JsDataTypes.JSVALIDDATATYPES, nh.getAttributeValue("type")) || NodeHelper.isInArray(JsDataTypes.JSVALIDDATATYPES, nh.getAttributeValue("language")) || (nh.getAttributeValue("type")==null && nh.getAttributeValue("language")==null && isGlobalJs())) { //$NON-NLS-1$ //$NON-NLS-2$ - if (nh.containsAttribute(new String[] { "src" })) { //$NON-NLS-1$ - // Handle import - translateScriptImportNode(getCurrentNode()); - } - // } else { - // handle script section - - if (getCurrentNode().getNext() != null /*&& getCurrentNode().getNext().getType() == DOMRegionContext.BLOCK_TEXT*/) { - translateJSNode(getCurrentNode().getNext()); - } - } // End search for <script> sections - } else if (nh.containsAttribute(JsDataTypes.HTMLATREVENTS)) { - /* Check for embedded JS events in any tags */ - translateInlineJSNode(getCurrentNode()); - } else if (nh.nameEquals("META") && nh.attrEquals("http-equiv", "Content-Script-Type") && nh.containsAttribute(new String[] { "content" })) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - // <META http-equiv="Content-Script-Type" content="type"> - setIsGlobalJs( NodeHelper.isInArray(JsDataTypes.JSVALIDDATATYPES, nh.getAttributeValue("content"))); //$NON-NLS-1$ - } // End big if of JS types - } - if (getCurrentNode() != null) { - advanceNextNode(); - } - } // end while loop - if(getCompUnitBuffer()!=null) getCompUnitBuffer().setContents(fScriptText.toString()); - } - finishedTranslation(); - } - } - - protected void finishedTranslation() { - if(DEBUG_SAVE_OUTPUT){ - IDOMModel xmlModel = null; - String baseLocation = null; - FileOutputStream fout = null; - PrintStream out = null; - try { - xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getExistingModelForRead(fStructuredDocument); - if (xmlModel == null) { - xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(fStructuredDocument); - } - baseLocation = xmlModel.getBaseLocation(); - } - finally { - if (xmlModel != null) - xmlModel.releaseFromRead(); - } - - if(baseLocation!=null){ - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IWorkspaceRoot root = workspace.getRoot(); - IFile tFile = workspace.getRoot().getFile(new Path(baseLocation + ".js")); - File tempFile = tFile.getLocation().toFile(); - - if(tempFile.exists()){ - tempFile.delete(); - } - - try { - tempFile.createNewFile(); - fout = new FileOutputStream(tempFile); - out = new PrintStream(fout); - out.println(fScriptText); - out.close(); - } catch (FileNotFoundException e) { - - } catch (IOException e) { - - }finally{ - if(out!=null) out.close(); - - - } - try { - root.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); - } catch (CoreException e) { - - } - } - - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#translateInlineJSNode(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion) - */ - public void translateInlineJSNode(IStructuredDocumentRegion container) { - // System.out - // .println("JSPTranslator.translateInlineJSNode Entered - // w/ScriptOffset:" - // + scriptOffset); - - //NodeHelper nh = new NodeHelper(container); - // System.out.println("inline js node looking at:\n" + nh); - /* start a function header.. will amend later */ - ITextRegionList t = container.getRegions(); - ITextRegion r; - Iterator regionIterator = t.iterator(); - while (regionIterator.hasNext() && !isCanceled() ) { - r = (ITextRegion) regionIterator.next(); - if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) { - int start = r.getStart(); - int offset = r.getTextEnd(); - String tagAttrname = container.getText().substring(start, offset).trim(); - /* - * Attribute values aren't case sensative, also make sure next - * region is attrib value - */ - if (NodeHelper.isInArray(JsDataTypes.HTMLATREVENTS, tagAttrname)) { - if (regionIterator.hasNext()) { - regionIterator.next(); - } - if (regionIterator.hasNext()) { - r = ((ITextRegion) regionIterator.next()); - } - if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) { - int valStartOffset = container.getStartOffset(r); - // int valEndOffset = r.getTextEnd(); - String rawText = container.getText().substring(r.getStart(), r.getTextEnd()); - if (rawText == null || rawText.length() == 0) { - return; - } - /* Strip quotes */ - switch (rawText.charAt(0)) { - case '\'': - case '"': - rawText = rawText.substring(1); - valStartOffset++; - } - if (rawText == null || rawText.length() == 0) { - return; - } - switch (rawText.charAt(rawText.length() - 1)) { - case '\'': - case '"': - rawText = rawText.substring(0, rawText.length() - 1); - } - // Position inScript = new Position(scriptOffset, - // rawText.length()); - /* Quoted text starts +1 and ends -1 char */ - if(ADD_SEMICOLON_AT_INLINE) rawText = rawText + ";"; //$NON-NLS-1$ - Position inHtml = new Position(valStartOffset, rawText.length()); - scriptLocationInHtml.add(inHtml); - /* need to pad the script text with spaces */ - char[] spaces = Util.getPad(valStartOffset - scriptOffset); - fScriptText.append(spaces); - fScriptText.append(rawText); - scriptOffset = fScriptText.length(); - } - } - } - } - } - - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#translateJSNode(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion) - */ - public void translateJSNode(IStructuredDocumentRegion container) { - ITextRegionCollection containerRegion = container; - Iterator regions = containerRegion.getRegions().iterator(); - ITextRegion region = null; - - if(container==null) return; - - char[] spaces = Util.getPad(container.getStartOffset() - scriptOffset); - fScriptText.append(spaces); - scriptOffset = container.getStartOffset(); - - if(container.getType()!=DOMRegionContext.BLOCK_TEXT && container.getType()!= DOMRegionContext.XML_CDATA_TEXT) { - return; - } - - while (regions.hasNext() && !isCanceled()) { - region = (ITextRegion) regions.next(); - String type = region.getType(); - // content assist was not showing up in JSP inside a javascript - // region - - //System.out.println("Region text: " + container.getText().substring(region.getStart(), region.getEnd())); - boolean isContainerRegion = region instanceof ITextRegionContainer; - /* make sure its not a sub container region, probably JSP */ - if (type == DOMRegionContext.BLOCK_TEXT ) { - int scriptStart = container.getStartOffset(); - int scriptTextLength = container.getLength(); - String regionText = container.getFullText(region); - regionText = StringUtils.replace(regionText, CDATA_START, CDATA_START_PAD); - regionText = StringUtils.replace(regionText, CDATA_END, CDATA_END_PAD); - int regionLength = region.getLength(); - - spaces = Util.getPad(scriptStart - scriptOffset); - fScriptText.append(spaces); - // skip over XML/HTML comment starts - if (regionText.indexOf(XML_COMMENT_START) >= 0) { - int index = regionText.indexOf(XML_COMMENT_START); - - boolean replaceCommentStart = true; - for (int i = 0; i < index; i++) { - /* - * replace the comment start in the translation when - * it's preceded only by white space - */ - replaceCommentStart = replaceCommentStart && Character.isWhitespace(regionText.charAt(i)); - } - - if (replaceCommentStart) { - IRegion line; - int end; - int length; - try { - line = container.getParentDocument().getLineInformationOfOffset(index + scriptStart); - end = line.getOffset() + line.getLength() - scriptStart; - if(end > regionText.length()) { - end = regionText.length()-1; - } - length = end - index; - } catch (BadLocationException e) { - Logger.logException("Could not get HTML style comment line information", e); //$NON-NLS-1$ - - end = index + XML_COMMENT_START.length(); - length = XML_COMMENT_START.length(); - } - - StringBuffer newRegionText = new StringBuffer(regionText.substring(0, index)); - spaces = Util.getPad(length); - newRegionText.append(spaces); - newRegionText.append(regionText.substring(end)); - regionText = newRegionText.toString(); - } - } - // server-side code -// else { - /* - * Fix for - * https://bugs.eclipse.org/bugs/show_bug.cgi?id=284774 - * end of last valid JS source, start of next content to - * skip - */ - // last offset of valid JS source, after which there's server-side stuff - int validJSend = 0; - // start of next valid JS source, last offset of content that was skipped - int validJSstart = 0; - - Matcher matcher = fClientSideTagPattern.matcher(regionText); - // note the start of a HTML tag if one's present - int clientMatchStart = matcher.find() ? matcher.start() : -1; - - StringBuffer contents = new StringBuffer(); - - int serverSideStart = -1; - int serverSideDelimiter = 0; - - // find any instance of server code blocks in the region text - for (int i = 0; i < fServerSideDelimiters.length; i++) { - int index = regionText.indexOf(fServerSideDelimiters[i][0]); - if (serverSideStart < 0) { - serverSideStart = index; - serverSideDelimiter = i; - } - else if (index >= 0) { - serverSideStart = Math.min(serverSideStart, index); - if (serverSideStart == index) { - serverSideDelimiter = i; - } - } - } - // contains something other than pure JavaScript - while (serverSideStart > -1 || clientMatchStart > -1) { //$NON-NLS-1$ - validJSend = validJSstart; - boolean biasClient = false; - boolean biasServer = false; - // update the start of content to skip - if (clientMatchStart > -1 && serverSideStart > -1) { - validJSend = Math.min(clientMatchStart, serverSideStart); - biasClient = validJSend == clientMatchStart; - biasServer = validJSend == serverSideStart; - } - else if (clientMatchStart > -1 && serverSideStart < 0) { - validJSend = clientMatchStart; - biasClient = true; - } - else if (clientMatchStart < 0 && serverSideStart > -1) { - validJSend = serverSideStart; - biasServer = true; - } - - // append if there's something we want to include - if (-1 < validJSstart && -1 < validJSend) { - // append what we want to include - contents.append(regionText.substring(validJSstart, validJSend)); - - // change the skipped content to a valid variable name and append it as a placeholder - int startOffset = container.getStartOffset(region) + validJSend; - - String serverEnd = fServerSideDelimiters[serverSideDelimiter][1]; - int serverSideEnd = (regionLength > validJSend + serverEnd.length()) ? regionText.indexOf(serverEnd, validJSend + fServerSideDelimiters[serverSideDelimiter][1].length()) : -1; - if (serverSideEnd > -1) - serverSideEnd += serverEnd.length(); - int clientMatchEnd = matcher.find(validJSend) ? matcher.end() : -1; - // update end of what we skipped - validJSstart = -1; - if (clientMatchEnd > validJSend && serverSideEnd > validJSend) { - if (biasClient) - validJSstart = clientMatchEnd; - else if (biasServer) - validJSstart = serverSideEnd; - else - validJSstart = Math.min(clientMatchEnd, serverSideEnd); - } - if (clientMatchEnd >= validJSend && serverSideEnd < 0) - validJSstart = matcher.end(); - if (clientMatchEnd < 0 && serverSideEnd >= validJSend) - validJSstart = serverSideEnd; - int line = container.getParentDocument().getLineOfOffset(startOffset); - int column; - try { - column = startOffset - container.getParentDocument().getLineOffset(line); - } - catch (BadLocationException e) { - column = -1; - } - // substituted text length much match original length exactly, find text of the right length - int start = validJSend + container.getStartOffset(region); - contents.append('_'); - for (int i = validJSend + 1; i < validJSstart; i++) { - switch (i - validJSend) { - case 1 : - contents.append('$'); - break; - case 2 : - contents.append('t'); - break; - case 3 : - contents.append('a'); - break; - case 4 : - contents.append('g'); - break; - default : - contents.append('_'); - } - } - int end = validJSstart + container.getStartOffset(region); - // remember that this source range w - fGeneratedRanges.add(new Region(start, end - start)); - } - // set up to end while if no end for valid - if (validJSstart > 0) { - int serverSideStartGuess = -1; - for (int i = 0; i < fServerSideDelimiters.length; i++) { - int index = regionText.indexOf(fServerSideDelimiters[i][0], validJSstart); - if (serverSideStartGuess < 0) { - serverSideStartGuess = index; - serverSideDelimiter = i; - } - else if (index >= 0) { - serverSideStartGuess = Math.min(serverSideStartGuess, index); - if (serverSideStartGuess == index) { - serverSideDelimiter = i; - } - } - } - serverSideStart = validJSstart < regionLength - fShortestServerSideDelimiterPairLength ? serverSideStartGuess : -1; - clientMatchStart = validJSstart < regionLength ? (matcher.find(validJSstart) ? matcher.start() : -1) : -1; - } - else { - serverSideStart = clientMatchStart = -1; - } - } - if (validJSstart >= 0) { - contents.append(regionText.substring(validJSstart)); - } - if (contents.length() != 0) { - fScriptText.append(contents.toString()); - } - else { - fScriptText.append(regionText); - } - Position inHtml = new Position(scriptStart, scriptTextLength); - scriptLocationInHtml.add(inHtml); -// } - - scriptOffset = fScriptText.length(); - } - } - - IStructuredDocumentRegion endTag = container.getNext(); - - if(endTag==null) { - missingEndTagRegionStart = container.getStartOffset(); - }else if(endTag!=null) { - NodeHelper nh = new NodeHelper(endTag); - String name = nh.getTagName(); - - if(name==null || !name.trim().equalsIgnoreCase("script") || !nh.isEndTag()) { //$NON-NLS-1$ - missingEndTagRegionStart = container.getStartOffset(); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#translateScriptImportNode(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion) - */ - public void translateScriptImportNode(IStructuredDocumentRegion region) { - NodeHelper nh = new NodeHelper(region); - String importName = nh.getAttributeValue("src"); //$NON-NLS-1$ - if (importName != null && !importName.equals("")) { //$NON-NLS-1$ - rawImports.add(importName); - Position inHtml = new Position(region.getStartOffset(), region.getEndOffset()); - importLocationsInHtml.add(inHtml); - } - } - - - - /* (non-Javadoc) - * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) - */ - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) - */ - public void documentAboutToBeChanged(DocumentEvent event) { - cancelParse = true; - - } - - /* (non-Javadoc) - * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent) - */ - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#documentChanged(org.eclipse.jface.text.DocumentEvent) - */ - public void documentChanged(DocumentEvent event) { - if (fIsInRewriteSession) { - return; - } - - reset(); - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) - */ - protected IStatus run(IProgressMonitor monitor) { - reset(); - return Status.OK_STATUS; - } - - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.web.core.javascript.IJsTranslator#release() - */ - public void release() { - fStructuredDocument.removeDocumentListener(this); - if (fStructuredDocument instanceof IDocumentExtension4) { - ((IDocumentExtension4) fStructuredDocument).removeDocumentRewriteSessionListener(fDocumentRewriteSessionListener); - } - } - - /** - * @return the fGeneratedRanges - */ - public Region[] getGeneratedRanges() { - return (Region[]) fGeneratedRanges.toArray(new Region[fGeneratedRanges.size()]); - } -}
\ No newline at end of file |