我一直在爲Velocity的一個稍微修改過的版本研究語法突出顯示。簡而言之,我可以如何包裝從#inline()
開始並以相應的#end
結尾的所有內容,條件是可以存在總是有#end
的0-無限if語句。如果您有任何問題,請告訴我。將一個JavaScript生成的HTML結構包含在多個終點實例中
可在此fiddle上找到示例。請參閱下面的更多詳細信息。
樣本HTML
小提琴顯示的JavaScript修改HTML以下版本的職務。
<pre><code>
$javascript.push("/path/to/file")
#inline()
$('.lazy.bg2').attr({'data-src':'/img_path2.jpg'}).css('background','red');
#if($myVar == "hi")
$('.someClass).hide()
#elseif($myVar == "there")
$('.lazy.bg1').attr({'data-src':'/img_path.jpg'})
#else
$('.lazy.bg3').attr({'data-src':'/img_path3.jpg'})
#end
$('.lazy.bg2 a').attr({'data-href':'/random-path2.htm'})
$('.lazy.bg1 a').attr({'data-href':'/random-path.htm'})
#end
#if($test.method == "myVal")
#set($foo = "swag")
#elseif($foo == "bar")
#set($foo = "ballin")
#elseif($myObject.randomMethod().contains("myVal"))
#set($foo = "weeee")
#else
#set($foo = "sad days")
#end
#set($testVar = "Test value")
#parse("/path/to/file")</code></pre>
的問題
因爲有我不知道如何得到它的結束#inline()
語句相匹配的#end
多個實例。主要的問題在於可能有無數的if語句,但#inline()
將始終具有相應的結束語句。所以我猜猜最好的方法是基於它是相同的空白級別來匹配它。不過,我不確定是否有更好的解決方案。我在Gone Coding's後here找到原始的javascript。不過,我稍微修改了它以更好地匹配我的實現。 注意我在早期的jQuery語句中將速度類添加到<pre>
。最終結果應該只應用<span>
到#inline()
內的jQuery。
的Javascript
$('pre.velocity code').each(function() {
var open = false;
var result = $();
$(this).contents().each(function() {
var $this = $(this);
if ($this.text() == "#inline()" || $this.text() == "#end") {
if (open) {
result.wrapAll('<span class="velocity-inline-inner"></span>');
open = false;
} else {
result = $();
open = true;
}
} else {
result = result.add($this)
}
});
if (open) {
result.wrapAll('<span class="velocity-inline-inner"></span>');
}
});
更新的Javascript
我有一個可以依靠的空白,並選擇相匹配的#inline()
的空白水平#end
以下,不過我有問題在if語句中僅將該子字符串轉換爲html。
$('pre.velocity code').each(function(){
var str = $(this).text();
str = str.substring(str.indexOf("#inline()") + 10);
textArray = str.split("\n");
getInlineEnd(str,textArray);
});
function getInlineEnd(str,textArray) {
for(var i = 0; i <= textArray.length; i++) {
if(textArray[i].length === 4 && textArray[i] === "#end") {
//convert textArray[i] to a html node and then wrap with a <span>
break;
}
}
}
最終目標HTML
最終的結果應該看起來像下面。我已經在#inline()
和#end
之間添加了一個範圍。
#inline()
<span class="velocity-inline-inner">
$('.lazy.bg2').attr({'data-src':'/img_path2.jpg'}).css('background','red');
#if($myVar == "hi")
$('.someClass).hide()
#elseif($myVar == "there")
$('.lazy.bg1').attr({'data-src':'/img_path.jpg'})
#else
$('.lazy.bg3').attr({'data-src':'/img_path3.jpg'})
#end
$('.lazy.bg2 a').attr({'data-href':'/random-path2.htm'})
$('.lazy.bg1 a').attr({'data-href':'/random-path.htm'})
</span>
#end
我相信,一旦我得到上面的代碼正常工作,那麼它應該適當的語法突出顯示。但最終目標是讓所有jQuery方法值突出顯示。我將在不同的正則表達式下處理選擇器。
結束了說,有一個TypeError它不能讀取的不確定text屬性,並指向'如果(toClose.text()=== 「#inline()」 ){'。所以聽起來像pop()沒有返回帶有文本節點的對象。 – Elias
哦對。最好做一些調試呢?正如我所說,我並不完全瞭解你的代碼,所以代碼可能不會只是複製/粘貼。 – Whothehellisthat