You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.8 KiB
79 lines
1.8 KiB
9 years ago
|
/*! Licensed under MIT, https://github.com/sofish/pen */
|
||
|
(function(root) {
|
||
|
|
||
|
// only works with Pen
|
||
|
if(!root.Pen) return;
|
||
|
|
||
|
// markdown covertor obj
|
||
|
var covertor = {
|
||
|
keymap: { '96': '`', '62': '>', '49': '1', '46': '.', '45': '-', '42': '*', '35': '#'},
|
||
|
stack : []
|
||
|
};
|
||
|
|
||
|
// return valid markdown syntax
|
||
|
covertor.valid = function(str) {
|
||
|
var len = str.length;
|
||
|
|
||
|
if(str.match(/[#]{1,6}/)) {
|
||
|
return ['h' + len, len];
|
||
|
} else if(str === '```') {
|
||
|
return ['pre', len];
|
||
|
} else if(str === '>') {
|
||
|
return ['blockquote', len];
|
||
|
} else if(str === '1.') {
|
||
|
return ['insertorderedlist', len];
|
||
|
} else if(str === '-' || str === '*') {
|
||
|
return ['insertunorderedlist', len];
|
||
|
} else if(str.match(/(?:\.|\*|\-){3,}/)) {
|
||
|
return ['inserthorizontalrule', len];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// parse command
|
||
|
covertor.parse = function(e) {
|
||
|
var code = e.keyCode || e.which;
|
||
|
|
||
|
// when `space` is pressed
|
||
|
if (code === 32) {
|
||
|
var markdownSyntax = this.stack.join('');
|
||
|
// reset stack
|
||
|
this.stack = [];
|
||
|
|
||
|
var cmd = this.valid(markdownSyntax);
|
||
|
if (cmd) {
|
||
|
// prevents leading space after executing command
|
||
|
e.preventDefault();
|
||
|
return cmd;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// make cmd
|
||
|
if(this.keymap[code]) this.stack.push(this.keymap[code]);
|
||
|
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
// exec command
|
||
|
covertor.action = function(pen, cmd) {
|
||
|
|
||
|
// only apply effect at line start
|
||
|
if(pen.selection.focusOffset > cmd[1]) return;
|
||
|
|
||
|
var node = pen.selection.focusNode;
|
||
|
node.textContent = node.textContent.slice(cmd[1]);
|
||
|
pen.execCommand(cmd[0]);
|
||
|
};
|
||
|
|
||
|
// init covertor
|
||
|
covertor.init = function(pen) {
|
||
|
pen.on('keypress', function(e) {
|
||
|
var cmd = covertor.parse(e);
|
||
|
if(cmd) return covertor.action(pen, cmd);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// append to Pen
|
||
|
root.Pen.prototype.markdown = covertor;
|
||
|
|
||
|
}(window));
|