فهرست منبع

fix section embed

Markus-Rost 4 سال پیش
والد
کامیت
760ab2520c
3فایلهای تغییر یافته به همراه37 افزوده شده و 7 حذف شده
  1. 3 3
      cmds/wiki/general.js
  2. 20 0
      cmds/wiki/user.js
  3. 14 4
      functions/parse_page.js

+ 3 - 3
cmds/wiki/general.js

@@ -258,7 +258,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 								else text += '\n\n' + category.join('\n');
 							}
 
-							if ( !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+							if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
 								try {
 									var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
 									parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href);
@@ -348,7 +348,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					else text += '\n\n' + category.join('\n');
 				}
 
-				if ( !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+				if ( !( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ) && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
 					try {
 						var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
 						parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href);
@@ -434,7 +434,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					}
 				}
 				
-				if ( !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+				if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
 					try {
 						var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
 						parse_infobox(infobox, embed, '');

+ 20 - 0
cmds/wiki/user.js

@@ -61,6 +61,16 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
 					}
 					
+					if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+						try {
+							var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
+							parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href);
+						}
+						catch ( error ) {
+							console.log( '- Failed to parse the infobox: ' + error );
+						}
+					}
+					
 					msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, '', fragment) );
 				}
 			}
@@ -216,6 +226,16 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 				}
 				else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
 				
+				if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+					try {
+						var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
+						parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href);
+					}
+					catch ( error ) {
+						console.log( '- Failed to parse the infobox: ' + error );
+					}
+				}
+				
 				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage.title, embed, wiki, new URL(body.query.general.logo, wiki).href, fragment) );
 			}
 			

+ 14 - 4
functions/parse_page.js

@@ -1,4 +1,5 @@
 const cheerio = require('cheerio');
+const {toSection} = require('../util/wiki.js');
 const {htmlToPlain} = require('../util/functions.js');
 
 const infoboxList = [
@@ -92,13 +93,22 @@ function parse_page(msg, title, embed, wiki, thumbnail, fragment = '') {
 				change = true;
 			}
 		}
-		if ( fragment && embed.length < 4750 && embed.fields.length < 25
-		&& embed.fields[0]?.name.replace( / /g, '_' ) !== fragment.replace( / /g, '_' ) ) {
-			var section = $('h1, h2, h3, h4, h5, h6').children('span#' + fragment).parent();
+		if ( fragment && embed.length < 4750 && embed.fields.length < 25 &&
+		toSection(embed.fields[0]?.name.replace( /^\**_*(.*?)_*\**$/g, '$1' )) !== toSection(fragment) ) {
+			var section = $('h1, h2, h3, h4, h5, h6').children('span').filter( (i, span) => {
+				return ( '#' + span.attribs.id === toSection(fragment) );
+			} ).parent();
 			if ( section.length ) {
 				var sectionLevel = section[0].tagName.replace('h', '');
 				var sectionContent = $('<div>').append(
-					section.nextUntil(['h1','h2','h3','h4','h5','h6'].slice(0, sectionLevel).join(', '))
+					section.nextUntil([
+						'h1 span.mw-headline',
+						'h2 span.mw-headline',
+						'h3 span.mw-headline',
+						'h4 span.mw-headline',
+						'h5 span.mw-headline',
+						'h6 span.mw-headline'
+					].slice(0, sectionLevel).join(', '))
 				);
 				section.find(removeClasses.join(', ')).remove();
 				sectionContent.find(infoboxList.join(', ')).remove();