|  | @@ -1,7 +1,7 @@
 | 
	
		
			
				|  |  | -const htmlparser = require('htmlparser2');
 | 
	
		
			
				|  |  |  const {MessageEmbed} = require('discord.js');
 | 
	
		
			
				|  |  |  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.
 | 
	
	
		
			
				|  | @@ -82,85 +82,9 @@ function fandom_diff(lang, msg, args, wiki, reaction, spoiler, embed) {
 | 
	
		
			
				|  |  |  								argids = [ids.to, ids.from];
 | 
	
		
			
				|  |  |  								var compare = ['', ''];
 | 
	
		
			
				|  |  |  								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);
 | 
	
	
		
			
				|  | @@ -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];
 | 
	
		
			
				|  |  |  					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 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 => {
 | 
	
		
			
				|  |  |  						var cpbody = cpresponse.body;
 | 
	
		
			
				|  |  |  						if ( cpbody && cpbody.warnings ) log_warn(cpbody.warnings);
 | 
	
	
		
			
				|  | @@ -288,83 +195,12 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
 | 
	
		
			
				|  |  |  						else {
 | 
	
		
			
				|  |  |  							var revision = Object.values(cpbody.query.pages)[0].revisions[0];
 | 
	
		
			
				|  |  |  							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 ) {
 | 
	
	
		
			
				|  | @@ -395,7 +231,7 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
 | 
	
		
			
				|  |  |  									content = '**' + content.substring(0, content.lastIndexOf('\n')) + '**' + more;
 | 
	
		
			
				|  |  |  								}
 | 
	
		
			
				|  |  |  								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} );
 | 
	
	
		
			
				|  | @@ -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 = {
 | 
	
		
			
				|  |  |  	name: 'diff',
 | 
	
		
			
				|  |  |  	run: fandom_diff
 |