mirror of
https://github.com/tdurieux/anonymous_github.git
synced 2026-10-19 06:07:21 +02:00
fix: improve link rendering
This commit is contained in:
1 parent
c3a890dac7
commit
f30110c567
3 files changed
+34
-23
No files matched your search
@@ -237,7 +237,7 @@ angular
|
||||
},
|
||||
link: function (scope, elem, attrs) {
|
||||
function update() {
|
||||
elem.html(renderMD(scope.content, $location.url()));
|
||||
elem.html(renderMD(scope.content, $location.url() + "/../"));
|
||||
}
|
||||
scope.$watch(attrs.terms, update);
|
||||
scope.$watch("terms", update);
|
||||
@@ -1073,7 +1073,6 @@ angular
|
||||
$scope.$watch("anonymize", () => {
|
||||
$scope.anonymize.repoId.$$element[0].disabled = true;
|
||||
$scope.anonymize.repoUrl.$$element[0].disabled = true;
|
||||
$scope.anonymize.repositories.$$element[0].disabled = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -1301,7 +1300,6 @@ angular
|
||||
continue;
|
||||
}
|
||||
// remove whole url if it contains the term
|
||||
|
||||
content = content.replace(urlRegex, (match) => {
|
||||
if (new RegExp(`\\b${term}\\b`, "gi").test(match))
|
||||
return $scope.site_options.ANONYMIZATION_MASK + "-" + (i + 1);
|
||||
@@ -1316,7 +1314,11 @@ angular
|
||||
}
|
||||
|
||||
$scope.anonymize_readme = content;
|
||||
const html = renderMD($scope.anonymize_readme, $location.url());
|
||||
const o = parseGithubUrl($scope.repoUrl);
|
||||
const html = renderMD(
|
||||
$scope.anonymize_readme,
|
||||
`https://github.com/${o.owner}/${o.repo}/raw/${$scope.source.branch}/`
|
||||
);
|
||||
$scope.html_readme = $sce.trustAsHtml(html);
|
||||
setTimeout(Prism.highlightAll, 150);
|
||||
}
|
||||
@@ -1663,7 +1665,7 @@ angular
|
||||
|
||||
if ($scope.type == "md") {
|
||||
$scope.content = $sce.trustAsHtml(
|
||||
renderMD(res.data, $location.url())
|
||||
renderMD(res.data, $location.url() + "/../")
|
||||
);
|
||||
$scope.type = "html";
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -6,4 +6,4 @@ ${e}</blockquote>
|
||||
`}table(e,t){return"<table>\n<thead>\n"+e+"</thead>\n"+(t=t&&`<tbody>${t}</tbody>`)+"</table>\n"}tablerow(e){return`<tr>
|
||||
${e}</tr>
|
||||
`}tablecell(e,t){var i=t.header?"th":"td";return(t.align?`<${i} align="${t.align}">`:`<${i}>`)+e+`</${i}>
|
||||
`}strong(e){return`<strong>${e}</strong>`}em(e){return`<em>${e}</em>`}codespan(e){return`<code>${e}</code>`}br(){return"<br>"}del(e){return`<del>${e}</del>`}link(e,t,i){var n=c(e);if(null===n)return i;let s='<a href="'+(e=n)+'"';return t&&(s+=' title="'+t+'"'),s+=">"+i+"</a>"}image(e,t,i){var n=c(e);if(null===n)return i;let s=`<img src="${e=n}" alt="${i}"`;return t&&(s+=` title="${t}"`),s+=">"}text(e){return e}}class R{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,i){return""+i}image(e,t,i){return""+i}br(){return""}}class L{options;renderer;textRenderer;constructor(e){this.options=e||t.defaults,this.options.renderer=this.options.renderer||new E,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new R}static parse(e,t){return new L(t).parse(e)}static parseInline(e,t){return new L(t).parseInline(e)}parse(n,s=!0){let o="";for(let i=0;i<n.length;i++){var r=n[i];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[r.type]){const n=r,s=this.options.extensions.renderers[n.type].call({parser:this},n);if(!1!==s||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(n.type)){o+=s||"";continue}}switch(r.type){case"space":continue;case"hr":o+=this.renderer.hr();continue;case"heading":{const n=r;o+=this.renderer.heading(this.parseInline(n.tokens),n.depth,this.parseInline(n.tokens,this.textRenderer).replace(F,(e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""));continue}case"code":{const n=r;o+=this.renderer.code(n.text,n.lang,!!n.escaped);continue}case"table":{const n=r;let e="",t="";for(let e=0;e<n.header.length;e++)t+=this.renderer.tablecell(this.parseInline(n.header[e].tokens),{header:!0,align:n.align[e]});e+=this.renderer.tablerow(t);let i="";for(let e=0;e<n.rows.length;e++){const o=n.rows[e];t="";for(let e=0;e<o.length;e++)t+=this.renderer.tablecell(this.parseInline(o[e].tokens),{header:!1,align:n.align[e]});i+=this.renderer.tablerow(t)}o+=this.renderer.table(e,i);continue}case"blockquote":{const n=r,s=this.parse(n.tokens);o+=this.renderer.blockquote(s);continue}case"list":{const n=r,s=n.ordered,e=n.start,a=n.loose;let i="";for(let t=0;t<n.items.length;t++){const o=n.items[t],c=o.checked,l=o.task;let e="";if(o.task){const n=this.renderer.checkbox(!!c);a?0<o.tokens.length&&"paragraph"===o.tokens[0].type?(o.tokens[0].text=n+" "+o.tokens[0].text,o.tokens[0].tokens&&0<o.tokens[0].tokens.length&&"text"===o.tokens[0].tokens[0].type&&(o.tokens[0].tokens[0].text=n+" "+o.tokens[0].tokens[0].text)):o.tokens.unshift({type:"text",text:n+" "}):e+=n+" "}e+=this.parse(o.tokens,a),i+=this.renderer.listitem(e,l,!!c)}o+=this.renderer.list(i,s,e);continue}case"html":{const n=r;o+=this.renderer.html(n.text,n.block);continue}case"paragraph":{const n=r;o+=this.renderer.paragraph(this.parseInline(n.tokens));continue}case"text":{let e=r,t=e.tokens?this.parseInline(e.tokens):e.text;for(;i+1<n.length&&"text"===n[i+1].type;)e=n[++i],t+="\n"+(e.tokens?this.parseInline(e.tokens):e.text);o+=s?this.renderer.paragraph(t):t;continue}default:{const n='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(n),"";throw new Error(n)}}}return o}parseInline(t,i){i=i||this.renderer;let n="";for(let e=0;e<t.length;e++){var s=t[e];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[s.type]){const t=this.options.extensions.renderers[s.type].call({parser:this},s);if(!1!==t||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(s.type)){n+=t||"";continue}}switch(s.type){case"escape":{const t=s;n+=i.text(t.text);break}case"html":{const t=s;n+=i.html(t.text);break}case"link":{const t=s;n+=i.link(t.href,t.title,this.parseInline(t.tokens,i));break}case"image":{const t=s;n+=i.image(t.href,t.title,t.text);break}case"strong":{const t=s;n+=i.strong(this.parseInline(t.tokens,i));break}case"em":{const t=s;n+=i.em(this.parseInline(t.tokens,i));break}case"codespan":{const t=s;n+=i.codespan(t.text);break}case"br":n+=i.br();break;case"del":{const t=s;n+=i.del(this.parseInline(t.tokens,i));break}case"text":{const t=s;n+=i.text(t.text);break}default:{const t='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(t),"";throw new Error(t)}}}return n}}class M{options;constructor(e){this.options=e||t.defaults}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}}class ce{defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};options=this.setOptions;parse=this.#e(T.lex,L.parse);parseInline=this.#e(T.lexInline,L.parseInline);Parser=L;Renderer=E;TextRenderer=RLine truncated
|
||||
`}strong(e){return`<strong>${e}</strong>`}em(e){return`<em>${e}</em>`}codespan(e){return`<code>${e}</code>`}br(){return"<br>"}del(e){return`<del>${e}</del>`}link(e,t,i){var n=c(e);if(null===n)return i;let s='<a href="'+(e=n)+'"';return t&&(s+=' title="'+t+'"'),s+=">"+i+"</a>"}image(e,t,i){var n=c(e);if(null===n)return i;let s=`<img src="${e=n}" alt="${i}"`;return t&&(s+=` title="${t}"`),s+=">"}text(e){return e}}class R{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,i){return""+i}image(e,t,i){return""+i}br(){return""}}class L{options;renderer;textRenderer;constructor(e){this.options=e||t.defaults,this.options.renderer=this.options.renderer||new E,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new R}static parse(e,t){return new L(t).parse(e)}static parseInline(e,t){return new L(t).parseInline(e)}parse(n,s=!0){let o="";for(let i=0;i<n.length;i++){var r=n[i];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[r.type]){const n=r,s=this.options.extensions.renderers[n.type].call({parser:this},n);if(!1!==s||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(n.type)){o+=s||"";continue}}switch(r.type){case"space":continue;case"hr":o+=this.renderer.hr();continue;case"heading":{const n=r;o+=this.renderer.heading(this.parseInline(n.tokens),n.depth,this.parseInline(n.tokens,this.textRenderer).replace(F,(e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""));continue}case"code":{const n=r;o+=this.renderer.code(n.text,n.lang,!!n.escaped);continue}case"table":{const n=r;let e="",t="";for(let e=0;e<n.header.length;e++)t+=this.renderer.tablecell(this.parseInline(n.header[e].tokens),{header:!0,align:n.align[e]});e+=this.renderer.tablerow(t);let i="";for(let e=0;e<n.rows.length;e++){const o=n.rows[e];t="";for(let e=0;e<o.length;e++)t+=this.renderer.tablecell(this.parseInline(o[e].tokens),{header:!1,align:n.align[e]});i+=this.renderer.tablerow(t)}o+=this.renderer.table(e,i);continue}case"blockquote":{const n=r,s=this.parse(n.tokens);o+=this.renderer.blockquote(s);continue}case"list":{const n=r,s=n.ordered,e=n.start,a=n.loose;let i="";for(let t=0;t<n.items.length;t++){const o=n.items[t],c=o.checked,l=o.task;let e="";if(o.task){const n=this.renderer.checkbox(!!c);a?0<o.tokens.length&&"paragraph"===o.tokens[0].type?(o.tokens[0].text=n+" "+o.tokens[0].text,o.tokens[0].tokens&&0<o.tokens[0].tokens.length&&"text"===o.tokens[0].tokens[0].type&&(o.tokens[0].tokens[0].text=n+" "+o.tokens[0].tokens[0].text)):o.tokens.unshift({type:"text",text:n+" "}):e+=n+" "}e+=this.parse(o.tokens,a),i+=this.renderer.listitem(e,l,!!c)}o+=this.renderer.list(i,s,e);continue}case"html":{const n=r;o+=this.renderer.html(n.text,n.block);continue}case"paragraph":{const n=r;o+=this.renderer.paragraph(this.parseInline(n.tokens));continue}case"text":{let e=r,t=e.tokens?this.parseInline(e.tokens):e.text;for(;i+1<n.length&&"text"===n[i+1].type;)e=n[++i],t+="\n"+(e.tokens?this.parseInline(e.tokens):e.text);o+=s?this.renderer.paragraph(t):t;continue}default:{const n='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(n),"";throw new Error(n)}}}return o}parseInline(t,i){i=i||this.renderer;let n="";for(let e=0;e<t.length;e++){var s=t[e];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[s.type]){const t=this.options.extensions.renderers[s.type].call({parser:this},s);if(!1!==t||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(s.type)){n+=t||"";continue}}switch(s.type){case"escape":{const t=s;n+=i.text(t.text);break}case"html":{const t=s;n+=i.html(t.text);break}case"link":{const t=s;n+=i.link(t.href,t.title,this.parseInline(t.tokens,i));break}case"image":{const t=s;n+=i.image(t.href,t.title,t.text);break}case"strong":{const t=s;n+=i.strong(this.parseInline(t.tokens,i));break}case"em":{const t=s;n+=i.em(this.parseInline(t.tokens,i));break}case"codespan":{const t=s;n+=i.codespan(t.text);break}case"br":n+=i.br();break;case"del":{const t=s;n+=i.del(this.parseInline(t.tokens,i));break}case"text":{const t=s;n+=i.text(t.text);break}default:{const t='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(t),"";throw new Error(t)}}}return n}}class M{options;constructor(e){this.options=e||t.defaults}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}}class ce{defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};options=this.setOptions;parse=this.#e(T.lex,L.parse);parseInline=this.#e(T.lexInline,L.parseInline);Parser=L;Renderer=E;TextRenderer=RLine truncated
|
||||
+26
-17
@@ -24,7 +24,10 @@ function humanFileSize(bytes, si = false, dp = 1) {
|
||||
return bytes.toFixed(dp) + "" + units[u];
|
||||
}
|
||||
|
||||
function urlRel2abs(url) {
|
||||
function urlRel2abs(
|
||||
url,
|
||||
baseUrl = location.href.match(/^(.+)\/?(?:#.+)?$/)[0] + "/"
|
||||
) {
|
||||
/* Only accept commonly trusted protocols:
|
||||
* Only data-image URLs are accepted, Exotic flavours (escaped slash,
|
||||
* html-entitied characters) are not supported to keep the function fast */
|
||||
@@ -33,17 +36,14 @@ function urlRel2abs(url) {
|
||||
) {
|
||||
return url; //Url is already absolute
|
||||
}
|
||||
var base_url = location.href.match(/^(.+)\/?(?:#.+)?$/)[0] + "/";
|
||||
|
||||
if (url.substring(0, 2) == "//") return location.protocol + url;
|
||||
else if (url.charAt(0) == "/")
|
||||
return location.protocol + "//" + location.host + url;
|
||||
else if (url.charAt(0) == "/") return baseUrl + url;
|
||||
else if (url.substring(0, 2) == "./") url = "." + url;
|
||||
else if (/^\s*$/.test(url)) return "";
|
||||
//Empty = Return nothing
|
||||
else url = "../" + url;
|
||||
|
||||
url = base_url + url;
|
||||
url = baseUrl + url;
|
||||
|
||||
while (/\/\.\.\//.test((url = url.replace(/[^\/]+\/+\.\.\//g, ""))));
|
||||
/* Escape certain characters to prevent XSS */
|
||||
@@ -61,13 +61,15 @@ function urlRel2abs(url) {
|
||||
const charactersAttributes = "[^-a-z0-9:._]";
|
||||
const allTagCharacters = "(?:[^>\"']*(?:\"[^\"]*\"|'[^']*'))*?[^>]*";
|
||||
|
||||
function by(match, group1, group2, group3) {
|
||||
/* Note that this function can also be used to remove links:
|
||||
* return group1 + "javascript://" + group3; */
|
||||
return group1 + urlRel2abs(group2) + group3;
|
||||
function by(baseUrl) {
|
||||
return (match, group1, group2, group3) => {
|
||||
/* Note that this function can also be used to remove links:
|
||||
* return group1 + "javascript://" + group3; */
|
||||
return group1 + urlRel2abs(group2, baseUrl) + group3;
|
||||
};
|
||||
}
|
||||
|
||||
function cr(html, selector, attribute) {
|
||||
function cr(html, selector, attribute, baseUrl) {
|
||||
if (typeof selector == "string") selector = new RegExp(selector, "gi");
|
||||
attribute = charactersAttributes + attribute;
|
||||
const marker = "\\s*=\\s*";
|
||||
@@ -79,12 +81,15 @@ function cr(html, selector, attribute) {
|
||||
"gi"
|
||||
);
|
||||
html = html.replace(selector, function (match) {
|
||||
return match.replace(re1, by).replace(re2, by).replace(re3, by);
|
||||
return match
|
||||
.replace(re1, by(baseUrl))
|
||||
.replace(re2, by(baseUrl))
|
||||
.replace(re3, by(baseUrl));
|
||||
});
|
||||
return html;
|
||||
}
|
||||
|
||||
function contentAbs2Relative(content) {
|
||||
function contentAbs2Relative(content, baseUrl) {
|
||||
if (!content) return content;
|
||||
content = cr(
|
||||
content,
|
||||
@@ -94,7 +99,8 @@ function contentAbs2Relative(content) {
|
||||
"href\\s*=" +
|
||||
allTagCharacters +
|
||||
">",
|
||||
"href"
|
||||
"href",
|
||||
baseUrl
|
||||
);
|
||||
content = cr(
|
||||
content,
|
||||
@@ -104,7 +110,8 @@ function contentAbs2Relative(content) {
|
||||
"src\\s*=" +
|
||||
allTagCharacters +
|
||||
">",
|
||||
"src"
|
||||
"src",
|
||||
baseUrl
|
||||
);
|
||||
return content;
|
||||
}
|
||||
@@ -143,7 +150,7 @@ function renderMD(md, baseUrlValue) {
|
||||
unicode: false,
|
||||
})
|
||||
);
|
||||
md = contentAbs2Relative(md);
|
||||
md = contentAbs2Relative(md, baseUrlValue);
|
||||
const renderer = new marked.Renderer();
|
||||
|
||||
const replacer = ((blockRegex, inlineRegex) => (text) => {
|
||||
@@ -210,6 +217,8 @@ function renderMD(md, baseUrlValue) {
|
||||
headerIds: false,
|
||||
katex: katex,
|
||||
});
|
||||
marked.use(baseUrl(baseUrlValue));
|
||||
if (baseUrlValue) {
|
||||
marked.use(baseUrl(baseUrlValue));
|
||||
}
|
||||
return marked.parse(md, { renderer });
|
||||
}
|
||||
Reference in new issue
Block a user