ng-bind-html和highlight.js

时间:2016-01-06 16:03:38

标签: javascript angularjs syntax-highlighting

我正在尝试为动态添加的html中的所有代码元素进行语法高亮显示,这些代码元素将使用ng-bind-html添加到当前页面。

<div ng-repeat="activity in activities">
    <h3>{{activity.title}}</h3>
    <div ng-bind-html="activity.text">
    </div>
</div>

activity.text变量包含以下内容:

<p>This is a paragraph with some code following.</p>
<pre><code class="lang-python">
s = "Python syntax highlighting"
print s
</code></pre>
<p>some other HTML elements </p>

到目前为止这是有效的,但没有语法高亮。所以我添加了highlightjs和angular-highlightjs。我已将<div ng-bind-html="activity.text">更改为<div hljs ng-bind-html="activity.text"> 现在的问题是结合ng-bind-html和hljs指令没有按预期工作。 它不会在代码标记(预编码)中添加语法突出显示,而是添加整个html内容。

是否有更好的方法可以为动态添加的内容进行语法突出显示?

1 个答案:

答案 0 :(得分:1)

我通过在服务器端添加语法突出显示来修复我的问题(因为我在服务器端也进行降价转换)。 我正在使用带有expressjs框架的nodejs作为后端。

在获取活动时,我通过查询参数激活highlightjs(f.e.GET / activities?hljs = true)。 对于每个活动,我调用以下函数(这不是完全干净的代码,但它有效):

var cheerio = require('cheerio');
var hljs = require('highlight.js');

// ... express routes ...

var highlightPreCodeElements = function (htmlText) {
  var $ = cheerio.load(htmlText);

   $('pre code').each(function(i, block) {
    if ($(this).attr('class') && $(this).attr('class').slice(0, 4) === 'lang') {
      var indexOfMinus = $(this).attr('class').indexOf('-');
      var language = $(this).attr('class').substr(indexOfMinus + 1);
      $(this).html(hljs.highlight(language, $(this).text()).value);
    }
  });

  return $.html();
};

正如您所看到的,我在nodejs和highlight.js(npm install cheerio)中使用cheerio(npm install highlight.js)来表示jQuery-API。

在客户端,我只引用了highlightjs样式表,就是这样。