From e07b2f1f50f9c7b7d20762eee36d181c0846d542 Mon Sep 17 00:00:00 2001 From: Aaron Chong Date: Sun, 7 Jan 2018 18:32:02 +0800 Subject: [PATCH 1/2] Improve generation of radio-group id --- lib/markdown-it/markdown-it-radio-button.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/markdown-it/markdown-it-radio-button.js b/lib/markdown-it/markdown-it-radio-button.js index 8ef268a68f..e4292130fc 100644 --- a/lib/markdown-it/markdown-it-radio-button.js +++ b/lib/markdown-it/markdown-it-radio-button.js @@ -18,7 +18,7 @@ module.exports = function(md, options) { if (group) { group = group[1]; } else { - group = Math.random().toString(36).substr(2, 5); // generate a new group id + group = md5(tokens[i-5].content + tokens[i-4].content + tokens[i].content).substr(2, 5); // generate a deterministic group id } radioify(tokens[i], state.Token, group); attrSet(tokens[i-2], 'class', 'radio-list-item'); @@ -110,4 +110,7 @@ function isListItem(token) { return token.type === 'list_item_open'; } function startsWithTodoMarkdown(token) { // leading whitespace in a list item is already trimmed off by markdown-it return token.content.indexOf('( ) ') === 0 || token.content.indexOf('(x) ') === 0 || token.content.indexOf('(X) ') === 0; -} \ No newline at end of file +} + +// https://stackoverflow.com/questions/14733374/how-to-generate-md5-file-hash-on-javascript/33486055#33486055 +function md5(s){function L(k,d){return(k<>>(32-d))}function K(G,k){var I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H)}if(I|d){if(x&1073741824){return(x^3221225472^F^H)}else{return(x^1073741824^F^H)}}else{return(x^F^H)}}function r(d,F,k){return(d&F)|((~d)&k)}function q(d,F,k){return(d&k)|(F&(~k))}function p(d,F,k){return(d^F^k)}function n(d,F,k){return(F^(d|(~k)))}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}function e(G){var Z;var F=G.length;var x=F+8;var k=(x-(x%64))/64;var I=(k+1)*16;var aa=Array(I-1);var d=0;var H=0;while(H>>29;return aa}function B(x){var k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2)}return k}function J(k){k=k.replace(/rn/g,"n");var d="";for(var F=0;F127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128)}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128)}}}return d}var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P Date: Mon, 8 Jan 2018 20:48:08 +0800 Subject: [PATCH 2/2] Use built-in Node module for md5 hash --- lib/markdown-it/markdown-it-radio-button.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/markdown-it/markdown-it-radio-button.js b/lib/markdown-it/markdown-it-radio-button.js index e4292130fc..629dea8aac 100644 --- a/lib/markdown-it/markdown-it-radio-button.js +++ b/lib/markdown-it/markdown-it-radio-button.js @@ -1,3 +1,5 @@ +const crypto = require('crypto'); + var disableRadio = false; var useLabelWrapper = true; @@ -18,7 +20,10 @@ module.exports = function(md, options) { if (group) { group = group[1]; } else { - group = md5(tokens[i-5].content + tokens[i-4].content + tokens[i].content).substr(2, 5); // generate a deterministic group id + group = crypto.createHash('md5') + .update(tokens[i-5].content) + .update(tokens[i-4].content) + .update(tokens[i].content).digest('hex').substr(2, 5); // generate a deterministic group id } radioify(tokens[i], state.Token, group); attrSet(tokens[i-2], 'class', 'radio-list-item'); @@ -111,6 +116,3 @@ function startsWithTodoMarkdown(token) { // leading whitespace in a list item is already trimmed off by markdown-it return token.content.indexOf('( ) ') === 0 || token.content.indexOf('(x) ') === 0 || token.content.indexOf('(X) ') === 0; } - -// https://stackoverflow.com/questions/14733374/how-to-generate-md5-file-hash-on-javascript/33486055#33486055 -function md5(s){function L(k,d){return(k<>>(32-d))}function K(G,k){var I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H)}if(I|d){if(x&1073741824){return(x^3221225472^F^H)}else{return(x^1073741824^F^H)}}else{return(x^F^H)}}function r(d,F,k){return(d&F)|((~d)&k)}function q(d,F,k){return(d&k)|(F&(~k))}function p(d,F,k){return(d^F^k)}function n(d,F,k){return(F^(d|(~k)))}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}function e(G){var Z;var F=G.length;var x=F+8;var k=(x-(x%64))/64;var I=(k+1)*16;var aa=Array(I-1);var d=0;var H=0;while(H>>29;return aa}function B(x){var k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2)}return k}function J(k){k=k.replace(/rn/g,"n");var d="";for(var F=0;F127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128)}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128)}}}return d}var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P