mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
markdown pre-processor should strip all the extra indentation
- split trim into trim and indent - merged my indentation code with trim - cleaned up some small issues
This commit is contained in:
parent
86321d1f57
commit
d600c608e3
2 changed files with 70 additions and 20 deletions
|
|
@ -143,6 +143,33 @@ describe('ngdoc', function(){
|
|||
toMatch('</div><h1>One</h1><div');
|
||||
});
|
||||
|
||||
it('should unindent text before processing based on the second line', function() {
|
||||
expect(new Doc().markdown('first line\n' +
|
||||
' second line\n\n' +
|
||||
' third line\n' +
|
||||
' fourth line\n\n' +
|
||||
' fifth line')).
|
||||
toMatch('<p>first line\n' +
|
||||
'second line</p>\n\n' +
|
||||
'<pre><code>third line\n' +
|
||||
' fourth line\n</code></pre>\n\n' +
|
||||
'<p>fifth line</p>');
|
||||
});
|
||||
|
||||
it('should unindent text before processing based on the first line', function() {
|
||||
expect(new Doc().markdown(' first line\n\n' +
|
||||
' second line\n' +
|
||||
' third line\n' +
|
||||
' fourth line\n\n' +
|
||||
' fifth line')).
|
||||
toMatch('<p>first line</p>\n\n' +
|
||||
'<pre><code>second line\n' +
|
||||
'third line\n' +
|
||||
' fourth line\n</code></pre>\n\n' +
|
||||
'<p>fifth line</p>');
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
describe('trim', function(){
|
||||
|
|
@ -163,7 +190,7 @@ describe('ngdoc', function(){
|
|||
var methodB = new Doc({name:'methodB', methodOf:'angular.service.abc'});
|
||||
var propA = new Doc({name:'propA', propertyOf:'angular.service.abc'});
|
||||
var propB = new Doc({name:'propB', propertyOf:'angular.service.abc'});
|
||||
;var docs = [methodB, methodA, propB, propA, parent]; // keep wrong order;
|
||||
var docs = [methodB, methodA, propB, propA, parent]; // keep wrong order;
|
||||
ngdoc.merge(docs);
|
||||
expect(docs.length).toEqual(1);
|
||||
expect(docs[0].name).toEqual('angular.service.abc');
|
||||
|
|
@ -185,7 +212,7 @@ describe('ngdoc', function(){
|
|||
name : 'number',
|
||||
optional: false,
|
||||
'default' : undefined,
|
||||
description : '<p>Number \n to format.</p>' }]);
|
||||
description : '<p>Number \nto format.</p>' }]);
|
||||
});
|
||||
|
||||
it('should parse with default and optional', function(){
|
||||
|
|
@ -267,7 +294,7 @@ describe('ngdoc', function(){
|
|||
var doc = new Doc("@returns {string} description\n new line\n another line");
|
||||
doc.parse();
|
||||
expect(doc.returns).
|
||||
toEqual({type: 'string', description: '<p>description\n new line\n another line</p>'});
|
||||
toEqual({type: 'string', description: '<p>description\nnew line\nanother line</p>'});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -62,8 +62,10 @@ Doc.prototype = {
|
|||
var IS_URL = /^(https?:\/\/|ftps?:\/\/|mailto:|\.|\/)/;
|
||||
var IS_ANGULAR = /^angular\./;
|
||||
if (!text) return text;
|
||||
var parts = text.split(/(<pre>[\s\S]*?<\/pre>|<doc:example>[\s\S]*?<\/doc:example>)/),
|
||||
match;
|
||||
|
||||
text = trim(text);
|
||||
|
||||
var parts = text.split(/(<pre>[\s\S]*?<\/pre>|<doc:example>[\s\S]*?<\/doc:example>)/);
|
||||
|
||||
parts.forEach(function(text, i){
|
||||
if (text.match(/^<pre>/)) {
|
||||
|
|
@ -495,7 +497,7 @@ function scenarios(docs){
|
|||
specs.push(' });');
|
||||
specs.push('');
|
||||
doc.scenarios.forEach(function(scenario){
|
||||
specs.push(trim(scenario, ' '));
|
||||
specs.push(indent(trim(scenario), 2));
|
||||
specs.push('');
|
||||
});
|
||||
specs.push('});');
|
||||
|
|
@ -564,36 +566,57 @@ function keywordSort(a, b){
|
|||
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
function trim(text, prefix) {
|
||||
var MAX = 9999;
|
||||
function trim(text) {
|
||||
var MAX_INDENT = 9999;
|
||||
var empty = RegExp.prototype.test.bind(/^\s*$/);
|
||||
var lines = text.split('\n');
|
||||
var minIndent = MAX;
|
||||
prefix = prefix || '';
|
||||
var minIndent = MAX_INDENT;
|
||||
var indentRegExp;
|
||||
var ignoreLine = (lines[0][0] != ' ' && lines.length > 1);
|
||||
// ignore first line if it has no indentation and there is more than one line
|
||||
|
||||
lines.forEach(function(line){
|
||||
minIndent = Math.min(minIndent, indent(line));
|
||||
if (ignoreLine) {
|
||||
ignoreLine = false;
|
||||
return;
|
||||
}
|
||||
|
||||
var indent = line.match(/^\s*/)[0].length;
|
||||
if (indent > 0 || minIndent == MAX_INDENT) {
|
||||
minIndent = Math.min(minIndent, indent);
|
||||
}
|
||||
});
|
||||
|
||||
indentRegExp = new RegExp('^\\s{0,' + minIndent + '}');
|
||||
|
||||
for ( var i = 0; i < lines.length; i++) {
|
||||
lines[i] = prefix + lines[i].substring(minIndent);
|
||||
lines[i] = lines[i].replace(indentRegExp, '');
|
||||
}
|
||||
|
||||
// remove leading lines
|
||||
while (empty(lines[0])) {
|
||||
lines.shift();
|
||||
}
|
||||
|
||||
// remove trailing
|
||||
while (empty(lines[lines.length - 1])) {
|
||||
lines.pop();
|
||||
}
|
||||
return lines.join('\n');
|
||||
}
|
||||
|
||||
function indent(line) {
|
||||
for(var i = 0; i < line.length; i++) {
|
||||
if (line.charAt(i) != ' ') {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return MAX;
|
||||
}
|
||||
function indent(text, spaceCount) {
|
||||
var lines = text.split('\n'),
|
||||
indent = '',
|
||||
fixedLines = [];
|
||||
|
||||
while(spaceCount--) indent += ' ';
|
||||
|
||||
lines.forEach(function(line) {
|
||||
fixedLines.push(indent + line);
|
||||
});
|
||||
|
||||
return fixedLines.join('\n');
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
|
|
|||
Loading…
Reference in a new issue