import React from 'react'; import ReactDOM from 'react-dom'; import { BasicInterceptor } from 'crowi-pluginkit'; class DetachCodeBlockUtil { static createReplaceStr(replaceId) { return `
${replaceId}`;
}
}
/**
* The interceptor that detach code blocks
*/
export class DetachCodeBlockInterceptor extends BasicInterceptor {
constructor(crowi) {
super();
this.crowi = crowi;
this.crowiForJquery = crowi.getCrowiForJquery();
}
/**
* @inheritdoc
*/
isInterceptWhen(contextName) {
return (
contextName === 'prePreProcess'
);
}
/**
* @inheritdoc
*/
process(contextName, ...args) {
const context = Object.assign(args[0]); // clone
const markdown = context.markdown;
const currentPagePath = context.currentPagePath;
context.dcbContextMap = {};
// see: https://regex101.com/r/8PAEcC/1
context.markdown = markdown.replace(/```(.|[\r\n])*?```/gm, (all) => {
// create ID
const replaceId = 'dcb-' + this.createRandomStr(8);
// register to context
let dcbContext = {};
dcbContext.content = all;
dcbContext.substituteContent = DetachCodeBlockUtil.createReplaceStr(replaceId);
context.dcbContextMap[replaceId] = dcbContext;
// return substituteContent
return dcbContext.substituteContent;
});
// resolve
return Promise.resolve(context);
}
/**
* @see http://qiita.com/ryounagaoka/items/4736c225bdd86a74d59c
*
* @param {number} length
* @return random strings
*/
createRandomStr(length) {
const bag = "abcdefghijklmnopqrstuvwxyz0123456789";
let generated = "";
for (var i = 0; i < length; i++) {
generated += bag[Math.floor(Math.random() * bag.length)];
}
return generated;
}
}
/**
* The interceptor that restore detached code blocks
*/
export class RestoreCodeBlockInterceptor extends BasicInterceptor {
constructor(crowi) {
super();
this.crowi = crowi;
this.crowiForJquery = crowi.getCrowiForJquery();
}
/**
* @inheritdoc
*/
isInterceptWhen(contextName) {
return (
contextName === 'postPreProcess'
);
}
/**
* @inheritdoc
*/
process(contextName, ...args) {
const context = Object.assign(args[0]); // clone
// forEach keys of dcbContextMap
Object.keys(context.dcbContextMap).forEach((replaceId) => {
// get context object from context
let dcbContext = context.dcbContextMap[replaceId];
context.markdown = context.markdown.replace(dcbContext.substituteContent, dcbContext.content);
});
// resolve
return Promise.resolve(context);
}
}