angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
65 lines (57 loc) • 2.3 kB
JavaScript
angular.module('docsApp')
.directive('hljs', ['$timeout', '$q', '$interpolate', function($timeout, $q, $interpolate) {
return {
restrict: 'E',
compile: function(element, attr) {
var code;
//No attribute? code is the content
if (!attr.code) {
code = element.html();
element.empty();
}
return function(scope, element, attr) {
if (attr.code) {
// Attribute? code is the evaluation
code = scope.$eval(attr.code);
}
var shouldInterpolate = scope.$eval(attr.shouldInterpolate);
$q.when(code).then(function(code) {
if (code) {
if (shouldInterpolate) {
code = $interpolate(code)(scope);
}
var contentParent = angular.element(
'<pre><code class="highlight" ng-non-bindable></code></pre>'
);
element.append(contentParent);
// Defer highlighting 1-frame to prevent GA interference...
$timeout(function() {
render(code, contentParent);
}, 34, false);
}
});
function render(contents, parent) {
var codeElement = parent.find('code');
// Strip excessive newlines and the leading/trailing newline (otherwise the whitespace
// calculations below are not correct).
var strippedContents = contents.replace(/\n{2,}/g, '\n\n').replace(/^\n/, '').replace(/\n$/, '');
var lines = strippedContents.split('\n');
// Make it so each line starts at 0 whitespace
var firstLineWhitespace = lines[0].match(/^\s*/)[0];
var startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);
lines = lines.map(function(line) {
return line
.replace(startingWhitespaceRegex, '')
.replace(/\s+$/, '');
});
var highlightedCode = hljs.highlight(attr.language || attr.lang, lines.join('\n'), true);
highlightedCode.value = highlightedCode.value
.replace(/=<span class="hljs-value">""<\/span>/gi, '')
.replace('<head>', '')
.replace('<head/>', '');
codeElement.append(highlightedCode.value).addClass('highlight');
}
};
}
};
}]);