markdown style links i.e. [label](http://link)

merge-requests/218/head
Thomas Lynch 4 years ago
parent 1430c8173d
commit 7eb3f4589d
  1. 39
      helpers/posting/linkmatch.js
  2. 6
      helpers/posting/markdown.js

@ -2,24 +2,29 @@
const parenPairRegex = /\((?:[^)(]+|\((?:[^)(]+|\([^)(]\))*\))*\)/g const parenPairRegex = /\((?:[^)(]+|\((?:[^)(]+|\([^)(]\))*\))*\)/g
module.exports = (match) => { module.exports = (match, label, url, urlOnly) => {
let trimmedMatch; let trimmedMatch;
let excess = ''; let excess = '';
const parensPairs = match.match(parenPairRegex); if (urlOnly) {
//naive solution to conflict with detected markdown const parensPairs = match.match(parenPairRegex);
if (parensPairs) { //naive solution to conflict with detected markdown
const lastMatch = parensPairs[parensPairs.length-1]; if (parensPairs) {
const lastIndex = match.lastIndexOf(lastMatch); const lastMatch = parensPairs[parensPairs.length-1];
trimmedMatch = match.substring(0, lastIndex+lastMatch.length); const lastIndex = match.lastIndexOf(lastMatch);
excess = match.substring(lastIndex+lastMatch.length); trimmedMatch = match.substring(0, lastIndex+lastMatch.length);
} else if (match.indexOf(')') !== -1){ excess = match.substring(lastIndex+lastMatch.length);
trimmedMatch = match.substring(0, match.indexOf(')')); } else if (match.indexOf(')') !== -1){
excess = match.substring(match.indexOf(')')); trimmedMatch = match.substring(0, match.indexOf(')'));
} else { excess = match.substring(match.indexOf(')'));
trimmedMatch = match; } else {
trimmedMatch = match;
}
trimmedMatch = trimmedMatch
.replace(/\(/g, '%28')
.replace(/\)/g, '%29');
} }
trimmedMatch = trimmedMatch let href = url || trimmedMatch
.replace(/\(/g, '%28') const aLabel = label || trimmedMatch;
.replace(/\)/g, '%29'); //TODO: if the link domain is one of the site domains, remove the domain and make it an absolute link, for users on different domains or anonymizers
return `<a rel='nofollow' referrerpolicy='same-origin' target='_blank' href='${trimmedMatch}'>${trimmedMatch}</a>${excess}`; return `<a rel='nofollow' referrerpolicy='same-origin' target='_blank' href='${href}'>${aLabel}</a>${excess}`;
}; };

@ -10,16 +10,16 @@ const greentextRegex = /^&gt;((?!&gt;\d+|&gt;&gt;&#x2F;\w+(&#x2F;\d*)?|&gt;&gt;#
, italicRegex = /\*\*(.+?)\*\*/gm , italicRegex = /\*\*(.+?)\*\*/gm
, spoilerRegex = /\|\|([\s\S]+?)\|\|/gm , spoilerRegex = /\|\|([\s\S]+?)\|\|/gm
, detectedRegex = /(\(\(\(.+?\)\)\))/gm , detectedRegex = /(\(\(\(.+?\)\)\))/gm
, linkRegex = /https?\:&#x2F;&#x2F;[^\s<>\[\]{}|\\^]+/g , linkRegex = /\[([^\[][^\]]*?)\]\((https?\:&#x2F;&#x2F;[^\s<>\[\]{}|\\^)]+)\)|(https\:&#x2F;&#x2F;[^\s<>\[\]{}|\\^]+)/g
, codeRegex = /(?:(?<language>[a-z+]{1,10})\r?\n)?(?<code>[\s\S]+)/i , codeRegex = /(?:(?<language>[a-z+]{1,10})\r?\n)?(?<code>[\s\S]+)/i
, includeSplitRegex = /(\[code\][\s\S]+?\[\/code\])/gm , includeSplitRegex = /(\[code\][\s\S]+?\[\/code\])/gm
, splitRegex = /\[code\]([\s\S]+?)\[\/code\]/gm , splitRegex = /\[code\]([\s\S]+?)\[\/code\]/gm
, trimNewlineRegex = /^\s*(\r?\n)*|(\r?\n)*$/g , trimNewlineRegex = /^\s*(\r?\n)*|(\r?\n)*$/g
, getDomain = (string) => string.split(/\/\/|\//)[1] //unused atm
, escape = require(__dirname+'/escape.js') , escape = require(__dirname+'/escape.js')
, { highlight, highlightAuto } = require('highlight.js') , { highlight, highlightAuto } = require('highlight.js')
, { highlightOptions } = require(__dirname+'/../../configs/main.js') , { highlightOptions } = require(__dirname+'/../../configs/main.js')
, diceroll = require(__dirname+'/diceroll.js') , diceroll = require(__dirname+'/diceroll.js')
, linkmatch = require(__dirname+'/linkmatch.js')
, replacements = [ , replacements = [
{ regex: pinktextRegex, cb: (match, pinktext) => `<span class='pinktext'>&lt;${pinktext}</span>` }, { regex: pinktextRegex, cb: (match, pinktext) => `<span class='pinktext'>&lt;${pinktext}</span>` },
{ regex: greentextRegex, cb: (match, greentext) => `<span class='greentext'>&gt;${greentext}</span>` }, { regex: greentextRegex, cb: (match, greentext) => `<span class='greentext'>&gt;${greentext}</span>` },
@ -30,7 +30,7 @@ const greentextRegex = /^&gt;((?!&gt;\d+|&gt;&gt;&#x2F;\w+(&#x2F;\d*)?|&gt;&gt;#
{ regex: italicRegex, cb: (match, italic) => `<span class='em'>${italic}</span>` }, { regex: italicRegex, cb: (match, italic) => `<span class='em'>${italic}</span>` },
{ regex: spoilerRegex, cb: (match, spoiler) => `<span class='spoiler'>${spoiler}</span>` }, { regex: spoilerRegex, cb: (match, spoiler) => `<span class='spoiler'>${spoiler}</span>` },
{ regex: monoRegex, cb: (match, mono) => `<span class='mono'>${mono}</span>` }, { regex: monoRegex, cb: (match, mono) => `<span class='mono'>${mono}</span>` },
{ regex: linkRegex, cb: require(__dirname+'/linkmatch.js') }, { regex: linkRegex, cb: linkmatch },
{ regex: detectedRegex, cb: (match, detected) => `<span class='detected'>${detected}</span>` }, { regex: detectedRegex, cb: (match, detected) => `<span class='detected'>${detected}</span>` },
{ regex: diceroll.regexMarkdown, cb: diceroll.markdown }, { regex: diceroll.regexMarkdown, cb: diceroll.markdown },
]; ];

Loading…
Cancel
Save