This commit is contained in:
Christopher Jeffrey 2011-08-14 01:04:35 -05:00
parent 68157a29b4
commit ea1a4043a4

View File

@ -136,10 +136,7 @@ block.token = function lex(str, tokens, line) {
var scan = function() {
if (!str) return;
var i = 0;
for (; i < len; i++) {
for (var i = 0; i < len; i++) {
key = keys[i];
if (cap = rules[key].exec(str)) {
str = str.substring(cap[0].length);
@ -148,107 +145,108 @@ block.token = function lex(str, tokens, line) {
}
};
while (scan())
switch (key) {
case 'newline':
line++;
break;
case 'hr':
tokens.push({
type: 'hr',
line: line
});
break;
case 'lheading':
tokens.push({
type: 'heading',
depth: cap[2] === '=' ? 1 : 2,
text: cap[1],
line: line
});
break;
case 'heading':
tokens.push({
type: 'heading',
depth: cap[1].length,
text: cap[2],
line: line
});
break;
case 'block':
cap = cap[0].replace(/^ {4}/gm, '');
tokens.push({
type: 'block',
text: cap,
line: line
});
break;
case 'list':
tokens.push({
type: 'list_start',
ordered: isFinite(cap[2]),
line: line
});
// get each top-level
// item in the list
cap = cap[0].match(
/^( *)(\*|\+|-|\d+\.)[^\n]+(?:\n(?:\1 )+[^\n]+)*/gm
);
cap.forEach(function(item) {
// remove the list items sigil
// so its seen as the next token
item = item.replace(/^ *(\*|\+|-|\d+\.) */, '');
// outdent whatever the
// list item contains, hacky
var len = /\n( +)/.exec(item);
if (len) {
len = len[1].length;
item = item.replace(
new RegExp('^ {' + len + '}', 'gm'),
''
);
}
while (scan()) {
switch (key) {
case 'newline':
line++;
break;
case 'hr':
tokens.push({
type: 'list_item_start',
type: 'hr',
line: line
});
break;
case 'lheading':
tokens.push({
type: 'heading',
depth: cap[2] === '=' ? 1 : 2,
text: cap[1],
line: line
});
break;
case 'heading':
tokens.push({
type: 'heading',
depth: cap[1].length,
text: cap[2],
line: line
});
break;
case 'block':
cap = cap[0].replace(/^ {4}/gm, '');
tokens.push({
type: 'block',
text: cap,
line: line
});
break;
case 'list':
tokens.push({
type: 'list_start',
ordered: isFinite(cap[2]),
line: line
});
// get each top-level
// item in the list
cap = cap[0].match(
/^( *)(\*|\+|-|\d+\.)[^\n]+(?:\n(?:\1 )+[^\n]+)*/gm
);
cap.forEach(function(item) {
// remove the list items sigil
// so its seen as the next token
item = item.replace(/^ *(\*|\+|-|\d+\.) */, '');
// outdent whatever the
// list item contains, hacky
var len = /\n( +)/.exec(item);
if (len) {
len = len[1].length;
item = item.replace(
new RegExp('^ {' + len + '}', 'gm'),
''
);
}
tokens.push({
type: 'list_item_start',
line: line
});
// recurse
lex(item, tokens, line);
tokens.push({
type: 'list_item_end',
line: line
});
});
tokens.push({
type: 'list_end',
line: line
});
break;
case 'html':
case 'text':
tokens.push({
type: key,
text: cap[0],
line: line
});
break;
case 'blockquote':
tokens.push({
type: 'blockquote_start',
line: line
});
cap = cap[0].replace(/^ *>/gm, '');
// recurse
lex(item, tokens, line);
lex(cap, tokens, line);
tokens.push({
type: 'list_item_end',
type: 'blockquote_end',
line: line
});
});
tokens.push({
type: 'list_end',
line: line
});
break;
case 'html':
case 'text':
tokens.push({
type: key,
text: cap[0],
line: line
});
break;
case 'blockquote':
tokens.push({
type: 'blockquote_start',
line: line
});
cap = cap[0].replace(/^ *>/gm, '');
// recurse
lex(cap, tokens, line);
tokens.push({
type: 'blockquote_end',
line: line
});
break;
break;
}
}
return tokens;
@ -302,10 +300,7 @@ inline.lexer = function(str) {
var scan = function() {
if (!str) return;
var i = 0;
for (; i < len; i++) {
for (var i = 0; i < len; i++) {
key = keys[i];
if (cap = rules[key].exec(str)) {
str = str.substring(cap[0].length);
@ -314,70 +309,71 @@ inline.lexer = function(str) {
}
};
while (scan())
switch (key) {
case 'tag':
out += cap[0];
break;
case 'img':
out += '<img src="'
+ escape(cap[2])
+ '" alt="' + escape(cap[1])
+ '"'
+ (cap[3]
? ' title="'
+ escape(cap[3])
+ '"'
: '')
+ '>';
break;
case 'link':
case 'reflink':
link = links[cap[2]] || '';
out += '<a href="'
+ escape(link.href || cap[2])
+ '"'
+ (link.title
? ' title="'
+ escape(link.title)
+ '"'
: '')
+ '>'
+ inline.lexer(cap[1])
+ '</a>';
break;
case 'autolink':
if (cap[2] === '@') {
text = mangle(cap[1]);
href = mangle('mailto:') + text;
} else {
text = escape(cap[1]);
href = text;
}
out += '<a href="' + href + '">'
+ text
+ '</a>';
break;
case 'strong':
out += '<strong>'
+ inline.lexer(cap[2] || cap[1])
+ '</strong>';
break;
case 'em':
out += '<em>'
+ inline.lexer(cap[2] || cap[1])
+ '</em>';
break;
case 'escape':
out += '<code>'
+ escape(cap[2] || cap[1])
+ '</code>';
break;
case 'text':
out += escape(cap[1]);
break;
default:
break;
while (scan()) {
switch (key) {
case 'tag':
out += cap[0];
break;
case 'img':
out += '<img src="'
+ escape(cap[2])
+ '" alt="' + escape(cap[1])
+ '"'
+ (cap[3]
? ' title="'
+ escape(cap[3])
+ '"'
: '')
+ '>';
break;
case 'link':
case 'reflink':
link = links[cap[2]] || '';
out += '<a href="'
+ escape(link.href || cap[2])
+ '"'
+ (link.title
? ' title="'
+ escape(link.title)
+ '"'
: '')
+ '>'
+ inline.lexer(cap[1])
+ '</a>';
break;
case 'autolink':
if (cap[2] === '@') {
text = mangle(cap[1]);
href = mangle('mailto:') + text;
} else {
text = escape(cap[1]);
href = text;
}
out += '<a href="' + href + '">'
+ text
+ '</a>';
break;
case 'strong':
out += '<strong>'
+ inline.lexer(cap[2] || cap[1])
+ '</strong>';
break;
case 'em':
out += '<em>'
+ inline.lexer(cap[2] || cap[1])
+ '</em>';
break;
case 'escape':
out += '<code>'
+ escape(cap[2] || cap[1])
+ '</code>';
break;
case 'text':
out += escape(cap[1]);
break;
default:
break;
}
}
return out;