Vitaly Puzrin
10 years ago
8 changed files with 315 additions and 46 deletions
@ -0,0 +1,58 @@ |
|||||
|
// List of valid html blocks names, accorting to stmd spec
|
||||
|
// http://jgm.github.io/stmd/spec.html#html-blocks
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
|
||||
|
module.exports = [ |
||||
|
'article', |
||||
|
'aside', |
||||
|
'button', |
||||
|
'blockquote', |
||||
|
'body', |
||||
|
'canvas', |
||||
|
'caption', |
||||
|
'col', |
||||
|
'colgroup', |
||||
|
'dd', |
||||
|
'div', |
||||
|
'dl', |
||||
|
'dt', |
||||
|
'embed', |
||||
|
'fieldset', |
||||
|
'figcaption', |
||||
|
'figure', |
||||
|
'footer', |
||||
|
'form', |
||||
|
'h1', |
||||
|
'h2', |
||||
|
'h3', |
||||
|
'h4', |
||||
|
'h5', |
||||
|
'h6', |
||||
|
'header', |
||||
|
'hgroup', |
||||
|
'hr', |
||||
|
'iframe', |
||||
|
'li', |
||||
|
'map', |
||||
|
'object', |
||||
|
'ol', |
||||
|
'output', |
||||
|
'p', |
||||
|
'pre', |
||||
|
'progress', |
||||
|
'script', |
||||
|
'section', |
||||
|
'style', |
||||
|
'table', |
||||
|
'tbody', |
||||
|
'td', |
||||
|
'textarea', |
||||
|
'tfoot', |
||||
|
'th', |
||||
|
'tr', |
||||
|
'thead', |
||||
|
'ul', |
||||
|
'video' |
||||
|
]; |
@ -0,0 +1,172 @@ |
|||||
|
// List of valid url schemas, accorting to stmd spec
|
||||
|
// http://jgm.github.io/stmd/spec.html#autolinks
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
|
||||
|
module.exports = [ |
||||
|
'coap', |
||||
|
'doi', |
||||
|
'javascript', |
||||
|
'aaa', |
||||
|
'aaas', |
||||
|
'about', |
||||
|
'acap', |
||||
|
'cap', |
||||
|
'cid', |
||||
|
'crid', |
||||
|
'data', |
||||
|
'dav', |
||||
|
'dict', |
||||
|
'dns', |
||||
|
'file', |
||||
|
'ftp', |
||||
|
'geo', |
||||
|
'go', |
||||
|
'gopher', |
||||
|
'h323', |
||||
|
'http', |
||||
|
'https', |
||||
|
'iax', |
||||
|
'icap', |
||||
|
'im', |
||||
|
'imap', |
||||
|
'info', |
||||
|
'ipp', |
||||
|
'iris', |
||||
|
'iris.beep', |
||||
|
'iris.xpc', |
||||
|
'iris.xpcs', |
||||
|
'iris.lwz', |
||||
|
'ldap', |
||||
|
'mailto', |
||||
|
'mid', |
||||
|
'msrp', |
||||
|
'msrps', |
||||
|
'mtqp', |
||||
|
'mupdate', |
||||
|
'news', |
||||
|
'nfs', |
||||
|
'ni', |
||||
|
'nih', |
||||
|
'nntp', |
||||
|
'opaquelocktoken', |
||||
|
'pop', |
||||
|
'pres', |
||||
|
'rtsp', |
||||
|
'service', |
||||
|
'session', |
||||
|
'shttp', |
||||
|
'sieve', |
||||
|
'sip', |
||||
|
'sips', |
||||
|
'sms', |
||||
|
'snmp', |
||||
|
'soap.beep', |
||||
|
'soap.beeps', |
||||
|
'tag', |
||||
|
'tel', |
||||
|
'telnet', |
||||
|
'tftp', |
||||
|
'thismessage', |
||||
|
'tn3270', |
||||
|
'tip', |
||||
|
'tv', |
||||
|
'urn', |
||||
|
'vemmi', |
||||
|
'ws', |
||||
|
'wss', |
||||
|
'xcon', |
||||
|
'xcon-userid', |
||||
|
'xmlrpc.beep', |
||||
|
'xmlrpc.beeps', |
||||
|
'xmpp', |
||||
|
'z39.50r', |
||||
|
'z39.50s', |
||||
|
'adiumxtra', |
||||
|
'afp', |
||||
|
'afs', |
||||
|
'aim', |
||||
|
'apt', |
||||
|
'attachment', |
||||
|
'aw', |
||||
|
'beshare', |
||||
|
'bitcoin', |
||||
|
'bolo', |
||||
|
'callto', |
||||
|
'chrome', |
||||
|
'chrome-extension', |
||||
|
'com-eventbrite-attendee', |
||||
|
'content', |
||||
|
'cvs', |
||||
|
'dlna-playsingle', |
||||
|
'dlna-playcontainer', |
||||
|
'dtn', |
||||
|
'dvb', |
||||
|
'ed2k', |
||||
|
'facetime', |
||||
|
'feed', |
||||
|
'finger', |
||||
|
'fish', |
||||
|
'gg', |
||||
|
'git', |
||||
|
'gizmoproject', |
||||
|
'gtalk', |
||||
|
'hcp', |
||||
|
'icon', |
||||
|
'ipn', |
||||
|
'irc', |
||||
|
'irc6', |
||||
|
'ircs', |
||||
|
'itms', |
||||
|
'jar', |
||||
|
'jms', |
||||
|
'keyparc', |
||||
|
'lastfm', |
||||
|
'ldaps', |
||||
|
'magnet', |
||||
|
'maps', |
||||
|
'market', |
||||
|
'message', |
||||
|
'mms', |
||||
|
'ms-help', |
||||
|
'msnim', |
||||
|
'mumble', |
||||
|
'mvn', |
||||
|
'notes', |
||||
|
'oid', |
||||
|
'palm', |
||||
|
'paparazzi', |
||||
|
'platform', |
||||
|
'proxy', |
||||
|
'psyc', |
||||
|
'query', |
||||
|
'res', |
||||
|
'resource', |
||||
|
'rmi', |
||||
|
'rsync', |
||||
|
'rtmp', |
||||
|
'secondlife', |
||||
|
'sftp', |
||||
|
'sgn', |
||||
|
'skype', |
||||
|
'smb', |
||||
|
'soldat', |
||||
|
'spotify', |
||||
|
'ssh', |
||||
|
'steam', |
||||
|
'svn', |
||||
|
'teamspeak', |
||||
|
'things', |
||||
|
'udp', |
||||
|
'unreal', |
||||
|
'ut2004', |
||||
|
'ventrilo', |
||||
|
'view-source', |
||||
|
'webcal', |
||||
|
'wtai', |
||||
|
'wyciwyg', |
||||
|
'xfire', |
||||
|
'xri', |
||||
|
'ymsgr' |
||||
|
]; |
@ -0,0 +1,75 @@ |
|||||
|
// HTML block
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
|
||||
|
var isEmpty = require('../helpers').isEmpty; |
||||
|
var getLines = require('../helpers').getLines; |
||||
|
|
||||
|
var block_names = require('../common/html_blocks'); |
||||
|
|
||||
|
|
||||
|
var HTML_TAG_OPEN_RE = /^<([a-zA-Z]{1,15})[\s\/>]/; |
||||
|
var HTML_TAG_CLOSE_RE = /^<\/([a-zA-Z]{1,15})[\s>]/; |
||||
|
|
||||
|
function isLetter(ch) { |
||||
|
/*eslint no-bitwise:0*/ |
||||
|
var lc = ch | 0x20; // to lower case
|
||||
|
return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */); |
||||
|
} |
||||
|
|
||||
|
module.exports = function htmlblock(state, startLine, endLine, silent) { |
||||
|
var ch, match, nextLine, |
||||
|
pos = state.bMarks[startLine], |
||||
|
max = state.eMarks[startLine], |
||||
|
shift = state.tShift[startLine]; |
||||
|
|
||||
|
pos += shift; |
||||
|
|
||||
|
if (!state.options.html) { return false; } |
||||
|
|
||||
|
if (shift > 3 || pos + 2 >= max || state.blkLevel > 0) { return false; } |
||||
|
|
||||
|
if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; } |
||||
|
|
||||
|
ch = state.src.charCodeAt(pos + 1); |
||||
|
|
||||
|
if (ch === 0x21/* ! */ || ch === 0x3F/* ? */) { |
||||
|
// Directive start / comment start / processing instruction start
|
||||
|
if (silent) { return true; } |
||||
|
|
||||
|
} else if (ch === 0x2F/* / */ || isLetter(ch)) { |
||||
|
|
||||
|
// Probably start or end of tag
|
||||
|
if (ch === 0x2F/* \ */) { |
||||
|
// closing tag
|
||||
|
match = state.src.slice(pos, max).match(HTML_TAG_CLOSE_RE); |
||||
|
if (!match) { return false; } |
||||
|
} else { |
||||
|
// opening tag
|
||||
|
match = state.src.slice(pos, max).match(HTML_TAG_OPEN_RE); |
||||
|
if (!match) { return false; } |
||||
|
} |
||||
|
// Make sure tag name is valid
|
||||
|
if (block_names.indexOf(match[1]) < 0) { return false; } |
||||
|
if (silent) { return true; } |
||||
|
|
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// If we are here - we detected HTML block.
|
||||
|
// Let's roll down till empty line (block end).
|
||||
|
nextLine = startLine + 1; |
||||
|
while (nextLine < state.lineMax && !isEmpty(state, nextLine)) { |
||||
|
nextLine++; |
||||
|
} |
||||
|
|
||||
|
state.tokens.push({ |
||||
|
type: 'html', |
||||
|
content: getLines(state, startLine, nextLine, 0, true) |
||||
|
}); |
||||
|
|
||||
|
state.line = nextLine; |
||||
|
return true; |
||||
|
}; |
Loading…
Reference in new issue