DEV: support multiple capture groups for text post process

This commit is contained in:
Sam 2017-07-20 15:33:36 -04:00
parent d7a20c8e93
commit 44fb2a2833
4 changed files with 39 additions and 14 deletions

View File

@ -1,6 +1,6 @@
function addHashtag(buffer, match, state) { function addHashtag(buffer, matches, state) {
const options = state.md.options.discourse; const options = state.md.options.discourse;
const slug = match.slice(1); const slug = matches[1];
const categoryHashtagLookup = options.categoryHashtagLookup; const categoryHashtagLookup = options.categoryHashtagLookup;
const result = categoryHashtagLookup && categoryHashtagLookup(slug); const result = categoryHashtagLookup && categoryHashtagLookup(slug);
@ -34,7 +34,7 @@ function addHashtag(buffer, match, state) {
buffer.push(token); buffer.push(token);
token = new state.Token('text', '', 0); token = new state.Token('text', '', 0);
token.content = match; token.content = matches[0];
buffer.push(token); buffer.push(token);
token = new state.Token('span_close', 'span', -1); token = new state.Token('span_close', 'span', -1);
@ -46,7 +46,7 @@ export function setup(helper) {
helper.registerPlugin(md=>{ helper.registerPlugin(md=>{
const rule = { const rule = {
matcher: /#[\w-:]{1,101}/, matcher: /#([\w-:]{1,101})/,
onMatch: addHashtag onMatch: addHashtag
}; };

View File

@ -1,5 +1,5 @@
function addMention(buffer, match, state) { function addMention(buffer, matches, state) {
let username = match.slice(1); let username = matches[1] || matches[2];
let mentionLookup = state.md.options.discourse.mentionLookup; let mentionLookup = state.md.options.discourse.mentionLookup;
let getURL = state.md.options.discourse.getURL; let getURL = state.md.options.discourse.getURL;
@ -39,7 +39,7 @@ export function setup(helper) {
helper.registerPlugin(md => { helper.registerPlugin(md => {
const rule = { const rule = {
matcher: /@\w[\w.-]{0,58}\w|@\w/, matcher: /@(\w[\w.-]{0,58}\w)|@(\w)/,
onMatch: addMention onMatch: addMention
}; };

View File

@ -12,18 +12,45 @@ export class TextPostProcessRuler {
getMatcher() { getMatcher() {
if (this.matcher) { return this.matcher; } if (this.matcher) { return this.matcher; }
this.matcher = new RegExp(this.rules.map((r) => this.matcherIndex = [];
"(" + r.rule.matcher.toString().slice(1,-1) + ")"
).join('|'), 'g');
let rules = this.rules.map((r) =>
"(" + r.rule.matcher.toString().slice(1,-1) + ")"
);
let i;
let regexString = "";
let last = 1;
// this code is a bit tricky, our matcher may have multiple capture groups
// we want to dynamically determine how many
for(i=0; i<rules.length; i++) {
this.matcherIndex[i] = last;
if (i === rules.length-1) {
break;
}
if (i>0) {
regexString = regexString + '|';
}
regexString = regexString + rules[i];
let regex = new RegExp(regexString + '|(x)');
last = 'x'.match(regex).length - 1;
}
this.matcher = new RegExp(rules.join('|'), 'g');
return this.matcher; return this.matcher;
} }
applyRule(buffer, match, state) { applyRule(buffer, match, state) {
let i; let i;
for(i=0; i<this.rules.length; i++) { for(i=0; i<this.rules.length; i++) {
if (match[i+1]) { let index = this.matcherIndex[i];
this.rules[i].rule.onMatch(buffer, match[i+1], state);
if (match[index]) {
this.rules[i].rule.onMatch(buffer, match.slice(index, this.matcherIndex[i+1]), state);
break; break;
} }
} }

View File

@ -951,6 +951,4 @@ HTML
expect(cooked).to eq(html.strip) expect(cooked).to eq(html.strip)
end end
end end
end end