|
@@ -1,7 +1,7 @@
|
|
-const htmlparser = require('htmlparser2');
|
|
|
|
const {MessageEmbed} = require('discord.js');
|
|
const {MessageEmbed} = require('discord.js');
|
|
const {timeoptions} = require('../../../util/default.json');
|
|
const {timeoptions} = require('../../../util/default.json');
|
|
-const {toFormatting} = require('../../../util/functions.js');
|
|
|
|
|
|
+const {toFormatting, htmlToPlain} = require('../../../util/functions.js');
|
|
|
|
+const diffParser = require('../../../util/edit_diff.js');
|
|
|
|
|
|
/**
|
|
/**
|
|
* Processes a Fandom edit.
|
|
* Processes a Fandom edit.
|
|
@@ -82,85 +82,9 @@ function fandom_diff(lang, msg, args, wiki, reaction, spoiler, embed) {
|
|
argids = [ids.to, ids.from];
|
|
argids = [ids.to, ids.from];
|
|
var compare = ['', ''];
|
|
var compare = ['', ''];
|
|
if ( ids['*'] !== undefined ) {
|
|
if ( ids['*'] !== undefined ) {
|
|
- var more = '\n__' + lang.get('diff.info.more') + '__';
|
|
|
|
- var current_tag = '';
|
|
|
|
- var small_prev_ins = '';
|
|
|
|
- var small_prev_del = '';
|
|
|
|
- var ins_length = more.length;
|
|
|
|
- var del_length = more.length;
|
|
|
|
- var added = false;
|
|
|
|
- var parser = new htmlparser.Parser( {
|
|
|
|
- onopentag: (tagname, attribs) => {
|
|
|
|
- if ( tagname === 'ins' || tagname == 'del' ) {
|
|
|
|
- current_tag = tagname;
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-addedline' ) {
|
|
|
|
- current_tag = tagname+'a';
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-deletedline' ) {
|
|
|
|
- current_tag = tagname+"d";
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-marker' ) {
|
|
|
|
- added = true;
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- ontext: (htmltext) => {
|
|
|
|
- if ( current_tag === 'ins' && ins_length <= 1000 ) {
|
|
|
|
- ins_length += ( '**' + htmltext.escapeFormatting() + '**' ).length;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += '**' + htmltext.escapeFormatting() + '**';
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( current_tag === 'del' && del_length <= 1000 ) {
|
|
|
|
- del_length += ( '~~' + htmltext.escapeFormatting() + '~~' ).length;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += '~~' + htmltext.escapeFormatting() + '~~';
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- if ( ( current_tag === 'afterins' || current_tag === 'tda') && ins_length <= 1000 ) {
|
|
|
|
- ins_length += htmltext.escapeFormatting().length;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += htmltext.escapeFormatting();
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( ( current_tag === 'afterdel' || current_tag === 'tdd') && del_length <= 1000 ) {
|
|
|
|
- del_length += htmltext.escapeFormatting().length;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += htmltext.escapeFormatting();
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- if ( added ) {
|
|
|
|
- if ( htmltext === '+' && ins_length <= 1000 ) {
|
|
|
|
- ins_length++;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += '\n';
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( htmltext === '−' && del_length <= 1000 ) {
|
|
|
|
- del_length++;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += '\n';
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- added = false;
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- onclosetag: (tagname) => {
|
|
|
|
- if ( tagname === 'ins' ) {
|
|
|
|
- current_tag = 'afterins';
|
|
|
|
- } else if ( tagname === 'del' ) {
|
|
|
|
- current_tag = 'afterdel';
|
|
|
|
- } else {
|
|
|
|
- current_tag = '';
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }, {decodeEntities:true} );
|
|
|
|
- parser.write( ids['*'] );
|
|
|
|
- parser.end();
|
|
|
|
- if ( small_prev_del.length ) {
|
|
|
|
- if ( small_prev_del.replace( /\~\~/g, '' ).trim().length ) {
|
|
|
|
- compare[0] = small_prev_del.replace( /\~\~\~\~/g, '' );
|
|
|
|
- } else compare[0] = '__' + lang.get('diff.info.whitespace') + '__';
|
|
|
|
- }
|
|
|
|
- if ( small_prev_ins.length ) {
|
|
|
|
- if ( small_prev_ins.replace( /\*\*/g, '' ).trim().length ) {
|
|
|
|
- compare[1] = small_prev_ins.replace( /\*\*\*\*/g, '' );
|
|
|
|
- } else compare[1] = '__' + lang.get('diff.info.whitespace') + '__';
|
|
|
|
- }
|
|
|
|
|
|
+ let more = '\n__' + lang.get('diff.info.more') + '__';
|
|
|
|
+ let whitespace = '__' + lang.get('diff.info.whitespace') + '__';
|
|
|
|
+ compare = diffParser( ids['*'], more, whitespace );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fandom_diff_send(lang, msg, argids, wiki, reaction, spoiler, compare);
|
|
fandom_diff_send(lang, msg, argids, wiki, reaction, spoiler, compare);
|
|
@@ -258,27 +182,10 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
|
|
}
|
|
}
|
|
if ( editor[1] === lang.get('diff.hidden') ) editorlink = editor[1];
|
|
if ( editor[1] === lang.get('diff.hidden') ) editorlink = editor[1];
|
|
var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( ( title + '?diff=' + diff + '&oldid=' + oldid ).escapeFormatting() ).setURL( pagelink ).addField( editor[0], editorlink, true ).addField( size[0], size[1], true ).addField( comment[0], comment[1] ).setFooter( timestamp[1] );
|
|
var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( ( title + '?diff=' + diff + '&oldid=' + oldid ).escapeFormatting() ).setURL( pagelink ).addField( editor[0], editorlink, true ).addField( size[0], size[1], true ).addField( comment[0], comment[1] ).setFooter( timestamp[1] );
|
|
- if ( tags ) {
|
|
|
|
- var taglink = '';
|
|
|
|
- var tagtext = '';
|
|
|
|
- var tagparser = new htmlparser.Parser( {
|
|
|
|
- onopentag: (tagname, attribs) => {
|
|
|
|
- if ( tagname === 'a' ) taglink = attribs.href;
|
|
|
|
- },
|
|
|
|
- ontext: (htmltext) => {
|
|
|
|
- if ( taglink ) tagtext += '[' + htmltext.escapeFormatting() + '](' + taglink + ')'
|
|
|
|
- else tagtext += htmltext.escapeFormatting();
|
|
|
|
- },
|
|
|
|
- onclosetag: (tagname) => {
|
|
|
|
- if ( tagname === 'a' ) taglink = '';
|
|
|
|
- }
|
|
|
|
- }, {decodeEntities:true} );
|
|
|
|
- tagparser.write( tags[1] );
|
|
|
|
- tagparser.end();
|
|
|
|
- embed.addField( tags[0], tagtext );
|
|
|
|
- }
|
|
|
|
|
|
+ if ( tags ) embed.addField( tags[0], htmlToPlain(tags[1]) );
|
|
|
|
|
|
var more = '\n__' + lang.get('diff.info.more') + '__';
|
|
var more = '\n__' + lang.get('diff.info.more') + '__';
|
|
|
|
+ var whitespace = '__' + lang.get('diff.info.whitespace') + '__';
|
|
if ( !compare && oldid ) got.get( wiki + 'api.php?action=query&prop=revisions&rvprop=&revids=' + oldid + '&rvdiffto=' + diff + '&format=json' ).then( cpresponse => {
|
|
if ( !compare && oldid ) got.get( wiki + 'api.php?action=query&prop=revisions&rvprop=&revids=' + oldid + '&rvdiffto=' + diff + '&format=json' ).then( cpresponse => {
|
|
var cpbody = cpresponse.body;
|
|
var cpbody = cpresponse.body;
|
|
if ( cpbody && cpbody.warnings ) log_warn(cpbody.warnings);
|
|
if ( cpbody && cpbody.warnings ) log_warn(cpbody.warnings);
|
|
@@ -288,83 +195,12 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
|
|
else {
|
|
else {
|
|
var revision = Object.values(cpbody.query.pages)[0].revisions[0];
|
|
var revision = Object.values(cpbody.query.pages)[0].revisions[0];
|
|
if ( revision.texthidden === undefined && revision.diff && revision.diff['*'] !== undefined ) {
|
|
if ( revision.texthidden === undefined && revision.diff && revision.diff['*'] !== undefined ) {
|
|
- var current_tag = '';
|
|
|
|
- var small_prev_ins = '';
|
|
|
|
- var small_prev_del = '';
|
|
|
|
- var ins_length = more.length;
|
|
|
|
- var del_length = more.length;
|
|
|
|
- var added = false;
|
|
|
|
- var parser = new htmlparser.Parser( {
|
|
|
|
- onopentag: (tagname, attribs) => {
|
|
|
|
- if ( tagname === 'ins' || tagname == 'del' ) {
|
|
|
|
- current_tag = tagname;
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-addedline' ) {
|
|
|
|
- current_tag = tagname+'a';
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-deletedline' ) {
|
|
|
|
- current_tag = tagname+"d";
|
|
|
|
- }
|
|
|
|
- if ( tagname === 'td' && attribs.class === 'diff-marker' ) {
|
|
|
|
- added = true;
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- ontext: (htmltext) => {
|
|
|
|
- if ( current_tag === 'ins' && ins_length <= 1000 ) {
|
|
|
|
- ins_length += ( '**' + htmltext.escapeFormatting() + '**' ).length;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += '**' + htmltext.escapeFormatting() + '**';
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( current_tag === 'del' && del_length <= 1000 ) {
|
|
|
|
- del_length += ( '~~' + htmltext.escapeFormatting() + '~~' ).length;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += '~~' + htmltext.escapeFormatting() + '~~';
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- if ( ( current_tag === 'afterins' || current_tag === 'tda') && ins_length <= 1000 ) {
|
|
|
|
- ins_length += htmltext.escapeFormatting().length;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += htmltext.escapeFormatting();
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( ( current_tag === 'afterdel' || current_tag === 'tdd') && del_length <= 1000 ) {
|
|
|
|
- del_length += htmltext.escapeFormatting().length;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += htmltext.escapeFormatting();
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- if ( added ) {
|
|
|
|
- if ( htmltext === '+' && ins_length <= 1000 ) {
|
|
|
|
- ins_length++;
|
|
|
|
- if ( ins_length <= 1000 ) small_prev_ins += '\n';
|
|
|
|
- else small_prev_ins += more;
|
|
|
|
- }
|
|
|
|
- if ( htmltext === '−' && del_length <= 1000 ) {
|
|
|
|
- del_length++;
|
|
|
|
- if ( del_length <= 1000 ) small_prev_del += '\n';
|
|
|
|
- else small_prev_del += more;
|
|
|
|
- }
|
|
|
|
- added = false;
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- onclosetag: (tagname) => {
|
|
|
|
- if ( tagname === 'ins' ) {
|
|
|
|
- current_tag = 'afterins';
|
|
|
|
- } else if ( tagname === 'del' ) {
|
|
|
|
- current_tag = 'afterdel';
|
|
|
|
- } else {
|
|
|
|
- current_tag = '';
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }, {decodeEntities:true} );
|
|
|
|
- parser.write( revision.diff['*'] );
|
|
|
|
- parser.end();
|
|
|
|
- if ( small_prev_del.length ) {
|
|
|
|
- if ( small_prev_del.replace( /\~\~/g, '' ).trim().length ) {
|
|
|
|
- embed.addField( lang.get('diff.info.removed'), small_prev_del.replace( /\~\~\~\~/g, '' ), true );
|
|
|
|
- } else embed.addField( lang.get('diff.info.removed'), '__' + lang.get('diff.info.whitespace') + '__', true );
|
|
|
|
|
|
+ let edit_diff = diffParser( revision.diff['*'], more, whitespace )
|
|
|
|
+ if ( edit_diff[0].length ) {
|
|
|
|
+ embed.addField( lang.get('diff.info.removed'), edit_diff[0], true );
|
|
}
|
|
}
|
|
- if ( small_prev_ins.length ) {
|
|
|
|
- if ( small_prev_ins.replace( /\*\*/g, '' ).trim().length ) {
|
|
|
|
- embed.addField( lang.get('diff.info.added'), small_prev_ins.replace( /\*\*\*\*/g, '' ), true );
|
|
|
|
- } else embed.addField( lang.get('diff.info.added'), '__' + lang.get('diff.info.whitespace') + '__', true );
|
|
|
|
|
|
+ if ( edit_diff[1].length ) {
|
|
|
|
+ embed.addField( lang.get('diff.info.added'), edit_diff[1], true );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( revision.texthidden !== undefined ) {
|
|
else if ( revision.texthidden !== undefined ) {
|
|
@@ -395,7 +231,7 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
|
|
content = '**' + content.substring(0, content.lastIndexOf('\n')) + '**' + more;
|
|
content = '**' + content.substring(0, content.lastIndexOf('\n')) + '**' + more;
|
|
}
|
|
}
|
|
embed.addField( lang.get('diff.info.added'), content, true );
|
|
embed.addField( lang.get('diff.info.added'), content, true );
|
|
- } else embed.addField( lang.get('diff.info.added'), '__' + lang.get('diff.info.whitespace') + '__', true );
|
|
|
|
|
|
+ } else embed.addField( lang.get('diff.info.added'), whitespace, true );
|
|
}
|
|
}
|
|
|
|
|
|
msg.sendChannel( spoiler + text + spoiler, {embed} );
|
|
msg.sendChannel( spoiler + text + spoiler, {embed} );
|
|
@@ -433,23 +269,6 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
|
|
} );
|
|
} );
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * Change HTML text to plain text.
|
|
|
|
- * @param {String} html - The text in HTML.
|
|
|
|
- * @returns {String}
|
|
|
|
- */
|
|
|
|
-function htmlToPlain(html) {
|
|
|
|
- var text = '';
|
|
|
|
- var parser = new htmlparser.Parser( {
|
|
|
|
- ontext: (htmltext) => {
|
|
|
|
- text += htmltext.escapeFormatting();
|
|
|
|
- }
|
|
|
|
- }, {decodeEntities:true} );
|
|
|
|
- parser.write( html );
|
|
|
|
- parser.end();
|
|
|
|
- return text;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
module.exports = {
|
|
module.exports = {
|
|
name: 'diff',
|
|
name: 'diff',
|
|
run: fandom_diff
|
|
run: fandom_diff
|