FEATURE: consistent bbcode inline and block rulers

This commit is contained in:
Sam 2017-06-23 11:36:45 -04:00
parent 234694b50f
commit 05e5a740a6
3 changed files with 76 additions and 20 deletions

View File

@ -26,11 +26,11 @@ function createHelper(featureName, opts, optionCallbacks, pluginCallbacks, getOp
// hack to allow moving of getOptions
helper.getOptions = () => getOptions.f();
helper.registerOptions = function(callback){
helper.registerOptions = (callback) => {
optionCallbacks.push([featureName, callback]);
};
helper.registerPlugin = function(callback){
helper.registerPlugin = (callback) => {
pluginCallbacks.push([featureName, callback]);
};
@ -57,6 +57,10 @@ function setupBlockBBCode(md) {
md.block.bbcode_ruler = new Ruler();
}
function setupInlineBBCode(md) {
md.inline.bbcode_ruler = new Ruler();
}
export function setup(opts, siteSettings, state) {
if (opts.setup) {
return;
@ -117,6 +121,7 @@ export function setup(opts, siteSettings, state) {
});
setupBlockBBCode(opts.engine);
setupInlineBBCode(opts.engine);
pluginCallbacks.forEach(([feature, callback])=>{
if (opts.discourse.features[feature]) {

View File

@ -46,7 +46,7 @@ export function parseBBCodeTag(src, start, max) {
}
if (closed) {
length = i;
length = (i-start)+1;
let raw = src.slice(start+tag.length+1, i);
@ -168,14 +168,35 @@ function applyBBCode(state, startLine, endLine, silent, md) {
// this will prevent lazy continuations from ever going past our end marker
state.lineMax = nextLine;
if (rule.before) {
rule.before.call(this, state, info.attrs, md, state.src.slice(initial, initial + info.length + 1));
}
let wrapTag;
if (rule.wrap) {
let split = rule.wrap.split('.');
wrapTag = split[0];
let className = split.slice(1).join(' ');
let token = state.push('wrap_bbcode', wrapTag, 1);
if (className) {
token.attrs = [['class', className]];
}
}
let lastToken = state.tokens[state.tokens.length-1];
lastToken.map = [ startLine, nextLine ];
state.md.block.tokenize(state, startLine + 1, nextLine);
if (rule.wrap) {
state.push('wrap_bbcode', wrapTag, -1);
}
if (rule.after) {
rule.after.call(this, state, lastToken, md);
}
lastToken = state.tokens[state.tokens.length-1];
@ -187,8 +208,6 @@ function applyBBCode(state, startLine, endLine, silent, md) {
return true;
}
export function setup(helper) {
if (!helper.markdownIt) { return; }

View File

@ -1,13 +1,6 @@
import { parseBBCodeTag } from 'pretty-text/engines/markdown-it/bbcode-block';
const rules = {
'b': {tag: 'span', 'class': 'bbcode-b'},
'i': {tag: 'span', 'class': 'bbcode-i'},
'u': {tag: 'span', 'class': 'bbcode-u'},
's': {tag: 'span', 'class': 'bbcode-s'}
};
function tokanizeBBCode(state, silent) {
function tokanizeBBCode(state, silent, ruler) {
let pos = state.pos;
@ -22,7 +15,17 @@ function tokanizeBBCode(state, silent) {
return false;
}
const rule = rules[tagInfo.tag];
let rules = ruler.getRules();
let rule;
for (let i=0; i<rules.length; i++) {
let r = rules[i].rule;
if (r.tag === tagInfo.tag) {
rule = r;
break;
}
}
if (!rule) {
return false;
}
@ -74,17 +77,24 @@ function processBBCode(state, silent) {
endDelim = delimiters[startDelim.end];
let split = tagInfo.rule.wrap.split('.');
let tag = split[0];
let className = split.slice(1).join(' ');
token = state.tokens[startDelim.token];
token.type = 'bbcode_' + tagInfo.tag + '_open';
token.attrs = [['class', tagInfo.rule['class']]];
token.tag = tagInfo.rule.tag;
token.tag = tag;
if (className) {
token.attrs = [['class', className]];
}
token.nesting = 1;
token.markup = token.content;
token.content = '';
token = state.tokens[endDelim.token];
token.type = 'bbcode_' + tagInfo.tag + '_close';
token.tag = tagInfo.rule.tag;
token.tag = tag;
token.nesting = -1;
token.markup = token.content;
token.content = '';
@ -103,7 +113,29 @@ export function setup(helper) {
});
helper.registerPlugin(md => {
md.inline.ruler.push('bbcode-inline', tokanizeBBCode);
const ruler = md.inline.bbcode_ruler;
md.inline.ruler.push('bbcode-inline', (state,silent) => tokanizeBBCode(state,silent,ruler));
md.inline.ruler2.before('text_collapse', 'bbcode-inline', processBBCode);
ruler.push('bold', {
tag: 'b',
wrap: 'span.bbcode-b',
});
ruler.push('italic', {
tag: 'i',
wrap: 'span.bbcode-i'
});
ruler.push('underline', {
tag: 'u',
wrap: 'span.bbcode-u'
});
ruler.push('strike', {
tag: 's',
wrap: 'span.bbcode-s'
});
});
}