text block function

This commit is contained in:
Christopher Jeffrey 2011-10-04 17:32:59 -05:00
parent 9527426b65
commit 70da22d078

View File

@ -22,14 +22,14 @@ var block = {
}; };
block.keys = [ block.keys = [
'newline', 'newline',
'block', 'block',
'heading', 'heading',
'lheading', 'lheading',
'hr', 'hr',
'blockquote', 'blockquote',
'list', 'list',
'html', 'html',
'text' 'text'
]; ];
@ -48,7 +48,7 @@ block.lexer = function(str) {
// grab link definitons // grab link definitons
str = str.replace( str = str.replace(
/^ {0,3}\[([^\]]+)\]: *([^ ]+)(?: +"([^\n]+)")? *$/gm, /^ {0,3}\[([^\]]+)\]: *([^ ]+)(?: +"([^\n]+)")? *$/gm,
function(__, id, href, title) { function(__, id, href, title) {
links[id] = { links[id] = {
href: href, href: href,
@ -100,22 +100,22 @@ block.token = function(str, tokens) {
break; break;
case 'lheading': case 'lheading':
tokens.push({ tokens.push({
type: 'heading', type: 'heading',
depth: cap[2] === '=' ? 1 : 2, depth: cap[2] === '=' ? 1 : 2,
text: cap[1] text: cap[1]
}); });
break; break;
case 'heading': case 'heading':
tokens.push({ tokens.push({
type: 'heading', type: 'heading',
depth: cap[1].length, depth: cap[1].length,
text: cap[2] text: cap[2]
}); });
break; break;
case 'block': case 'block':
cap = cap[0].replace(/^ {4}/gm, ''); cap = cap[0].replace(/^ {4}/gm, '');
tokens.push({ tokens.push({
type: 'block', type: 'block',
text: cap text: cap
}); });
break; break;
@ -130,10 +130,10 @@ block.token = function(str, tokens) {
/^( *)([*+-]|\d+\.)[^\n]*(?:\n(?!\1(?:\2|\d+\.))[^\n]*)*/gm /^( *)([*+-]|\d+\.)[^\n]*(?:\n(?!\1(?:\2|\d+\.))[^\n]*)*/gm
); );
each(cap, function(item) { each(cap, function(item) {
// remove the list items sigil // remove the list items sigil
// so its seen as the next token // so its seen as the next token
item = item.replace(/^ *([*+-]|\d+\.) */, ''); item = item.replace(/^ *([*+-]|\d+\.) */, '');
// outdent whatever the // outdent whatever the
// list item contains, hacky // list item contains, hacky
var space = /\n( +)/.exec(item); var space = /\n( +)/.exec(item);
if (space) { if (space) {
@ -141,7 +141,7 @@ block.token = function(str, tokens) {
item = item.replace(space, ''); item = item.replace(space, '');
} }
tokens.push({ tokens.push({
type: loose type: loose
? 'loose_item_start' ? 'loose_item_start'
: 'list_item_start' : 'list_item_start'
}); });
@ -157,7 +157,7 @@ block.token = function(str, tokens) {
case 'html': case 'html':
case 'text': case 'text':
tokens.push({ tokens.push({
type: key, type: key,
text: cap[0] text: cap[0]
}); });
break; break;
@ -197,13 +197,13 @@ var inline = {
inline.keys = [ inline.keys = [
'escape', 'escape',
'autolink', 'autolink',
'tag', 'tag',
'link', 'link',
'reflink', 'reflink',
'nolink', 'nolink',
'strong', 'strong',
'em', 'em',
'code', 'code',
'br', 'br',
'text' 'text'
@ -226,7 +226,7 @@ inline.text = (function() {
('code') ('code')
('br'); ('br');
return new return new
RegExp('^[^\\0]+?(?=' + body.join('|') + '|$)'); RegExp('^[^\\0]+?(?=' + body.join('|') + '|$)');
})(); })();
@ -260,7 +260,7 @@ inline.lexer = function(str) {
while (scan()) { while (scan()) {
switch (key) { switch (key) {
case 'escape': case 'escape':
out += cap[1]; out += cap[1];
break; break;
case 'tag': case 'tag':
@ -285,28 +285,28 @@ inline.lexer = function(str) {
}; };
} }
if (cap[0][0] !== '!') { if (cap[0][0] !== '!') {
out += '<a href="' out += '<a href="'
+ escape(link.href) + escape(link.href)
+ '"' + '"'
+ (link.title + (link.title
? ' title="' ? ' title="'
+ escape(link.title) + escape(link.title)
+ '"' + '"'
: '') : '')
+ '>' + '>'
+ inline.lexer(cap[1]) + inline.lexer(cap[1])
+ '</a>'; + '</a>';
} else { } else {
out += '<img src="' out += '<img src="'
+ escape(link.href) + escape(link.href)
+ '" alt="' + '" alt="'
+ escape(cap[1]) + escape(cap[1])
+ '"' + '"'
+ (link.title + (link.title
? ' title="' ? ' title="'
+ escape(link.title) + escape(link.title)
+ '"' + '"'
: '') : '')
+ '>'; + '>';
} }
break; break;
@ -325,18 +325,18 @@ inline.lexer = function(str) {
+ '</a>'; + '</a>';
break; break;
case 'strong': case 'strong':
out += '<strong>' out += '<strong>'
+ inline.lexer(cap[2] || cap[1]) + inline.lexer(cap[2] || cap[1])
+ '</strong>'; + '</strong>';
break; break;
case 'em': case 'em':
out += '<em>' out += '<em>'
+ inline.lexer(cap[2] || cap[1]) + inline.lexer(cap[2] || cap[1])
+ '</em>'; + '</em>';
break; break;
case 'code': case 'code':
out += '<code>' out += '<code>'
+ escape(cap[2] || cap[1]) + escape(cap[2] || cap[1])
+ '</code>'; + '</code>';
break; break;
case 'br': case 'br':
@ -368,64 +368,76 @@ var tok = function() {
switch (token.type) { switch (token.type) {
case 'space': case 'space':
return ''; return '';
case 'hr': case 'hr':
return '<hr>'; return '<hr>';
case 'heading': case 'heading':
return '<h' + token.depth + '>' return '<h' + token.depth + '>'
+ inline.lexer(token.text) + inline.lexer(token.text)
+ '</h' + token.depth + '>'; + '</h' + token.depth + '>';
case 'block': case 'block':
return '<pre><code>' return '<pre><code>'
+ escape(token.text) + escape(token.text)
+ '</code></pre>'; + '</code></pre>';
case 'blockquote_start': case 'blockquote_start':
var body = []; var body = [];
while (next().type !== 'blockquote_end') { while (next().type !== 'blockquote_end') {
body.push(tok()); body.push(tok());
} }
return '<blockquote>'
+ body.join('') return '<blockquote>'
+ body.join('')
+ '</blockquote>'; + '</blockquote>';
case 'list_start': case 'list_start':
var body = [] var type = token.ordered ? 'ol' : 'ul'
, type = token.ordered ? 'ol' : 'ul'; , body = [];
while (next().type !== 'list_end') { while (next().type !== 'list_end') {
body.push(tok()); body.push(tok());
} }
return '<' + type + '>'
+ body.join('') return '<' + type + '>'
+ body.join('')
+ '</' + type + '>'; + '</' + type + '>';
case 'list_item_start': case 'list_item_start':
var body = []; var body = [];
while (next().type !== 'list_item_end') { while (next().type !== 'list_item_end') {
body.push(token.type === 'text' body.push(token.type === 'text'
? inline.lexer(token.text) ? text()
: tok()); : tok());
} }
return '<li>'
+ body.join(' ') return '<li>'
+ body.join(' ')
+ '</li>'; + '</li>';
case 'loose_item_start': case 'loose_item_start':
var body = []; var body = [];
while (next().type !== 'list_item_end') { while (next().type !== 'list_item_end') {
body.push(tok()); body.push(tok());
} }
return '<li>'
+ body.join(' ') return '<li>'
+ body.join(' ')
+ '</li>'; + '</li>';
case 'html': case 'html':
return inline.lexer(token.text); return inline.lexer(token.text);
case 'text': case 'text':
var body = [ token.text ] return '<p>' + text() + '</p>';
, top; }
while ((top = tokens[tokens.length-1]) };
&& top.type === 'text') {
body.push(next().text); var text = function() {
} var body = [ token.text ]
return '<p>' , top;
+ inline.lexer(body.join('\n'))
+ '</p>'; while ((top = tokens[tokens.length-1])
&& top.type === 'text') {
body.push(next().text);
} }
return inline.lexer(body.join('\n'));
}; };
var parse = function(src) { var parse = function(src) {