diff --git a/javascript2.editor/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProvider.java b/javascript2.editor/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProvider.java --- a/javascript2.editor/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProvider.java +++ b/javascript2.editor/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProvider.java @@ -549,9 +549,13 @@ // Emit the block verbatim int sourceStart = ts.offset(); String text = htmlToken.text().toString(); - List jsEmbeddings = extractJsEmbeddings(text, sourceStart); - for (EmbeddingPosition embedding : jsEmbeddings) { - embeddings.add(snapshot.create(embedding.getOffset(), embedding.getLength(), JsTokenId.JAVASCRIPT_MIME_TYPE)); + List jsEmbeddings = extractJsEmbeddings(text, sourceStart, snapshot.getMimeType().equals(XHTML_MIME_TYPE)); + for (EmbeddingInformation embedding : jsEmbeddings) { + if (embedding.getContent() != null) { + embeddings.add(snapshot.create(embedding.getContent(), JsTokenId.JAVASCRIPT_MIME_TYPE)); + } else { + embeddings.add(snapshot.create(embedding.getOffset(), embedding.getLength(), JsTokenId.JAVASCRIPT_MIME_TYPE)); + } } // XXX: need better support in parsing api for this // embeddings.add(snapshot.create("/*", JsTokenId.JAVASCRIPT_MIME_TYPE)); @@ -723,13 +727,29 @@ } } - protected static List extractJsEmbeddings(String text, int sourceStart) { - List embeddings = new LinkedList(); + protected static List extractJsEmbeddings(String text, int sourceStart, boolean decode) { + List embeddings = new LinkedList(); Scanner scanner = new Scanner(text).useDelimiter("()"); //NOI18N while (scanner.hasNext()) { scanner.next(); MatchResult match = scanner.match(); - embeddings.add(new EmbeddingPosition(sourceStart + match.start(), match.group().length())); + String toEmbed = match.group(); + if (decode && (toEmbed.contains("<") || toEmbed.contains(">"))) { + Scanner decodeScanner = new Scanner(text).useDelimiter("(<|>)"); //NOI18N + while (decodeScanner.hasNext()) { + decodeScanner.next(); + MatchResult decodeMatch = decodeScanner.match(); + int originalOffset = sourceStart + match.start() + decodeMatch.start(); + int originalLength = decodeMatch.group().length(); + int decodeOffset = originalLength + match.start() + decodeMatch.start(); + embeddings.add(new EmbeddingInformation(originalOffset, originalLength)); + if (decodeScanner.hasNext()) { + embeddings.add(new EmbeddingInformation(toEmbed.substring(decodeOffset, decodeOffset + 4))); + } + } + } else { + embeddings.add(new EmbeddingInformation(sourceStart + match.start(), toEmbed.length())); + } } return embeddings; } @@ -744,16 +764,21 @@ Embedding lastInlinedJavscriptEmbedding = null; } - protected static final class EmbeddingPosition { + protected static final class EmbeddingInformation { - private final int offset; - private final int length; + private int offset; + private int length; + private CharSequence content; - public EmbeddingPosition(int offset, int length) { + public EmbeddingInformation(int offset, int length) { this.offset = offset; this.length = length; } + public EmbeddingInformation(CharSequence content) { + this.content = getDecodedContent(content); + } + public int getLength() { return length; } @@ -762,5 +787,14 @@ return offset; } + public CharSequence getContent() { + return content; + } + + private CharSequence getDecodedContent(CharSequence content) { + String contentHolder = CharSequenceUtilities.toString(content); + return contentHolder.replace("<", "<").replace(">", ">"); + } + } } diff --git a/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProviderTest.java b/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProviderTest.java --- a/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProviderTest.java +++ b/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/embedding/JsEmbeddingProviderTest.java @@ -43,7 +43,7 @@ import java.util.List; import org.netbeans.modules.javascript2.editor.JsTestBase; -import org.netbeans.modules.javascript2.editor.embedding.JsEmbeddingProvider.EmbeddingPosition; +import org.netbeans.modules.javascript2.editor.embedding.JsEmbeddingProvider.EmbeddingInformation; /** * @@ -57,12 +57,12 @@ public void testExtractJsEmbeddings01() throws Exception { String text = " "; - List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0); + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0, false); assertEquals(embeddings.size(), 1); assertEquals(0, embeddings.get(0).getOffset()); assertEquals(text.length(), embeddings.get(0).getLength()); - embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5); + embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5, false); assertEquals(embeddings.size(), 1); assertEquals(5, embeddings.get(0).getOffset()); assertEquals(text.length(), embeddings.get(0).getLength()); @@ -70,12 +70,12 @@ public void testExtractJsEmbeddings02() throws Exception { String text = " "; - List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0); + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0, false); assertEquals(embeddings.size(), 1); assertEquals(0, embeddings.get(0).getOffset()); assertEquals(text.length(), embeddings.get(0).getLength()); - embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5); + embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5, false); assertEquals(embeddings.size(), 1); assertEquals(5, embeddings.get(0).getOffset()); assertEquals(text.length(), embeddings.get(0).getLength()); @@ -83,12 +83,12 @@ public void testExtractJsEmbeddings03() throws Exception { String text = " "; - List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0); + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0, false); assertEquals(embeddings.size(), 2); assertEquals(0, embeddings.get(0).getOffset()); assertEquals(text.indexOf(""), embeddings.get(0).getLength()); - embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5); + embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 5, false); assertEquals(embeddings.size(), 2); assertEquals(5, embeddings.get(0).getOffset()); assertEquals(text.indexOf(""), embeddings.get(0).getLength()); @@ -96,7 +96,7 @@ public void testExtractJsEmbeddings04() throws Exception { String text = " javascript code \n"; - List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0); + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0, false); assertEquals(1, embeddings.size()); assertEquals(text.indexOf(" javascript code "), embeddings.get(0).getOffset()); assertEquals(18, embeddings.get(0).getLength()); @@ -124,7 +124,7 @@ " afsdasdf\n"+ "\n"+ " "; - List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 193); + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 193, false); assertEquals(6, embeddings.size()); assertEquals(193, embeddings.get(0).getOffset()); assertEquals(text.indexOf("") + 18 + 193, embeddings.get(1).getOffset()); @@ -141,4 +141,16 @@ assertEquals(36, embeddings.get(5).getLength()); } + public void testExtractJsEmbeddings06() throws Exception { + String text = " for (var i = 0; i < 10 ; i++ ) {} "; + List embeddings = JsEmbeddingProvider.extractJsEmbeddings(text, 0, true); + assertEquals(3, embeddings.size()); + assertEquals(0, embeddings.get(0).getOffset()); + assertEquals(19, embeddings.get(0).getLength()); + assertEquals("<", embeddings.get(1).getContent()); + assertEquals(23, embeddings.get(2).getOffset()); + assertEquals(15, embeddings.get(2).getLength()); + } + + }