FEATURE: consistent bbcode inline and block rulers
This commit is contained in:
parent
234694b50f
commit
05e5a740a6
|
@ -26,11 +26,11 @@ function createHelper(featureName, opts, optionCallbacks, pluginCallbacks, getOp
|
||||||
// hack to allow moving of getOptions
|
// hack to allow moving of getOptions
|
||||||
helper.getOptions = () => getOptions.f();
|
helper.getOptions = () => getOptions.f();
|
||||||
|
|
||||||
helper.registerOptions = function(callback){
|
helper.registerOptions = (callback) => {
|
||||||
optionCallbacks.push([featureName, callback]);
|
optionCallbacks.push([featureName, callback]);
|
||||||
};
|
};
|
||||||
|
|
||||||
helper.registerPlugin = function(callback){
|
helper.registerPlugin = (callback) => {
|
||||||
pluginCallbacks.push([featureName, callback]);
|
pluginCallbacks.push([featureName, callback]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,6 +57,10 @@ function setupBlockBBCode(md) {
|
||||||
md.block.bbcode_ruler = new Ruler();
|
md.block.bbcode_ruler = new Ruler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupInlineBBCode(md) {
|
||||||
|
md.inline.bbcode_ruler = new Ruler();
|
||||||
|
}
|
||||||
|
|
||||||
export function setup(opts, siteSettings, state) {
|
export function setup(opts, siteSettings, state) {
|
||||||
if (opts.setup) {
|
if (opts.setup) {
|
||||||
return;
|
return;
|
||||||
|
@ -117,6 +121,7 @@ export function setup(opts, siteSettings, state) {
|
||||||
});
|
});
|
||||||
|
|
||||||
setupBlockBBCode(opts.engine);
|
setupBlockBBCode(opts.engine);
|
||||||
|
setupInlineBBCode(opts.engine);
|
||||||
|
|
||||||
pluginCallbacks.forEach(([feature, callback])=>{
|
pluginCallbacks.forEach(([feature, callback])=>{
|
||||||
if (opts.discourse.features[feature]) {
|
if (opts.discourse.features[feature]) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ export function parseBBCodeTag(src, start, max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (closed) {
|
if (closed) {
|
||||||
length = i;
|
length = (i-start)+1;
|
||||||
|
|
||||||
let raw = src.slice(start+tag.length+1, i);
|
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
|
// this will prevent lazy continuations from ever going past our end marker
|
||||||
state.lineMax = nextLine;
|
state.lineMax = nextLine;
|
||||||
|
|
||||||
|
if (rule.before) {
|
||||||
rule.before.call(this, state, info.attrs, md, state.src.slice(initial, initial + info.length + 1));
|
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];
|
let lastToken = state.tokens[state.tokens.length-1];
|
||||||
lastToken.map = [ startLine, nextLine ];
|
lastToken.map = [ startLine, nextLine ];
|
||||||
|
|
||||||
state.md.block.tokenize(state, startLine + 1, 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);
|
rule.after.call(this, state, lastToken, md);
|
||||||
|
}
|
||||||
|
|
||||||
lastToken = state.tokens[state.tokens.length-1];
|
lastToken = state.tokens[state.tokens.length-1];
|
||||||
|
|
||||||
|
@ -187,8 +208,6 @@ function applyBBCode(state, startLine, endLine, silent, md) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function setup(helper) {
|
export function setup(helper) {
|
||||||
if (!helper.markdownIt) { return; }
|
if (!helper.markdownIt) { return; }
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,6 @@
|
||||||
import { parseBBCodeTag } from 'pretty-text/engines/markdown-it/bbcode-block';
|
import { parseBBCodeTag } from 'pretty-text/engines/markdown-it/bbcode-block';
|
||||||
|
|
||||||
const rules = {
|
function tokanizeBBCode(state, silent, ruler) {
|
||||||
'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) {
|
|
||||||
|
|
||||||
let pos = state.pos;
|
let pos = state.pos;
|
||||||
|
|
||||||
|
@ -22,7 +15,17 @@ function tokanizeBBCode(state, silent) {
|
||||||
return false;
|
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) {
|
if (!rule) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -74,17 +77,24 @@ function processBBCode(state, silent) {
|
||||||
|
|
||||||
endDelim = delimiters[startDelim.end];
|
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 = state.tokens[startDelim.token];
|
||||||
|
|
||||||
token.type = 'bbcode_' + tagInfo.tag + '_open';
|
token.type = 'bbcode_' + tagInfo.tag + '_open';
|
||||||
token.attrs = [['class', tagInfo.rule['class']]];
|
token.tag = tag;
|
||||||
token.tag = tagInfo.rule.tag;
|
if (className) {
|
||||||
|
token.attrs = [['class', className]];
|
||||||
|
}
|
||||||
token.nesting = 1;
|
token.nesting = 1;
|
||||||
token.markup = token.content;
|
token.markup = token.content;
|
||||||
token.content = '';
|
token.content = '';
|
||||||
|
|
||||||
token = state.tokens[endDelim.token];
|
token = state.tokens[endDelim.token];
|
||||||
token.type = 'bbcode_' + tagInfo.tag + '_close';
|
token.type = 'bbcode_' + tagInfo.tag + '_close';
|
||||||
token.tag = tagInfo.rule.tag;
|
token.tag = tag;
|
||||||
token.nesting = -1;
|
token.nesting = -1;
|
||||||
token.markup = token.content;
|
token.markup = token.content;
|
||||||
token.content = '';
|
token.content = '';
|
||||||
|
@ -103,7 +113,29 @@ export function setup(helper) {
|
||||||
});
|
});
|
||||||
|
|
||||||
helper.registerPlugin(md => {
|
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);
|
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'
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue