001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * If you wish your version of this file to be governed by only the CDDL
025: * or only the GPL Version 2, indicate your decision by adding
026: * "[Contributor] elects to include this software in this distribution
027: * under the [CDDL or GPL Version 2] license." If you do not indicate a
028: * single choice of license, a recipient has the option to distribute
029: * your version of this file under either the CDDL, the GPL Version 2 or
030: * to extend the choice of license to its licensees as provided above.
031: * However, if you add GPL Version 2 code and therefore, elected the GPL
032: * Version 2 license, then the option applies only if the new code is
033: * made subject to such option by the copyright holder.
034: *
035: * Contributor(s):
036: *
037: * Portions Copyrighted 2008 Sun Microsystems, Inc.
038: */
039: package org.netbeans.modules.html.editor.gsf;
040:
041: import java.io.IOException;
042: import java.util.List;
043: import java.util.logging.Level;
044: import java.util.logging.Logger;
045: import org.netbeans.editor.ext.html.parser.AstNode;
046: import org.netbeans.editor.ext.html.parser.SyntaxElement;
047: import org.netbeans.editor.ext.html.parser.SyntaxParser;
048: import org.netbeans.modules.editor.html.HTMLKit;
049: import org.netbeans.modules.gsf.api.CompilationInfo;
050: import org.netbeans.modules.gsf.api.ElementHandle;
051: import org.netbeans.modules.gsf.api.OffsetRange;
052: import org.netbeans.modules.gsf.api.ParseEvent;
053: import org.netbeans.modules.gsf.api.Parser;
054: import org.netbeans.modules.gsf.api.ParserFile;
055: import org.netbeans.modules.gsf.api.ParserResult;
056: import org.netbeans.modules.gsf.api.PositionManager;
057: import org.netbeans.modules.gsf.api.TranslatedSource;
058: import org.openide.util.Exceptions;
059:
060: /**
061: *
062: * @author marek
063: */
064: public class HtmlGSFParser implements Parser, PositionManager {
065:
066: private static final Logger LOGGER = Logger
067: .getLogger(HtmlGSFParser.class.getName());
068: private static final boolean LOG = LOGGER.isLoggable(Level.FINE);
069:
070: public void parseFiles(Job job) {
071: for (ParserFile file : job.files) {
072: try {
073: ParseEvent beginEvent = new ParseEvent(
074: ParseEvent.Kind.PARSE, file, null);
075: job.listener.started(beginEvent);
076:
077: ParserResult result = null;
078:
079: CharSequence buffer = job.reader.read(file);
080: int caretOffset = job.reader.getCaretOffset(file);
081:
082: SyntaxParser parser = SyntaxParser.create(buffer);
083: List<SyntaxElement> elements = parser
084: .parseImmutableSource();
085:
086: if (LOG) {
087: for (SyntaxElement element : elements) {
088: LOGGER.log(Level.FINE, element.toString());
089: }
090: }
091:
092: result = new HtmlParserResult(this , file, elements);
093:
094: //TODO implement some error checks here, at least for unpaired tags?
095:
096: ParseEvent doneEvent = new ParseEvent(
097: ParseEvent.Kind.PARSE, file, result);
098: job.listener.finished(doneEvent);
099: } catch (IOException ex) {
100: job.listener.exception(ex);
101: Exceptions.printStackTrace(ex);
102: }
103:
104: }
105: }
106:
107: public PositionManager getPositionManager() {
108: return this ;
109: }
110:
111: public OffsetRange getOffsetRange(CompilationInfo info,
112: ElementHandle object) {
113: if (object instanceof HtmlElementHandle) {
114: ParserResult presult = info.getEmbeddedResults(
115: HTMLKit.HTML_MIME_TYPE).iterator().next();
116: final TranslatedSource source = presult
117: .getTranslatedSource();
118: AstNode node = ((HtmlElementHandle) object).node();
119: return new OffsetRange(AstUtils.documentPosition(node
120: .startOffset(), source), AstUtils.documentPosition(
121: node.endOffset(), source));
122:
123: } else {
124: throw new IllegalArgumentException((("Foreign element: "
125: + object + " of type " + object) != null) ? object
126: .getClass().getName() : "null"); //NOI18N
127: }
128: }
129: }
|