61 lines
1.5 KiB
JavaScript
61 lines
1.5 KiB
JavaScript
// add image to array if src has an upload
|
|
function addImage(images, token) {
|
|
if (token.attrs) {
|
|
for(let i=0; i<token.attrs.length; i++) {
|
|
if (token.attrs[i][1].indexOf('upload://') === 0) {
|
|
images.push([token, i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function rule(state) {
|
|
|
|
let images = [];
|
|
|
|
for (let i = 0; i < state.tokens.length; i++) {
|
|
let blockToken = state.tokens[i];
|
|
|
|
if (blockToken.tag === 'img') {
|
|
addImage(images, blockToken);
|
|
}
|
|
|
|
if (!blockToken.children) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < blockToken.children.length; j++) {
|
|
let token = blockToken.children[j];
|
|
if (token.tag === 'img') {
|
|
addImage(images, token);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (images.length > 0) {
|
|
let srcList = images.map(([token, srcIndex]) => token.attrs[srcIndex][1]);
|
|
let lookup = state.md.options.discourse.lookupImageUrls;
|
|
let longUrls = (lookup && lookup(srcList)) || {};
|
|
|
|
images.forEach(([token, srcIndex]) => {
|
|
let origSrc = token.attrs[srcIndex][1];
|
|
let mapped = longUrls[origSrc];
|
|
if (mapped) {
|
|
token.attrs[srcIndex][1] = mapped;
|
|
} else {
|
|
token.attrs[srcIndex][1] = state.md.options.discourse.getURL('/images/transparent.png');
|
|
token.attrs.push(['data-orig-src', origSrc]);
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
export function setup(helper) {
|
|
helper.whiteList(['img[data-orig-src]']);
|
|
helper.registerPlugin(md => {
|
|
md.core.ruler.push('image-protocol', rule);
|
|
});
|
|
}
|