text:
User:Koavf/common.js

/* Uploaded from branch master, commit 5d2cd81 */ // vim: ts=4 sw=4 et // function loadReplyLink( $, mw ) { var TIMESTAMP_REGEX = /\(UTC(?:(?:−|\+)\d+?(?:\.\d+)?)?\)\S*?\s*$/m; var EDIT_REQ_REGEX = /^((Semi|Template|Extended-confirmed)-p|P)rotected edit request on \d\d? \w+ \d{4}/; var EDIT_REQ_TPL_REGEX = /\{\{edit (template|fully|extended|semi)-protected\s*(\|.+?)*\}\}/; var LITERAL_SIGNATURE = "" + ""; // split up because it might get processed var i18n = { "en": { "rl-advert": " (using reply-link)", "rl-error-status": "There was an error while replying! Please leave a note at " + "the script's talk page" + " with any errors in the browser console, if possible.", "rl-replying-to": "Replying to ", "rl-reloading": "automatically reloading", "rl-reload": "Reload", "rl-saved": "Reply saved!", "rl-cancel": "cancel ", "rl-placeholder": "Reply here!", "rl-reply": "Reply", "rl-preview": "Preview", "rl-cancel-button": "Cancel", "rl-started-reply": "You've started a reply but haven't posted it", "rl-loading": "Loading...", "rl-reply-label": "reply", "rl-to-label": " to ", "rl-auto-indent": "Automatically indent?" },       "pt": { "rl-advert": "(usando reply-link)", "rl-error-status": "Ocorreu um erro ao responder! Por favor deixe um comentário na " + "página de discussão do script" + " informando os erros que apareçam no console do navegador, se possível.", "rl-replying-to": "Respondendo a ", "rl-reloading": "recarregando automaticamente", "rl-reload": "Recarregar", "rl-saved": "Resposta publicada!", "rl-cancel": "cancelar ", "rl-placeholder": "Responda aqui!", "rl-reply": "Responder", "rl-preview": "Prever", "rl-cancel-button": "Cancelar", "rl-started-reply": "Você começou a responder, mas não publicou sua resposta", "rl-loading": "Carregando...", "rl-reply-label": "responder", "rl-to-label": " a ", "rl-auto-indent": "Indentar automaticamente?" }   };    var PARSOID_ENDPOINT = "https:" + mw.config.get( "wgServer" ) + "/api/rest_v1/page/html/"; var HEADER_SELECTOR = "h1,h2,h3,h4,h5,h6"; var MAX_UNICODE_DECIMAL = 1114111; var HEADER_REGEX = /^\s*=(=*)\s*(.+?)\s*\1=\s*$/gm;

// T:TDYK, used at the end of loadReplyLink var TTDYK = "Template:Did_you_know_nominations"; var RFA_PG = "Wikipedia:Requests_for_adminship/";

// Threshold for indentation when we offer to outdent var OUTDENT_THRESH = 8;

// All of the interface message keys that we explicitly load var INT_MSG_KEYS = [ "mycontris" ];

// Date format regexes in signatures (i.e. the "default date format") var DATE_FMT_RGX = { "//en.wikipedia.org": /\d\d:\d\d,\s\d{1,2}\s\w+?\s\d{4}/.source, "//simple.wikipedia.org": /\d\d:\d\d,\s\d{1,2}\s\w+?\s\d{4}/.source, "//en.wikisource.org": /\d\d:\d\d,\s\d{1,2}\s\w+?\s\d{4}/.source, "//pt.wikipedia.org": /\d\dh\d\dmin\sde \d{1,2} de \w+? de \d{4}/.source }

// Shared API object var api;

/*    * Regex *sources* for a "userspace" link. Basically the * localized equivalent of User( talk)?|Special:Contributions/ * Initialized in buildUserspcLinkRgx, which is called near the top * of the closure in handleWrapperClick. *    * Three subproperties: und for underscores instead of spaces (e.g.     * "User_talk"), spc for spaces (e.g. "User talk"), and both for * a regex combining the two (used for matching on wikitext). */   var userspcLinkRgx = null;

/**    * This dictionary is some global state that holds three pieces of     * information for each "(reply)" link (keyed by their unique IDs): *    *  - the indentation string for the comment (e.g. ":*::") * - the header tuple for the parent section, in the form of     *    [level, text, number], where: *     - level is 1 for a h1, 2 for a h2, etc *     - text is the text between the equal signs *     - number is the zero-based index of the heading from the top * - sigIdx, or the zero-based index of the signature from the top *   of the section *    * This dictionary is populated in attachLinks, and unpacked in the * click handler for the links (defined in attachLinkAfterNode); the * values are then passed to doReply. */   var metadata = {};

/**    * This global string flag is: *    *  - "AfD" if the current page is an AfD page * - "MfD" if the current page is an MfD page * - "TfD" if the current page is a TfD log page * - "CfD" if the current page is a CfD log page * - "FfD" if the current page is a FfD log page * - "" otherwise *    * This flag is initialized in onReady and used in attachLinkAfterNode */   var xfdType;

/**    * The current page name, including namespace, because we may be reading it     * a lot (especially in findUsernameInElem if we're on someone's user     * talk page) */   var currentPageName;

/**    * A map for signatures that contain redirects, so that they can still * pass the sanity check. This will be updated manually, because I    * don't want the overhead of a whole 'nother API call in the middle * of the reply process. If this map grows too much, though, I'll    * consider switching to either a toolforge-hosted API or the * Wikipedia API. Used in doReply, for the username sanity check. */   var sigRedirectMapping = { "Salvidrim": "Salvidrim!" };

/**    * When the reply is saved via API, this flag is set to true to     * disable the onbeforeunload handler. */   var replyWasSaved = false;

/**    * Cache for getWikitext. Only useful in test mode. */   var getWikitextCache = {};

// Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes if( !String.prototype.includes ) { String.prototype.includes = function( search, start ) { if( search instanceof RegExp ) { throw TypeError('first argument must not be a RegExp'); }           if( start === undefined ) { start = 0; }           return this.indexOf( search, start ) !== -1; };   }

/**    * Get the formatted namespace name for a namespace ID. * Quick ref: user = 2, proj = 4 */   function fmtNs( nsId ) { return mw.config.get( "wgFormattedNamespaces" )[ nsId ]; }

/**    * Escapes a string for inclusion in a regex. */   function escapeForRegex( s ) { return s.replace( /[-\/\\^$*+?.|[\]{}]/g, '\\$&' ); }

/*    * MediaWiki turns spaces before certain punctuation marks * into non-breaking spaces, so fix those. This is done by    * the armorFrenchSpaces function in Mediawiki, in the file * /includes/parser/Sanitizer.php */   function deArmorFrenchSpaces( text ) { return text.replace( /\xA0([?:;!%»›])/g, " $1" ) .replace( /([«‹])\xA0/g, "$1 " ); }

/**    * Capitalize the first letter of a string. */   function capFirstLetter( someString ) { return someString.charAt( 0 ).toUpperCase + someString.slice( 1 ); }

/**    * Namespace name to ID. * For example, nsNameToId( "Template" ) === 10. */   function nsNameToId( nsName ) { return mw.config.get( "wgNamespaceIds" )[ nsName.toLowerCase.replace( / /g, "_" ) ]; }

/**    * Canonical-ize a namespace. */   function canonicalizeNs( ns ) { return fmtNs( nsNameToId( ns ) ); }

/**    * This function converts any (index-able) iterable into a list. */   function iterableToList( nl ) { var len = nl.length; var arr = new Array( len ); for( var i = 0; i < len; i++ ) arr[i] = nl[i]; return arr; }

/**    * Process HTML character entities. * From https://stackoverflow.com/a/46851765 */   function processCharEntities( text ) { var el = document.createElement('div'); return text.replace( /\&[#0-9a-z]+;/gi, function ( enc ) {           el.innerHTML = enc;            return el.innerText        } ); }

/**    * Process HTML character entities, MediaWiki style * From https://stackoverflow.com/a/46851765 */   function processCharEntitiesWikitext( text ) { var el = document.createElement('div'); return text.replace( /\&[#0-9a-z]+;/gi, function ( enc ) {           if( /#\d+/.test( enc ) ) {                if( parseInt( enc.slice( 1 ) ) > MAX_UNICODE_DECIMAL ) {                    return enc;                }            }            el.innerHTML = enc;            return el.innerText        } ); }

/**    * When there's a panel being shown, this function sets the status * in the panel to the first argument. The callback function is    * optional. */   function setStatus ( status, callback ) { var statusElement = $( "#reply-dialog-status" ); statusElement.fadeOut( function {            statusElement.html( status ).fadeIn( callback );        } ); }

/**    * Sets the panel status when an error happened. Good for use in    * catch blocks. */   function setStatusError( e ) { console.error(e); setStatus( mw.msg( "rl-error-status" ) ); if( e.message ) { console.log( "Content request error: " + JSON.stringify( e.message ) ); }       console.log( "DEBUG INFORMATION: '"+currentPageName+"' @ " +                mw.config.get( "wgCurRevisionId" ),"parsoid",PARSOID_ENDPOINT+                encodeURIComponent(currentPageName).replace(/'/g,"%27")+"/"+mw.config.get("wgCurRevisionId") ); throw e;   }

/**    * Given some wikitext, processes it to get just the text content. * This function should be identical to the MediaWiki function * that gets the wikitext between the equal signs and comes up    * with the id's that anchor the headers. */   function wikitextToTextContent( wikitext ) { return decodeURIComponent( processCharEntities( wikitext ) ) .replace( /\[\[:?(?:[^\|\]]+?\|)?([^\]\|]+?)\]\]/g, "$1" ) .replace( /\{\{\s*tl\s*\|\s*(.+?)\s*\}\}/g, "" ) .replace( /\{\{\s*[Uu]\s*\|\s*(.+?)\s*\}\}/g, "$1" ) .replace( /('''?)(.+?)\1/g, "$2" ) .replace( / (.+?)<\/s>/g, "$1" ) .replace( / (.+?)<\/big>/g, "$1" ) .replace( /(.*?)<\/span>/g, "$1" ); }

function wikitextHeaderEqualsDomHeader( wikitextHeader, domHeader ) { return wikitextToTextContent( wikitextHeader ) === deArmorFrenchSpaces( domHeader ); }

/**    * Finds and returns the div that is the immediate parent of the * first talk page header on the page, so that we can read all the * sections by iterating through its child nodes. */   function findMainContentEl {

// Which header are we looking for? var targetHeader = "h2"; if( xfdType || currentPageName.startsWith( RFA_PG ) ) targetHeader = "h3"; if( currentPageName.startsWith( TTDYK ) ) targetHeader = "h4";

// The element itself will be the text span in the h2; its // parent will be the h2; and the parent of the h2 is the // content container that we want var candidates = document.querySelectorAll( targetHeader + " > span.mw-headline" ); if( !candidates.length ) return null; var candidate = candidates[candidates.length-1].parentElement.parentElement;

// Compatibility with User:Enterprisey/hover-edit-section // That script puts each section in its own div, so we need to       // go out another level if it's running if( candidate.className === "hover-edit-section" ) { return candidate.parentElement; } else { return candidate; }   }

/**    * Gets the wikitext of a page with the given title (namespace required). * Returns an object with keys "content" and "timestamp". */   function getWikitext( title, useCaching ) { if( useCaching === undefined ) useCaching = false; if( useCaching && getWikitextCache[ title ] ) { return $.when( getWikitextCache[ title ] ); }       return $.getJSON(            mw.util.wikiScript( "api" ),            {                format: "json",                action: "query",                prop: "revisions",                rvprop: "content",                rvslots: "main",                rvlimit: 1,                titles: title            }        ).then( function ( data ) {            var pageId = Object.keys( data.query.pages )[0];            if( data.query.pages[pageId].revisions ) {                var revObj = data.query.pages[pageId].revisions[0];                var result = { timestamp: revObj.timestamp, content: revObj.slots.main["*"] };                getWikitextCache[ title ] = result;                return result;            }            return {};        } ); }

/**    * Creates userspcLinkRgx. Called in handleWrapperClick and the test * runner at the bottom. */   function buildUserspcLinkRgx { var nsIdMap = mw.config.get( "wgNamespaceIds" ); var nsRgxFragments = []; var contribsSecondFrag = ":" + escapeForRegex( mw.messages.get( "mycontris" ) ) + "\\/"; for( var nsName in nsIdMap ) { if( !nsIdMap.hasOwnProperty( nsName ) ) continue; switch( nsIdMap[nsName] ) { case 2: case 3: nsRgxFragments.push( escapeForRegex( capFirstLetter( nsName ) ) + "\\s*:" ); break; case -1: nsRgxFragments.push( escapeForRegex( capFirstLetter( nsName ) ) + contribsSecondFrag ); break; }       }        userspcLinkRgx = {}; userspcLinkRgx.spc = "(?:" + nsRgxFragments.join( "|" ).replace( /_/g, " " ) + ")"; userspcLinkRgx.und = userspcLinkRgx.spc.replace( / /g, "_" ); userspcLinkRgx.both = userspcLinkRgx.spc.replace( / /g, "(?: |_)" ); }

/**    * Is there a signature (four tildes) present in the given text, * outside of a nowiki element? */   function hasSig( text ) {

// no literal signature? if( !text.includes( LITERAL_SIGNATURE ) ) return false;

// if there's a literal signature and no nowiki elements, // there must be a real signature if( !text.includes( " " ) ) return true;

// Save all nowiki spans var nowikiSpanStarts = []; // list of ignored span beginnings var nowikiSpanLengths = []; // list of ignored span lengths var NOWIKI_RE = / .*?<\/nowiki>/g; var spanMatch; do { spanMatch = NOWIKI_RE.exec( text ); if( spanMatch ) { nowikiSpanStarts.push( spanMatch.index ); nowikiSpanLengths.push( spanMatch[0].length ); }       } while( spanMatch );

// So that we don't check every ignore span every time var nowikiSpanStartIdx = 0;

var LIT_SIG_RE = new RegExp( LITERAL_SIGNATURE, "g" ); var sigMatch;

matchLoop: do { sigMatch = LIT_SIG_RE.exec( text ); if( sigMatch ) {

// Check that we're not inside a nowiki for( var nwIdx = nowikiSpanStartIdx; nwIdx <                   nowikiSpanStarts.length; nwIdx++ ) { if( sigMatch.index > nowikiSpanStarts[nwIdx] ) { if ( sigMatch.index + sigMatch[0].length <=                           nowikiSpanStarts[nwIdx] + nowikiSpanLengths[nwIdx] ) {

// Invalid sig continue matchLoop; } else {

// We'll never encounter this span again, since // headers only get later and later in the wikitext nowikiSpanStartIdx = nwIdx; }                   }                }

// We aren't inside a nowiki return true; }       } while( sigMatch ); return false; }

/**    * Given an Element object, attempt to recover a username from it. * Also will check up to two elements prior to the passed element. * Returns null if no username was found. Otherwise, returns an    * object with these properties: *    *  - username: The username that we found. * - link: The DOM object for the link from which we got the *   username. */   function findUsernameInElem( el ) { if( !el ) return null; var links; for( let i = 0; i < 3; i++ ) { if( el === null ) break; links = el.tagName.toLowerCase === "a" ? [ el ] : el.querySelectorAll( "a" ); //console.log(i,"top of outer for in findUsernameInElem ",el, " links -> ",links);

// Compatibility with "Comments in Local Time" if( el.className.includes( "localcomments" ) ) i--;

// If we couldn't get any links, try again with prev elem if( !links ) continue;

var link; // his name isn't zelda for( var j = 0; j < links.length; j++ ) { link = links[j];

//console.log(link,decodeURIComponent(link.getAttribute("href"))); if( link.className.includes( "mw-selflink" ) ) { return { username: currentPageName.replace( /.+:/, "" ) .replace( /_/g, " " ), link: link }; }

// Also matches redlinks. Why people have redlinks in their sigs on               // purpose, I may never know. //console.log( "^\\/(?:wiki\\/" + userspcLinkRgx.und + /(.+?)(?:\/.+?)?(?:#.+)?|w\/index\.php\?title=User(?:_talk)?:(.+?)&action=edit&redlink=1/.source + ")$" ) var sigLinkRe = new RegExp( "\\/(?:wiki\\/" + userspcLinkRgx.und + /(.+?)(?:\/.+?)?(?:#.+)?|w\/index\.php\?title=/.source + userspcLinkRgx.und + /(.+?)&action=edit&redlink=1/.source + ")$" ); var liveDecodedHref = decodeURIComponent( link.getAttribute( "href" ) ); if( liveDecodedHref.startsWith( "/" ) ) { liveDecodedHref = "https:" + mw.config.get( "wgServer" ) + liveDecodedHref; }               var usernameMatch = sigLinkRe.exec( liveDecodedHref ); if( usernameMatch ) { //console.log("usernameMatch",usernameMatch) var rawUsername = usernameMatch[1] ? usernameMatch[1] : usernameMatch[2]; return { username: decodeURIComponent( rawUsername ).replace( /_/g, " " ), link: link };               }            }

// Go backwards one element and try again el = el.previousElementSibling; }       return null; }

/**    * Given a reply-link-wrapper span, attempts to find who wrote * the comment that precedes it. For information about the return * value, see the documentation for findUsernameInElem. */   function getCommentAuthor( wrapper ) { var sigNode = wrapper.previousSibling; //console.log(sigNode,sigNode.style,sigNode.style ? sigNode.style.getPropertyValue("size"):""); var smallOrFake = sigNode.nodeType === 1 && ( sigNode.tagName.toLowerCase === "small" ||               ( sigNode.tagName.toLowerCase === "span" && sigNode.style && ( sigNode.style.getPropertyValue( "font-size" ) === "85%" ||                                      sigNode.style.getPropertyValue( "font-size" ).indexOf( "small" ) === 0 ) ) );

var possUserLinkElem = ( smallOrFake && sigNode.children.length > 1 ) ? sigNode.children[sigNode.children.length-1] : sigNode.previousElementSibling; return findUsernameInElem( possUserLinkElem ); }

/**    * Given the wikitext of a section, attempt to find the first edit * request template in it, and then mark that template as answered. * Returns the modified section wikitext. */   function markEditReqAnswered( sectionWikitext ) { var editReqMatch = EDIT_REQ_TPL_REGEX.exec( sectionWikitext ); if( !editReqMatch ) { console.error( "Couldn't find an edit request!" ); return sectionWikitext; }

var ansParamMatch = /ans(wered)?=.*?(\||\}\})/.exec( editReqMatch[0] ); if( !ansParamMatch ) { sectionWikitext = sectionWikitext.replace(               editReqMatch[0],                editReqMatch[0].replace( "}}", "answered=yes}}" )            ); } else { var newEditReqTpl = editReqMatch[0].replace( ansParamMatch[0],               "answered=yes" + ansParamMatch[2] ); sectionWikitext = sectionWikitext.replace(               editReqMatch[0],                newEditReqTpl            ); }       return sectionWikitext; }

/**    * Ascend until dd or li, or a p directly under div.mw-parser-output. * live is true if we're on the live DOM (and thus we have our own UI    * elements to deal with) and false if we're on the psd DOM. */   function ascendToCommentContainer( startNode, live, recordPath ) { var currNode = startNode; if( recordPath === undefined ) recordPath = false; var path = []; var lcTag; var headerRegex = /h\d+/i;

function hasHeaderAsAnyPreviousSibling( node ) { do { if( headerRegex.test( node.tagName ) ) { return true; }               node = node.previousElementSibling; } while( node ); }

function isActualContainer( node, nodeLcTag ) { if( nodeLcTag === undefined ) nodeLcTag = node.tagName.toLowerCase; return /dd|li/.test( nodeLcTag ) || ( ( nodeLcTag === "p" || nodeLcTag === "div" ) &&                       ( node.parentNode.className === "mw-parser-output" || hasHeaderAsAnyPreviousSibling( node ) || node.parentNode.className === "hover-edit-section" || ( node.parentNode.tagName.toLowerCase === "section" &&                               node.parentNode.dataset.mwSectionId ) ) ); }

var smallContainerNodeLimit = live ? 3 : 1;       do { currNode = currNode.parentNode; lcTag = currNode.tagName.toLowerCase; if( lcTag === "html" ) { console.error( "ascendToCommentContainer reached root" ); break; }           if( recordPath ) path.unshift( currNode ); //console.log( "checking isActualContainer for ", currNode, isActualContainer( currNode, lcTag ),           //        lcTag === "small", isActualContainer( currNode.parentNode ),            //            currNode.parentNode.childNodes,            //            currNode.parentNode.childNodes.length ); } while( !isActualContainer( currNode, lcTag ) &&           !( lcTag === "small" && isActualContainer( currNode.parentNode ) && currNode.parentNode.childNodes.length <= smallContainerNodeLimit ) ); //console.log("ascendToCommentContainer from ",startNode," terminating, r.v. ",recordPath?path:currNode); return recordPath ? path : currNode; }

/**    * Given a Parsoid DOM and a link in the live DOM that is the link at the * end of a signature, return the corresponding element in the Parsoid DOM * that represents the same comment, or null if none was found. *    * psd = Parsoid, live = in the current, live page DOM. */   function getCorrCmt( psdDom, sigLinkElem ) {

// First, define some helper functions

// Does this node have a timestamp in it? function hasTimestamp( node ) { //console.log ("hasTimestamp ",node, node.nodeType === 3,node.textContent.trim,           //            TIMESTAMP_REGEX.test( node.textContent.trim ),            //        node.childNodes.length === 1,            //            node.childNodes.length && TIMESTAMP_REGEX.test( node.childNodes[0].textContent.trim),            //        " => ",( node.nodeType === 3 && //               TIMESTAMP_REGEX.test( node.textContent.trim ) ) ||            //           ( node.childNodes.length === 1 && //               TIMESTAMP_REGEX.test( node.childNodes[0].textContent.trim ) ) ); //console.log(node,node.textContent.trim,TIMESTAMP_REGEX.test(node.textContent.trim)); var validTag = node.nodeType === 3 || ( node.nodeType === 1 &&                           ( node.tagName.toLowerCase === "small" || node.tagName.toLowerCase === "span" ) ); return ( validTag && TIMESTAMP_REGEX.test( node.textContent.trim ) ||                  ( node.childNodes.length === 1 && TIMESTAMP_REGEX.test( node.childNodes[0].textContent.trim ) ) ); }

// Get prefix that's the actual comment function getPrefixComment( theNodes ) { var prefix = []; for( var j = 0; j < theNodes.length; j++ ) { prefix.push( theNodes[j] ); if( hasTimestamp( theNodes[j] ) ) break; }           return prefix; }

/**        * From a "container elem" (like the whole dd, li, or p that has a         * comment), get the prefix that ends in a timestamp (because other         * comments might be after the timestamp), and return the text content. */       function surrTextContentFromElem( elem ) { var surrListElemNodes = elem.childNodes;

// nodeType 8 is for comments return getPrefixComment( surrListElemNodes ) .map( function ( c ) { return ( c.nodeType !== 8 ) ? c.textContent : ""; } ) .join( "" ).trim; }

/** From a "container elem" (dd, li, or p), remove all but the first comment. */       function onlyFirstComment( container ) { //console.log("onlyFirstComment top container and container.childNodes",container,container.childNodes); if( container.childNodes.length === 1 && container.children[0].tagName.toLowerCase === "small" ) { console.log( "[onlyFirstComment] container only had a small in it" ); container = container.children[0]; }           var i, autosignedIdx, autosigned = container.querySelector( "small.autosigned" ); if( autosigned && ( autosignedIdx = iterableToList(                   container.childNodes ).includes( autosigned ) ) ) { i = autosignedIdx; } else { var childNodes = container.childNodes; for( i = 0; i < childNodes.length; i++ ) { if( hasTimestamp( childNodes[i] ) ) { //console.log( "[oFC] found a timestamp in ",childNodes[i]); break; }               }                if( i === childNodes.length ) { throw new Error( "[onlyFirstComment] No timestamp found" ); }           }            //console.log("[onlyFirstComment] killing all after ",i,container.childNodes[i]); i++; var elemToRemove; while( elemToRemove = container.childNodes[i] ) { container.removeChild( elemToRemove ); }       }

// End helper functions, begin actual code

// We dump this object for debugging in the event of an error var corrCmtDebug = {};

// Convert live href to psd href (aka newHref) var newHref, liveHref = decodeURIComponent( sigLinkElem.getAttribute( "href" ) ); corrCmtDebug.liveHref = liveHref; if( sigLinkElem.className.includes( "mw-selflink" ) ) { newHref = "./" + currentPageName; } else { if( /^\/wiki/.test( liveHref ) ) { var hrefTokens = liveHref.split( ":" ); if( hrefTokens.length !== 2 ) throw new Error( "Malformed href" ); newHref = "./" + canonicalizeNs( hrefTokens[0].replace( /^\/wiki\//, "" ) ).replace( / /g, "_" ) + ":" + hrefTokens[1] .replace( /^Contributions%2F/, "Contributions/" ) .replace( /%2F/g, "/" ) .replace( /%23/g, "#" ) .replace( /%26/g, "&" ) .replace( /%3D/g, "=" ) .replace( /%2C/g, "," ); } else { var REDLINK_HREF_RGX = /^\/w\/index\.php\?title=(.+?)&action=edit&redlink=1$/; var redlinkMatch = REDLINK_HREF_RGX.exec( liveHref ); if( redlinkMatch ) { newHref = "./" + redlinkMatch[1]; } else { newHref = liveHref.replace( /_/g, '%20' ); }           }        }        newHref = newHref.replace( /\\/g, "\\\\" ) .replace( /'/g, "\\'" ) .replace( /\?/g, "%3F" ); var livePath = ascendToCommentContainer( sigLinkElem, /* live */ true, /* recordPath */ true ); corrCmtDebug.newHref = newHref; corrCmtDebug.livePath = livePath;

// Deal with the case where the comment has multiple links to       // sigLinkElem's href; we will store the index of the link we want. // null means there aren't multiple links. if( liveHref ) { liveHref = liveHref.replace( /'/g, "\\'" ); }       var liveDupeLinks = livePath[0].querySelectorAll( "a" +                ( liveHref ? ( "[href='" + liveHref + "']" ) : ".mw-selflink" ) ); if( !liveDupeLinks ) throw new Error( "Couldn't select live dupe link" ); var liveDupeLinkIdx = ( liveDupeLinks.length > 1 ) ? iterableToList( liveDupeLinks ).indexOf( sigLinkElem ) : null; //console.log("liveDupeLinkIdx",liveDupeLinkIdx);

//console.log("livePath[0]",livePath[0],livePath[0].childNodes); var liveClone = livePath[0].cloneNode( /* deep */ true );

// Remove our own UI elements var ourUiSelector = ".reply-link-wrapper,#reply-link-panel"; iterableToList( liveClone.querySelectorAll( ourUiSelector ) ).forEach( function ( n ) {           n.parentNode.removeChild( n );        } );

//console.log("(BEFORE) liveClone",liveClone,liveClone.childNodes); onlyFirstComment( liveClone ); //console.log("(AFTER) liveClone",liveClone,liveClone.childNodes);

// Process it a bit to make it look a bit more like the Parsoid output var liveAutoNumberedLinks = liveClone.querySelectorAll( "a.external.autonumber" ); for( var i = 0; i < liveAutoNumberedLinks.length; i++ ) { liveAutoNumberedLinks[i].textContent = ""; }       var liveSelflinks = liveClone.querySelectorAll( "a.mw-selflink.selflink" ); for( var i = 0; i < liveSelflinks.length; i++ ) { liveSelflinks[i].href = "/wiki/" + currentPageName; }

// "Comments in Local Time" compatibility: the text content is       // gonna contain the modified time stamp, but the original time // stamp is still there var localCommentsSpan = liveClone.querySelector( "span.localcomments" ); if( localCommentsSpan ) { var dateNode = document.createTextNode( localCommentsSpan.getAttribute( "title" ) ); localCommentsSpan.parentNode.replaceChild( dateNode, localCommentsSpan ); }

// User:Writ Keeper/Scripts/teahouseTalkbackLink.js compatibility: // get rid of the |C|TB that it adds var teahouseTalkbackLink = liveClone.querySelector( "a[id^=TBsubmit]" ); if( teahouseTalkbackLink ) { teahouseTalkbackLink.parentNode.removeChild( teahouseTalkbackLink.nextSibling ); for( var ttlIdx = 0; ttlIdx < 3; ttlIdx++ ) { teahouseTalkbackLink.parentNode.removeChild( teahouseTalkbackLink.previousSibling ); }           teahouseTalkbackLink.parentNode.removeChild( teahouseTalkbackLink ); }

var adminMarksClass = liveClone.querySelectorAll( "b.adminMark" ); if ( adminMarksClass.length > 0 ) { adminMarksClass.forEach( function ( currentValue, currentIndex, listObj ) {               currentValue.parentNode.removeChild( currentValue );            } ); }       // TODO: Optimization - surrTextContentFromElem does the prefixing // operation a second time, even though we already called onlyFirstComment // on it. var liveTextContent = surrTextContentFromElem( liveClone ); console.log("liveTextContent >>>>>"+liveTextContent + "<<<<<");

function normalizeTextContent( tc ) { return deArmorFrenchSpaces( tc ); }

liveTextContent = normalizeTextContent( liveTextContent );

var selector = livePath.map( function ( node ) {           return node.tagName.toLowerCase;        } ).join( " " ) + " a[href^='" + newHref + "']";

// TODO: Optimization opportunity - run querySelectorAll only on the // section that we know contains the comment var psdLinks = iterableToList( psdDom.querySelectorAll( selector ) ); console.log("(",liveDupeLinkIdx, ")",selector, " --> ", psdLinks);

var oldPsdLinks = psdLinks, newHrefLen = newHref.length, hrefSubstr; psdLinks = []; for( var i = 0; i < oldPsdLinks.length; i++ ) { hrefSubstr = oldPsdLinks[i].getAttribute( "href" ).substring( newHrefLen ); if( !hrefSubstr || hrefSubstr.indexOf( "#" ) === 0 ) { psdLinks.push( oldPsdLinks[i] ); }       }

// Narrow down by entire textContent of list element var psdCorrLinks = []; // the corresponding link elem(s) if( liveDupeLinkIdx === null ) { for( var i = 0; i < psdLinks.length; i++ ) { var psdContainer = ascendToCommentContainer( psdLinks[i], /* live */ false, true ); //console.log("psdContainer",psdContainer); var psdTextContent = normalizeTextContent( surrTextContentFromElem( psdContainer[0] ) ); //console.log(i,">>>"+psdTextContent+"<<<"); if( psdTextContent === liveTextContent ) { psdCorrLinks.push( psdLinks[i] ); } /* else { //console.log(i,"len: psd live",psdTextContent.length,liveTextContent.length); for(var j = 0; j < Math.min(psdTextContent.length, liveTextContent.length); j++) { if(psdTextContent.charAt(j)!==liveTextContent.charAt(j)) { //console.log(i,j,"psd live", psdTextContent.codePointAt(j), liveTextContent.codePointAt( j ) ); break; }                   }                } */            }        } else { for( var i = 0; i < psdLinks.length; i++ ) { var psdContainer = ascendToCommentContainer( psdLinks[i], /* live */ false ); if( psdContainer.dataset.replyLinkGeCorrCo ) continue; var psdTextContent = normalizeTextContent( surrTextContentFromElem( psdContainer ) ); console.log(i,">>>"+psdTextContent+"<<<"); if( psdTextContent === liveTextContent ) { var psdDupeLinks = psdContainer.querySelectorAll( "a[href='" + newHref + "']" ); psdCorrLinks.push( psdDupeLinks[ liveDupeLinkIdx ] ); }

// Flag to ensure we don't take a link from this container again psdContainer.dataset.replyLinkGeCorrCo = true; }       }

if( psdCorrLinks.length === 0 ) { console.error( "Failed to find a matching comment in the Parsoid DOM." ); return null; } else if( psdCorrLinks.length > 1 ) { console.error( "Found multiple matching comments in the Parsoid DOM." ); return null; }

return psdCorrLinks[0]; }

/**    * Given a page title, the Parsoid output (GET /page/html endpoint) * of that page, page and a DOM object in the current page * corresponding to a link in a signature, locate the section * containing that comment. That section may not be in the provided * page! Returns an object with these properties: *    *  - page: The full title of the page directly containing the *   comment (in its wikitext, not through transclusion). * - sectionName: The anticipated wikitext section name. Should *   appear inside the equal signs at the above index. * - sectionDupeIdx: If there are multiple sections with the same *   name, the 0-based index of the section with the comment among *   those sections. Otherwise, 0. * - sectionLevel: The anticipated wikitext section level (e.g.     *    2 for an h2) * - nearbyMwId: The Parsoid ID of some element near the *   comment (in practice, a userspace link) for jumping purposes. *    * Parsoid is abbreviated here as "psd" in variables and comments. */   function findSection( psdDomPageTitle, psdDomString, sigLinkElem ) { console.log("findSection(",psdDomPageTitle,", ...)");

//console.log(psdDomString);

var domParser = new DOMParser, psdDom = domParser.parseFromString( psdDomString, "text/html" );

var corrLink = getCorrCmt( psdDom, sigLinkElem ); if( corrLink === null ) { return $.when; }       //console.log("STEP 1 SUCCESS",corrLink);

var corrCmt = ascendToCommentContainer( corrLink, /* live */ false );

// Ascend until we hit something in a transclusion var currNode = corrLink; var tsclnId = null; do { if( currNode.getAttribute( "about" ) &&                   currNode.getAttribute( "about" ).indexOf( "#mwt" ) === 0 ) { tsclnId = currNode.getAttribute( "about" ); break; }           currNode = currNode.parentNode; } while( currNode.tagName.toLowerCase !== "html" ); //console.log( "tsclnId", tsclnId );

// Helper function: are we in a pseudo-section? (Unused, at the moment.) function inPseudo( headerElement ) { var currNodeIP = headerElement; // This requires Parsoid HTML v 2.0.0 do { if( currNodeIP.nodeType === 1 && currNodeIP.matches( "section" ) ) { return currNodeIP.dataset.mwSectionId < 0; break; }               currNodeIP = currNodeIP.parentNode; } while( currNodeIP ); return false; }

// Now, get the nearest header above us       var currNode = corrCmt; var nearestHeader = null; var HTML_HEADER_RGX = /^h\d$/; do { if( HTML_HEADER_RGX.exec( currNode.tagName.toLowerCase ) ) { // Commented because I don't think the !inPseudo requirement is necessary 2019-nov-01 //if( !inPseudo( currNode ) ) { nearestHeader = currNode; break; //}           }            var containedHeaders = currNode.querySelectorAll( HEADER_SELECTOR ); if( containedHeaders.length ) { var nearestHdrIdx = containedHeaders.length - 1; // Commented because I don't think the !inPseudo requirement is necessary 2019-nov-01

// TODO this is an extraordinarily silly while loop; it has been temporarily commented 2020-apr-25 //while( nearestHdrIdx >= 0 ){//&& inPseudo( containedHeaders[ nearestHdrIdx ] ) )                //    nearestHdrIdx--;                //}                if( nearestHdrIdx >= 0 ) {                    nearestHeader = containedHeaders[ nearestHdrIdx ];                    break;                }            }            if( currNode.previousElementSibling ) {                currNode = currNode.previousElementSibling;                continue;            }            currNode = currNode.parentNode;        } while( currNode.tagName.toLowerCase !== "body" );

// Get the target page (page actually containing the comment) var targetPage; if( tsclnId === null ) { console.warn( "tsclnId === null" ); targetPage = psdDomPageTitle; } else { var tsclnInfoSel = "*[about='" + tsclnId + "'][typeof='mw:Transclusion']", infoJson = JSON.parse( psdDom.querySelector( tsclnInfoSel ) .dataset.mw );

// First, check the first and last wikitext segments to see if they have the header var firstWktxtSegIdx = 0; while( infoJson.parts[firstWktxtSegIdx].template &&               infoJson.parts[firstWktxtSegIdx].template.target.href.startsWith( "Template:" ) &&                firstWktxtSegIdx < infoJson.parts.length ) { firstWktxtSegIdx++; }           if( firstWktxtSegIdx < infoJson.parts.length && typeof infoJson.parts[firstWktxtSegIdx] === typeof '' ) { var firstWktxtSeg = infoJson.parts[firstWktxtSegIdx]; var headerMatch = null; do { headerMatch = HEADER_REGEX.exec( firstWktxtSeg ); if( headerMatch ) { if( wikitextHeaderEqualsDomHeader( headerMatch[2], nearestHeader.textContent ) ) { targetPage = psdDomPageTitle; break; }                   }                } while( headerMatch ); }       }

if( !targetPage ) { var lastWktxtSegIdx = infoJson.parts.length - 1; while( infoJson.parts[lastWktxtSegIdx].template &&               infoJson.parts[lastWktxtSegIdx].template.target.href.startsWith( "Template:" ) &&                lastWktxtSegIdx >= 0 ) { lastWktxtSegIdx--; }           if( lastWktxtSegIdx >= 0 && typeof infoJson.parts[lastWktxtSegIdx] === typeof '' ) { var lastWktxtSeg = infoJson.parts[lastWktxtSegIdx]; var headerMatch = null; do { headerMatch = HEADER_REGEX.exec( lastWktxtSeg ); if( headerMatch ) { if( wikitextHeaderEqualsDomHeader( headerMatch[2], nearestHeader.textContent ) ) { targetPage = psdDomPageTitle; break; }                   }                } while( headerMatch ); }       }

var recursiveCalls = $.when; if( !targetPage ) { // Recurse on all non-top-level Templates!

var pages = infoJson.parts.filter( function ( part ) {               return part.template &&                    part.template.target &&                    part.template.target.href && ( !part.template.target.href.startsWith("./Template") || ( part.template.target.href.match( new RegExp( '/', 'g' ) ) || [] ).length >= 2 );           } );            if( pages.length ) { var pageNames = pages.map( function ( part ) {                   return part.template.target.href.substring( 2 ); // remove the ./                } ); var deferreds = pageNames.map( function ( pageName ) {                   return $.get( PARSOID_ENDPOINT + encodeURIComponent( pageName ) )                        .then( function ( data ) { return data; } ); // truncate to first argument, which is the data                } ); recursiveCalls = $.when.apply( $, deferreds ).then( function {                    var results = arguments; // use keyword "arguments" to access deferred results                    var deferreds2 = [];                    if( pageNames.length !== results.length ) {                        console.error(pageNames,results);                        throw new Error( "pageNames.length !== results.length: " + pageNames.length + " " + results.length );                    }                    for( var i = 0; i < pageNames.length; i++ ) {                        deferreds2.push( findSection( pageNames[i], results[i], sigLinkElem ) );                    }                    return $.when.apply( $, deferreds2 ).then( function  { var results2 = Array.prototype.slice.call( arguments ); var namesAndResults2 = []; if( pageNames.length !== results2.length ) { throw new Error( "pageNames.length !== results2.length: " + pageNames.length + " " + results2.length ); }                       for( var i = 0; i < pageNames.length; i++ ) { if( results2[i] ) { namesAndResults2.push( [ pageNames[i], results2[i] ] ); }                       }                        if( namesAndResults2.length === 0 ) { return null; } else if( namesAndResults2.length === 1 ) { return namesAndResults2[0][1]; } else { var allSameName = namesAndResults2.every( function ( nameAndResult ) {                               return nameAndResult[0] === namesAndResults2[0][0];                            } ); if( allSameName ) { return namesAndResults2[0][1]; } else { console.error( "WTF", namesAndResults2 ); }                       }                    } );                } );            }        }

return recursiveCalls.then( function ( data ) {           if( data ) {                return data;            } else if( nearestHeader === null ) {                return {                    page: targetPage,                    sectionName: "",                    sectionDupeIdx: 0,                    sectionLevel: 0,                    nearbyMwId: corrCmt.id                };            } else {

// We tried recursing, and it didn't work, so the // section must be on the current page targetPage = psdDomPageTitle;

// Finally, get the index of our nearest header var allHeaders = iterableToList( psdDom.querySelectorAll( HEADER_SELECTOR ) );

var sectionDupeIdx = 0; for( var i = 0; i < allHeaders.length; i++ ) { if( allHeaders[i].textContent === nearestHeader.textContent ) { if( allHeaders[i] === nearestHeader ) { break; } else { sectionDupeIdx++; }                   }                }

var result = { page: targetPage, sectionName: nearestHeader.textContent, sectionDupeIdx: sectionDupeIdx, sectionLevel: nearestHeader.tagName.substring( 1 ), // that is, cut off the "h" at the beginning nearbyMwId: corrCmt.id               }; //console.log("findSection return val: ",result); return result; }       } );    }

/**    * Given some wikitext that's split into sections, return the full * wikitext (including header and newlines until the next header) of    * the section with the given name. To get the content before the * first header, sectionName should be "". *    * Performs a sanity check with the given section name. */   function getSectionWikitext( wikitext, sectionName, sectionDupeIdx ) { console.log("In getSectionWikitext, sectionName = >" + sectionName + "< (wikitext.length = " + wikitext.length + ")"); //console.log("wikitext (first 1000 chars) is " + dirtyWikitext.substring(0, 1000));

// There are certain locations where a header may appear in the // wikitext, but will not be present in the HTML; such as code // blocks or comments. So we keep track of those ranges // and ignore headings inside those. var ignoreSpanStarts = []; // list of ignored span beginnings var ignoreSpanLengths = []; // list of ignored span lengths var IGNORE_RE = /( [\s\S]+?<\/pre>)|( " +                   " " +                    " ";                parent.insertBefore( panelEl, newLinkWrapper.nextSibling );                var replyDialogField = document.getElementById( "reply-dialog-field" );                replyDialogField.style = "padding: 0.625em; min-height: 10em; margin-bottom: 0.75em; line-height: 1.3";                if( window.replyLinkPreloadPing === "always" &&                        cmtAuthor &&                        cmtAuthor !== mw.config.get( "wgUserName" ) &&                        !/(\d+.){3}\d+/.test( cmtAuthor ) ) {                    replyDialogField.value = window.replyLinkPreloadPingTpl.replace( "##", cmtAuthor );                }

// Fill up #reply-link-options function newOption( id, text, defaultOn ) { var newCheckbox = document.createElement( "input" ); newCheckbox.type = "checkbox"; newCheckbox.id = id; if( defaultOn ) { newCheckbox.checked = true; }                   var newLabel = document.createElement( "label" ); newLabel.htmlFor = id; newLabel.appendChild( document.createTextNode( text ) ); document.getElementById( "reply-link-options" ).appendChild( newCheckbox ); document.getElementById( "reply-link-options" ).appendChild( newLabel ); }

// Fetch metadata about this specific comment var ourMetadata = metadata[this.id];

// If the dry-run option is "checkbox", add an option to make it               // a dry run if( window.replyLinkDryRun === "checkbox" ) { newOption( "reply-link-option-dry-run", "Don't actually edit?", true ); }

// If the current section header text indicates an edit request, // offer to mark it as answered if( ourMetadata[1] && EDIT_REQ_REGEX.test( ourMetadata[1][1] ) ) { newOption( "reply-link-option-edit-req", "Mark edit request as answered?", false ); }

// If the previous comment was indented by OUTDENT_THRESH, // offer to outdent if( ourMetadata[0].length >= OUTDENT_THRESH ) { newOption( "reply-link-option-outdent", "Outdent?", false ); }

if( window.replyLinkAutoIndentation === "checkbox" ) { newOption( "reply-link-option-auto-indent", mw.msg( "rl-auto-indent" ), true ); }

/* Commented out because I could never get it to work // Autofill with a recommendation if we're replying to a nom if( rplyToXfdNom ) { replyDialogField.value = "Comment";

// Highlight the "Comment" part so the user can change it                   var range = document.createRange; range.selectNodeContents( replyDialogField ); //range.setStart( replyDialogField, 3 ); // start of "Comment" //range.setEnd( replyDialogField, 10 ); // end of "Comment" var sel = window.getSelection; sel.removeAllRanges; sel.addRange( range ); }*/

// Close handler window.onbeforeunload = function ( e ) { if( !replyWasSaved &&                           document.getElementById( "reply-dialog-field" ) &&                            document.getElementById( "reply-dialog-field" ).value ) { var txt = mw.msg( "rl-started-reply" ); e.returnValue = txt; return txt; }               };

// Called by the "Reply" button, Ctrl-Enter in the text area, and // Enter/Ctrl-Enter in the summary field function startReply {

// Change UI to make it clear we're performing an operation document.getElementById( "reply-dialog-field" ).style["background-image"] = "url(" + window.replyLinkPendingImageUrl + ")"; document.querySelector( "#reply-link-buttons button" ).disabled = true; setStatus( mw.msg( "rl-loading" ) );

var parsoidUrl = PARSOID_ENDPOINT + encodeURIComponent( currentPageName ) + "/" + mw.config.get( "wgCurRevisionId" ), findSectionResultPromise = $.get( parsoidUrl ) .then( function ( parsoidDomString ) {                               return findSection( currentPageName, parsoidDomString, cmtLink );                        },console.error );

var revObjPromise = findSectionResultPromise.then( function ( findSectionResult ) {                       console.log( "findSectionResult ", findSectionResult );                        return getWikitext( findSectionResult.page );                    },console.error );

$.when( findSectionResultPromise, revObjPromise ).then( function ( findSectionResult, revObj ) {                       // ourMetadata contains data in the format:                        // [indentation, header, sigIdx]                        doReply( ourMetadata[0], ourMetadata[1], ourMetadata[2], cmtAuthor, rplyToXfdNom, revObj, findSectionResult );                   }, function (e) { setStatusError(new Error(e))} ); }

// Event listener for the "Reply" button document.getElementById( "reply-dialog-button" ) .addEventListener( "click", startReply );

// Event listener for the text area document.getElementById( "reply-dialog-field" ) .addEventListener( "keydown", function ( e ) {                       if( e.ctrlKey && ( e.keyCode == 10 || e.keyCode == 13 ) ) {                            startReply;                        }                    } );

// Event listener for the "Preview" button document.getElementById( "reply-link-preview-button" ) .addEventListener( "click", function {                        var reply = document.getElementById( "reply-dialog-field" ).value.trim;

// Add a signature if one isn't already there if( !hasSig( reply ) ) { reply += " " + ( window.replyLinkSigPrefix ?                               window.replyLinkSigPrefix : "" ) + LITERAL_SIGNATURE; }

var sanitizedCode = encodeURIComponent( reply ); $.post( "https:" + mw.config.get( "wgServer" ) +                           "/w/api.php?action=parse&format=json&title=" + currentPageName + "&text=" + sanitizedCode                                + "&pst=1",                            function ( res ) {                                if ( !res || !res.parse || !res.parse.text ) return console.log( "Preview failed" );                                document.getElementById( "reply-link-preview" ).innerHTML = res.parse.text['*'];                                // Add target="_blank" to links to make them open in a new tab by default                                var links = document.querySelectorAll( "#reply-link-preview a" );                                for( var i = 0, n = links.length; i < n; i++ ) {                                    links[i].setAttribute( "target", "_blank" );                                } } );                   } );

if( window.replyLinkPreloadPing === "button" ) { document.getElementById( "reply-link-ping-button" ) .addEventListener( "click", function {                            replyDialogField.value = window.replyLinkPreloadPingTpl                                .replace( "##", cmtAuthor ) + replyDialogField.value;                        } ); }

// Event listener for the "Cancel" button document.getElementById( "reply-link-cancel-button" ) .addEventListener( "click", function {                        newLink.textContent = linkLabel;                        panelEl.remove;                    } );

// Event listeners for the custom edit summary field if( window.replyLinkCustomSummary ) { document.getElementById( "reply-link-summary" ) .addEventListener( "keydown", function ( e ) {                           if( e.keyCode == 10 || e.keyCode == 13 ) {                                startReply;                            }                        } ); }

if( window.replyLinkTestInstantReply ) { startReply; }           }.bind( this ) );

// Cancel default event handler evt.preventDefault; return false; }   }

/**    * Adds a "(reply)" link after the provided text node, giving it     * the provided element id. anyIndentation is true if there's any * indentation (i.e. indentation string is not the empty string) */   function attachLinkAfterNode( node, preferredId, anyIndentation ) {

// Choose a parent node - walk up tree until we're under a dd, li, // p, or div. This walk is a bit unsafe, but this function should // only get called in a place where the walk will succeed. var parent = node; do { parent = parent.parentNode; } while( !( /^(p|dd|li|div|td)$/.test( parent.tagName.toLowerCase ) ) );

// Determine whether we're replying to an XfD nom var rplyToXfdNom = false; if( xfdType === "AfD" || xfdType === "MfD" ) {

// If the comment is non-indented, we are replying to a nom rplyToXfdNom = !anyIndentation; } else if( xfdType === "TfD" || xfdType === "FfD" ) {

// If the sibling before the previous sibling of this node // is a h4, then this is a nom rplyToXfdNom = parent.previousElementSibling && parent.previousElementSibling.previousElementSibling && parent.previousElementSibling.previousElementSibling.nodeType === 1 && parent.previousElementSibling.previousElementSibling.tagName.toLowerCase === "h4"; } else if( xfdType === "CfD" ) {

// If our grandparent is a dl and our grandparent's previous // sibling is a h4, then this is a nom rplyToXfdNom = parent.parentNode.tagName.toLowerCase === "dl" && parent.parentNode.previousElementSibling.nodeType === 1 && parent.parentNode.previousElementSibling.tagName.toLowerCase === "h4"; }

// Choose link label: if we're replying to an XfD, customize it       var linkLabel = mw.msg( "rl-reply-label" ) + ( rplyToXfdNom ? mw.msg( "rl-to-label" ) + xfdType : "" );

// Construct new link var newLinkWrapper = document.createElement( "span" ); newLinkWrapper.className = "reply-link-wrapper"; var newLink = document.createElement( "a" ); newLink.href = "#"; newLink.id = preferredId; newLink.dataset.originalLabel = linkLabel; newLink.appendChild( document.createTextNode( linkLabel ) ); newLink.addEventListener( "click", handleWrapperClick( linkLabel, parent, rplyToXfdNom ) ); newLinkWrapper.appendChild( document.createTextNode( " (" ) );       newLinkWrapper.appendChild( newLink );        newLinkWrapper.appendChild( document.createTextNode( ")" ) );

// Insert new link into DOM parent.insertBefore( newLinkWrapper, node.nextSibling ); }

/**    * Uses attachLinkAfterTextNode to add a reply link after every * timestamp on the page. */   function attachLinks  { var mainContent = findMainContentEl; if( !mainContent ) { console.error( "No main content element found; exiting." ); return; }

var contentEls = mainContent.children;

// Find the index of the first header in contentEls var headerIndex = 0; for( headerIndex = 0; headerIndex < contentEls.length; headerIndex++ ) { if( contentEls[ headerIndex ].tagName.toLowerCase.startsWith( "h" ) ) break; }

// If we didn't find any headers at all, that's a problem and we       // should bail if( mainContent.querySelector( "div.hover-edit-section" ) ) { headerIndex = 0; } else if( headerIndex === contentEls.length ) { console.error( "Didn't find any headers - hit end of loop!" ); return; }

// We also should include the first header if( headerIndex > 0 ) { headerIndex--; }

// Each element is a 2-element list of [level, node] var parseStack = iterableToList( contentEls ).slice( headerIndex ); parseStack.reverse; parseStack = parseStack.map( function ( el ) { return [ "", el ]; } );

// Main parse loop var node; var currIndentation; // A string of symbols, like ":*::" var newIndentSymbol; var stackEl; // current element from the parse stack var idNum = 0; // used to make id's for the links var linkId = ""; // will be the element id for this link while( parseStack.length ) { stackEl = parseStack.pop; node = stackEl[1]; currIndentation = stackEl[0];

// Compatibility with "Comments in Local Time" var isLocalCommentsSpan = node.nodeType === 1 && "span" === node.tagName.toLowerCase && node.className.includes( "localcomments" );

var isSmall = node.nodeType === 1 && (                   node.tagName.toLowerCase === "small" ||                    ( node.tagName.toLowerCase === "span" && node.style && node.style.getPropertyValue( "font-size" ) === "85%" ) );

// Small nodes are okay, unless they're delsort notices var isOkSmallNode = isSmall && !node.className.includes( "delsort-notice" );

if( ( node.nodeType === 3 ) ||                   isOkSmallNode ||                    isLocalCommentsSpan )  {

// If the current node has a timestamp, attach a link to it               // Also, no links after timestamps, because it's just like // having normal text afterwards, which is rejected (because               // that means someone put a timestamp in the middle of a                // paragraph) var hasLinkAfterwardsNotInBlockEl = node.nextElementSibling && ( node.nextElementSibling.tagName.toLowerCase === "a" ||                       ( node.nextElementSibling.tagName.match( /^(span|small)$/i ) && node.nextElementSibling.querySelector( "a" ) ) ); if( TIMESTAMP_REGEX.test( node.textContent ) &&                       ( node.previousSibling || isSmall ) &&                        !hasLinkAfterwardsNotInBlockEl ) { linkId = "reply-link-" + idNum; attachLinkAfterNode( node, linkId, !!currIndentation ); idNum++;

// Update global metadata dictionary metadata[linkId] = currIndentation; }           } else if( node.nodeType === 1 &&                    /^(div|p|dl|dd|ul|li|span|ol|table|tbody|tr|td)$/.test( node.tagName.toLowerCase ) ) { switch( node.tagName.toLowerCase ) { case "dl": newIndentSymbol = ":"; break; case "ul": newIndentSymbol = "*"; break; case "ol": newIndentSymbol = "#"; break; case "div": if( node.className.includes( "xfd_relist" ) ) { continue; }                       break; default: newIndentSymbol = ""; break; }

var childNodes = node.childNodes; for( let i = 0, numNodes = childNodes.length; i < numNodes; i++ ) { parseStack.push( [ currIndentation + newIndentSymbol,                       childNodes[i] ] ); }           }        }

// This loop adds two entries in the metadata dictionary: // the header data, and the sigIdx values var sigIdxEls = iterableToList( mainContent.querySelectorAll( HEADER_SELECTOR + ",span.reply-link-wrapper a" ) ); var currSigIdx = 0, j, numSigIdxEls, currHeaderEl, currHeaderData; var headerIdx = 0; // index of the current header var headerLvl = 0; // level of the current header for( j = 0, numSigIdxEls = sigIdxEls.length; j < numSigIdxEls; j++ ) { var headerTagNameMatch = /^h(\d+)$/.exec(               sigIdxEls[j].tagName.toLowerCase ); if( headerTagNameMatch ) { currHeaderEl = sigIdxEls[j];

// Test to make sure we're not in the table of contents if( currHeaderEl.parentNode.className === "toctitle" ) { continue; }

// Reset signature counter currSigIdx = 0;

// Dig down one level for the header text because // MW buries the text in a span inside the header var headlineEl = null; if( currHeaderEl.childNodes[0].className &&                   currHeaderEl.childNodes[0].className.includes( "mw-headline" ) ) { headlineEl = currHeaderEl.childNodes[0]; } else { for( var i = 0; i < currHeaderEl.childNodes.length; i++ ) { if( currHeaderEl.childNodes[i].className &&                               currHeaderEl.childNodes[i].className.includes( "mw-headline" ) ) { headlineEl = currHeaderEl.childNodes[i]; break; }                   }                }

var headerName = null; if( headlineEl ) { headerName = headlineEl.textContent; }

if( headerName === null ) { console.error( currHeaderEl ); throw "Couldn't parse a header element!"; }

headerLvl = headerTagNameMatch[1]; currHeaderData = [ headerLvl, headerName, headerIdx ]; headerIdx++; } else {

// Save all the metadata for this link currIndentation = metadata[ sigIdxEls[j].id ]; metadata[ sigIdxEls[j].id ] = [ currIndentation, currHeaderData ? currHeaderData.slice(0) : null, currSigIdx ]; currSigIdx++; }       }        //console.log(metadata);

// Disable links inside hatnotes, archived discussions var badRegionsSelector = [ "div.archived", "div.resolved", "table" ].map( function ( s ) { return s + " .reply-link-wrapper" } ).join( "," ); var insideArchived = mainContent.querySelectorAll( badRegionsSelector ); for( var i = 0; i < insideArchived.length; i++ ) { insideArchived[i].parentNode.removeChild( insideArchived[i] ); }   }

function runTestMode {

// We never want to make actual edits window.replyLinkDryRun = "always";

// Simulate having a panel open $( "#mw-content-text" ) .append( $( " " )               .append( $( " " ).attr( "id", "reply-dialog-field" ).val( "hi" ) )                .append( $( " " ).attr( "id", "reply-link-buttons" ) .append( $( " " ) ) ) );

mw.util.addCSS( ".reply-link-wrapper { background-color: orange; }" );

// Fetch content, Parsoid DOM, etc var parsoidUrl = PARSOID_ENDPOINT + encodeURIComponent( currentPageName ); $.when(           $.get( parsoidUrl ),            api.loadMessages( INT_MSG_KEYS )        ).then( function ( parsoidDomString, _ ) {            buildUserspcLinkRgx;

// Statistics variables var successes = 0, failures = 0;

// Run one test on a wrapper link function runOneTestOn( wrapper ) { try { var cmtAuthorAndLink = getCommentAuthor( wrapper ), cmtAuthor = cmtAuthorAndLink.username, cmtLink = cmtAuthorAndLink.link; var ourMetadata = metadata[ wrapper.children[0].id ]; findSection( currentPageName, parsoidDomString, cmtLink ).then( function ( findSectionResult ) {                       var revObjPromise = getWikitext( findSectionResult.page, /* useCaching */ true );                        $.when( findSectionResult, revObjPromise ).then( function ( findSectionResult, revObj ) { doReply( ourMetadata[0], ourMetadata[1], ourMetadata[2],                                       cmtAuthor, false, revObj, findSectionResult ).done( function  {                                            wrapper.style.background = "green";                                            successes++;                                        } ).fail( function  {                                            wrapper.style.background = "red";                                            failures++;                                        } ); }, function ( e ) { wrapper.style.background = "red"; failures++; } );                   } );                } catch ( e ) { console.error( e ); wrapper.style.background = "red"; failures++; }           }

var wrappers = Array.from( document.querySelectorAll( ".reply-link-wrapper" ) ); function runOneTest { var wrapper = wrappers.shift; if( wrapper ) { runOneTestOn( wrapper ); setTimeout( runOneTest, 750 ); } else { var results = successes + " successes, " + failures + " failures"; $( "#mw-content-text" ).prepend( results ).append( results ); }           }            //console.log = function {}; setTimeout( runOneTest, 0 ); } );   }

function onReady { var lang_code = mw.config.get( "wgUserLanguage" ) // Replace default English interface by translation if available var interface_messages = $.extend( {}, i18n.en, i18n[ lang_code.split('-')[0] ], i18n[ lang_code ] ); // Define interface messages mw.messages.set( interface_messages );

// Exit if history page or edit page if( mw.config.get( "wgAction" ) === "history" ) return; if( document.getElementById( "editform" ) ) return;

api = new mw.Api;

mw.util.addCSS(           "#reply-link-panel { padding: 1em; margin-left: 1.6em; "+              "max-width: 1200px; width: 66%; margin-top: 0.5em; }"+            ".gone-on-empty:empty { display: none; }"        );

// Pre-load interface messages; we will check again when a (reply) // link is clicked api.loadMessages( INT_MSG_KEYS );

// Initialize the xfdType global variable, which must happen // before the call to attachLinks currentPageName = mw.config.get( "wgPageName" ); xfdType = ""; if( mw.config.get( "wgNamespaceNumber" ) === 4) { if( currentPageName.startsWith( "Wikipedia:Articles_for_deletion/" ) ) { xfdType = "AfD"; } else if( currentPageName.startsWith( "Wikipedia:Miscellany_for_deletion/" ) ) { xfdType = "MfD"; } else if( currentPageName.startsWith( "Wikipedia:Templates_for_discussion/Log/" ) ) { xfdType = "TfD"; } else if( currentPageName.startsWith( "Wikipedia:Categories_for_discussion/Log/" ) ) { xfdType = "CfD"; } else if( currentPageName.startsWith( "Wikipedia:Files_for_discussion/" ) ) { xfdType = "FfD"; }       }

// Default values for some preferences if( window.replyLinkAutoReload === undefined ) window.replyLinkAutoReload = true; if( window.replyLinkDryRun === undefined ) window.replyLinkDryRun = "never"; if( window.replyLinkPreloadPing === undefined ) window.replyLinkPreloadPing = "always"; if( window.replyLinkPreloadPingTpl === undefined ) window.replyLinkPreloadPingTpl = ", "; if( window.replyLinkCustomSummary === undefined ) window.replyLinkCustomSummary = false; if( window.replyLinkTestMode === undefined ) window.replyLinkTestMode = false; if( window.replyLinkTestInstantReply === undefined) window.replyLinkTestInstantReply = false; if( window.replyLinkAutoIndentation === undefined ) window.replyLinkAutoIndentation = "checkbox";

// Insert "reply" links into DOM attachLinks;

// If test mode is enabled, create a link for that if( window.replyLinkTestMode ) { mw.util.addPortletLink( "p-cactions", "#", "reply-link test mode", "pt-reply-link-test" ) .addEventListener( "click", runTestMode ); }

// This large string creats the "pending" texture window.replyLinkPendingImageUrl = "data:image/gif;base64,R0lGODlhGAAYAKIGAP7+/vv7+/Ly8u/v7+7u7v///////wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAGACwAAAAAGAAYAAADU0hKAvUwvjCWbTIXahfWEdcxDgiJ3Wdu1UiUK5quUzuqoHzBuZ3yGp0HmBEqcEHfjmYkMZXDp8sZgx6JkiayaKWatFhJd1uckrPWcygdXrvUJ1sCACH5BAUAAAYALAAAAAAYABgAAANTSLokUDBKGAZbbupSr8qb1HlgSFnkY55eo67jVZoxM4c189IoubKtmyaH2W2IH+OwJ1NOkK4fVPhk2pwia1GqTXJbUVg3zANTs2asZHwWpX+cQQIAIfkEBQAABgAsAAAAABgAGAAAA1E4tLwCJcoZQ2uP6hLUJdk2dR8IiRL5hSjnXSyqwmc7Y7X84m21MzHRrZET/oA9V8nUGwKLGqcDSpEybcdpM3vVLYNRLrgqpo7K2685hcaqkwkAIfkEBQAABgAsAAAAABgAGAAAA1RYFUP+TgBFq2IQSstxjhNnNR+xiVVQmiF6kdnpLrDWul58o7k9vyUZrvYQ8oigHy24E/UgzQ4yonwWo6kp62dNzrrbr9YoXZEt4HPWjKWk20CmKwEAIfkEBQAABgAsAAAAABgAGAAAA1NYWjH08Amwam0xTstxlhR3OR+xiYv3nahCrmHLlGbcqpqN4hB7vzmZggcSMoA9nYhYMzJ9O2RRyCQoO1KJM9uUVaFYGtjyvY7E5hR3fC6x1WhRAgAh+QQFAAAGACwAAAAAGAAYAAADVFi6FUMwQgGYVU5Kem3WU9UtH8iN2AMSJ1pq7fhuoquaNXrDubyyvc4shCLtIjHZkVhsLIFN5yopfFIvQ2gze/U8CUHsVxDNam2/rjEdZpjVKTYjAQAh+QQFAAAGACwAAAAAGAAYAAADU1i6G0MwQgGYVU5Kem3WU9U1D0hwI1aCaPqxortq7fjSsT1veXfzqcUuUrOZTj3fEBlUmYrKZ/LyCzULVWYzC6Uuu57vNHwcM7KnKxpMOrKdUkUCACH5BAUAAAYALAAAAAAYABgAAANTWLqsMSTKKEC7b856W9aU1S0fyI0OBBInWmrt+G6iq5q1fMN5N0sx346GSq1YPcwQmLwsQ0XHMShcUZXWpud53WajhR8SLO4yytozN016EthGawIAIfkEBQAABgAsAAAAABgAGAAAA1MoUNzOYZBJ53o41ipwltukeI4WEiMJgWGqmu31sptLwrV805zu4T3V6oTyfYi2H4+SPJ6aDyDTiFmKqFEktmSFRrvbhrQoHMbKhbGX+wybc+hxAgAh+QQFAAAGACwAAAAAGAAYAAADVEgqUP7QhaHqajFPW1nWFEd4H7SJBFZKoSisz+mqpcyRq23hdXvTH10HCEKNiBHhBVZQHplOXtC3Q5qoQyh2CYtaIdsn1CidosrFGbO5RSfb35gvAQAh+QQFAAAGACwAAAAAGAAYAAADU0iqAvUwvjCWbTIXahfWEdcRHzhVY2mKnQqynWOeIzPTtZvBl7yiKd8L2BJqeB7jjti7IRlKyZMUDTGTzis0W6Nyc1XIVJfRep1dslSrtoJvG1QCACH5BAUAAAYALAAAAAAYABgAAANSSLoqUDBKGAZbbupSb3ub1HlZGI1XaXIWCa4oo5ox9tJteof1sm+9xoqS0w2DhBmwKPtNkEoN1Cli2o7WD9ajhWWT1NM3+hyHiVzwlkuemIecBAAh+QQFAAAGACwAAAAAGAAYAAADUxhD3CygyEnlcg3WXQLOEUcpH6GJE/mdaHdhLKrCYTs7sXiDrbQ/NdkLF9QNHUXO79FzlUzJyhLam+Y21ujoyLNxgdUv1fu8SsXmbVmbQrN97l4CACH5BAUAAAYALAAAAAAYABgAAANSWBpD/k4ARetq8EnLWdYTV3kfsYkV9p3oUpphW5AZ29KQjeKgfJU6ES8Su6lyxd2x5xvCfLPlIymURqDOpywbtHCpXqvW+OqOxGbKt4kGn8vuBAAh+QQFAAAGACwAAAAAGAAYAAADU1iqMfTwCbBqbTFOy3GWFHc5H7GJi/edaKFmbEuuYeuWZt2+UIzyIBtjptH9iD2jCJgTupBBIdO3hDalVoKykxU4mddddzvCUS3gc7mkTo2xZmUCACH5BAUAAAYALAAAAAAYABgAAANTWLoaQzBCAZhtT0Z6rdNb1S0fSHAjZp5iWoKom8Ht+GqxPeP1uEs52yrYuYVSpN+kV1SykCoatGBcTqtPKJZ42TK7TsLXExZcy+PkMB2VIrHZQgIAIfkEBQAABgAsAAAAABgAGAAAA1RYuhxDMEIBmFVOSnpt1lPVLR/IjdgDEidaau34bqKrmrV8w3k3RzHfjoZaDIE934qVvPyYxdQqKJw2PUdo9El1ZrtYa7TAvTayBDMJLRg/tbYlJwEAIfkEBQAABgAsAAAAABgAGAAAA1IItdwbg8gphbsFUioUZtpWeV8WiURXPqeorqFLfvH2ljU3Y/l00y3b7tIbrUyo1NBRVB6bv09Qd8wko7yp8al1clFYYjfMHC/L4HOjSF6bq80EACH5BAUAAAYALAAAAAAYABgAAANTSALV/i0MQqtiMEtrcX4bRwkfFIpL6Zxcqhas5apxNZf16OGTeL2wHmr3yf1exltR2CJqmDKnCWqTgqg6YAF7RPq6NKxy6Rs/y9YrWpszT9fAWgIAOw==";

}

mw.loader.load( "mediawiki.ui.input", "text/css" ); mw.loader.using( [ "mediawiki.util", "mediawiki.api" ] ).then( function {        mw.hook( "wikipage.content" ).add( onReady );    } );

$.getScript('https://en.wikipedia.org/w/index.php?title=User:Enterprisey/parsoid-jump.js&action=raw&ctype=text%2Fjavascript');

// Return functions for testing return { "iterableToList": iterableToList, "sigIdxToStrIdx": sigIdxToStrIdx, "insertTextAfterIdx": insertTextAfterIdx, "wikitextToTextContent": wikitextToTextContent }; }

// Export functions for testing if( typeof module === typeof {} ) { module.exports = { "loadReplyLink": loadReplyLink }; }

// If we're in the right environment, load the script if( jQuery !== undefined && mediaWiki !== undefined ) { var currNamespace = mw.config.get( "wgNamespaceNumber" );

// Also enable on T:TDYK and its subpages var ttdykPage = mw.config.get( "wgPageName" ).indexOf( "Template:Did_you_know_nominations" ) === 0;

// Normal "read" view and not a diff view var normalView = mw.config.get( "wgIsArticle" ) && !mw.config.get( "wgDiffOldId" );

if ( normalView && ( currNamespace % 2 === 1 || currNamespace === 4 || ttdykPage ) ) { loadReplyLink( jQuery, mediaWiki ); } } // // /* Cat-a-lot - changes category of multiple files */ mw.loader.using(['jquery.ui', 'mediawiki.util'], function{	mw.loader.load('//commons.wikimedia.org/w/load.php?modules=ext.gadget.Cat-a-lot'); }); ////////// Cat-a-lot user preferences ////////// window.catALotPrefs = {"watchlist":"preferences","minor":true,"editpages":true,"docleanup":false,"subcatcount":10}; ////////////////////////////////////catALotEnd// //

title: User:Koavf/common.js


text:
rovinaticcio

Etymology
From.

Adjective

 * 1) somewhat ruined

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: rovinaticcio


text: hēiqiǎokèlì

title: hēiqiǎokèlì


text: Kǎ'ěrjiālǐ

title: Kǎ'ěrjiālǐ


text:
kuormitushuippu

Noun

 * 1) load peak

title: kuormitushuippu


text:
kuormituskoe

Noun

 * 1) load test, stress test

title: kuormituskoe


text:
kuoro-osa

Noun

 * 1) chorale, choral part

title: kuoro-osa


text:
kuoroesitys

Noun

 * 1) choir performance, choral performance

title: kuoroesitys


text:
kuorokohtaus

Noun

 * 1) choral scene

title: kuorokohtaus


text:
kuorolausunta

Noun

 * 1) choral speaking

title: kuorolausunta


text:
kuorolainen

Noun

 * 1) chorister

title: kuorolainen


text:
kuorolaulu

Noun

 * 1) choir singing, choral singing, chorus

title: kuorolaulu


text:
kuoromusiikki

Noun

 * 1) choral music

title: kuoromusiikki


text:
kuorosovitus

Noun

 * 1) choral arrangement

title: kuorosovitus


text:
kuorosävellys

Noun

 * 1) choral composition

title: kuorosävellys


text:
kuorosäveltäjä

Noun

 * 1) choral composer

title: kuorosäveltäjä


text:
kuoroteos

Noun

 * 1) choral work

title: kuoroteos


text: Yàbódá

title: Yàbódá


text: Kuíběikè

title: Kuíběikè


text:
PR China

Proper noun

 * 1) People’s Republic of China

title: PR China


text:
Template:oj-vii "d-final" conjugation/documentation

This template generates a conjugation table for Ojibwe inanimate intransitive verbs (vii) that end in /d/.


text:
roikale

Etymology
From the same root as. The dialectal sense "repulsive person" is probably by confluence with.

Noun

 * 1) tall person or thing, giant, whopper
 * 2)  sluggish or repulsive man or person

title: roikale


text: Guǎngzhōuwān

title: Guǎngzhōuwān


text:
steekkweek

Noun

 * , one of several species known as bushman grass.

title: steekkweek


text:
եզրափակել

Verb

 * 1)  to conclude

title: եզրափակել


text: fútèjiā

title: fútèjiā


text:
twagras

Etymology
From.

Noun

 * 1) Any of the species of the grass genus  sensu lato growing in southern Africa; bushman grass.

title: twagras


text: ゑんりよ

title: ゑんりよ


text:
boesmangras

Noun

 * 1)  Any of the species of the grass genus  sensu lato growing in southern Africa.

Usage notes
Proscribed by Hauptfleisch (1993) due to formation from.

title: boesmangras


text: Template:RQ:pi:Sinhala Majjhimanikaya 2

title: Template:RQ:pi:Sinhala Majjhimanikaya 2


text:
tenterground

Noun

 * 1) An area used for drying newly manufactured cloth after fulling.

title: tenterground


text: tentergrounds

title: tentergrounds


text:
Boesman

Etymology
From.

Noun

 * 1)  Bushman

title: Boesman


text: Category:Russian endearing terms

title: Category:Russian endearing terms


text: Category:Endearing terms by language

title: Category:Endearing terms by language


text: Category:Ukrainian endearing terms

title: Category:Ukrainian endearing terms


text:
Template:RQ:pi:Sinhala Majjhimanikaya 2 quote

Specimen output:


text: Category:Polish endearing terms

title: Category:Polish endearing terms


text: Boesmans

title: Boesmans


text:
Talk:-d

Alternative form of -ed now only standard with words which end in -e
That statement is wrong; the omission of final -e before -ing shows the alternation is in the base --Backinstadiums (talk) 21:21, 3 July 2020 (UTC)

title: Talk:-d


text:
Template:Tuvan interrogative pronouns

Tuvan interrogative pronouns

title: Template:Tuvan interrogative pronouns


text:
Talk:中元

Also a Japanese surname?
Is this also a Japanese surname? 173.88.246.138 21:40, 3 July 2020 (UTC)
 * What makes you think so? —Suzukaze-c (talk) 05:02, 11 July 2020 (UTC)

title: Talk:中元


text:
Module:RQ:pi:Sinhala Majjhimanikaya 2

data = {} data.reference = "RQ:pi:Sinhala Majjhimanikaya 2" data.lang = 'pi'

-- Authoritative source: -- http://www.aathaapi.net/tipitaka/10.OTSPDN1_Deegha_Nikaya_1.pdf

-- Series info: -- https://tipitaka.wordpress.com/2007/05/21/buddhajayanthi-edition/

-- Copiable text, to be corrected (nearly all Sinhala consonant clusters are wrong!): -- https://www.tipitaka.org/sinh/

-- Transliteration source (to be verified - there are small differences): -- https://www.tipitaka.org/romn/ -- Path: Tipiṭaka (Mūla), Vinayapiṭaka, Suttapiṭaka, Majjhimanikāya

--Page number is from the Sinhala edition.

-- Translation source: -- https://suttacentral.net/mnxx/en/sujato for Sutta xx. -- Adapted for context and to better display words.

-- Sutta 89 (Numbered 2.4.9 in book) data[558] = { -- p.558 --Paragrpah start here. punacaparam = { "{1-{2-පුන} {3-ච} {4-පරං}} {5-භන‍්තෙ}, ".. "{6-ඉමෙ} {43-{7-ඉසිදත‍්ත}{8-පුරාණා}} {9-ථපතයො} {44-{10-මම}}{11-භත‍්තා} ".. "{44-{10-මම}}{12-යානා} {44-{13-අහං}} {14-නෙසං} {15-ජීවිතස‍්ස} {16-පදාතා} ".. "{17-යසස‍්ස} {18-ආහත‍්තා} {19-{20-අථ} {3-ච} {21-පන}} ".. "{22-නො} {23-තථා} {44-{24-මයි}} {25-නිපච‍්චාකාරං} {26-කරොන‍්ති} ".. "{27-යථා} {28-භගවති}. ", "{1-{2-Puna} {3-ca} {4-paraṃ}} {5-bhante}, ".. "{6-ime} {43-{7-isidatta}{8-purāṇā} {9-thapatayo}} {44-{10-mama}}{11-bhattā} ".. "{44-{10-mama}}{12-yānā} {44-{13-ahaṃ}} {14-nesaṃ} {15-jīvitassa} {16-padātā} ".. "{17-yasassa} {18-āhattā} {19-{20-atha} {3-ca} {21-pana}} ".. "{22-no} {23-tathā} {44-{24-mayi}} {25-nipaccākāraṃ} {26-karonti} ".. "{27-yathā} {28-bhagavati}.", "{1-Furthermore}, {30-sir}, {6-these} {43-{9-chamberlains} ".. "{7-Isidatta} and {8-Purāṇa}} share {44-{10-my}} {11-meals} and ".. "{44-{10-my}} {12-carriages}. {44-{13-I}} {16-give} {14-them} ".. "{15-a livelihood} and {18-bring} {14-them} {17-renown}. ".. "{19-{3-And} yet} {26-they} {22-don’t} {26-show} {44-{24-me}} ".. "{23-the same level of} {25-devotion} {27-that} {26-they show} ".. "{28-to the Buddha}." },	bhutapubbaham = { "{29-භූතපු{13-බ‍්බා}}{13-හං} ".. "{30-භන‍්තෙ} {31-සෙනං} {32-අබභූය්‍යානො} {33-සමානො} ".. "{34-ඉ{35-මෙ}}{35-ව} {43-{7-ඉසිදත‍්ත}{8-පුරාණා}} ".. "{9-ථපතයො} {36-වීමංසමානො} {37-අඤ‍්ඤතරස‍්මිං} {38-සම‍්බාධෙ} ".. "{39-ආවසථෙ} {40-{41-වාසං} {42-උපගඤ‍්ඡිං}}.", "{29-Bhūtapubb}{13-{29-ā}haṃ} ".. "{30-bhante} {31-senaṃ} {32-abbhūyyāno} {33-samāno} ".. "{34-im{35-e}}{35-va} {43-{7-isidatta}{8-purāṇā} ".. "{9-thapatayo}} {36-vīmaṃsamāno} {37-aññatarasmiṃ} {38-sambādhe} ".. "{39-āvasathe} {40-{41-vāsaṃ} {42-upagañchiṃ}}.", -- {30-}{29-Once it so happened that while} {13-I} {32-was leading} {31-a military campaign} {33-and} {36-testing} {43-{7-Isidatta} and {8-Purāṇa}}{34-}{35-} {40-{42-I took up} {41-residence}} {39-in} {37-a certain} {38-cramped} {39-house}. "{29-Once}, {30-sir}, {19-while} {13-I} {32-was leading} {31-the army} ".. "{32-on campaign} {33-and at the same time} {36-testing} {34-these} ".. "{35-self-same} {43-{9-chamberlains} {7-Isidatta} and {8-Purāṇa}} ".. "{40-{42-I took up} {41-residence}} {39-in} {37-a certain} ".. "{38-cramped} {39-house}." } } return data

title: Module:RQ:pi:Sinhala Majjhimanikaya 2


text: Etchingham

title: Etchingham


text: うみのさち

title: うみのさち


text: umi no sachi

title: umi no sachi


text: Category:af:Ethnonyms

title: Category:af:Ethnonyms


text:
Twa

Proper noun

 * 1) Any of several pygmy tribes of sub-Saharan Africa, or a member of one of those tribes.

Proper noun

 * 1) Twa

title: Twa


text:
신기

Etymology 1
.

Etymology 2
.

title: 신기


text: Batwa

title: Batwa


text: Flimwell

title: Flimwell


title: User:Benwing2/uk-freq-fiction


text:
пурха

Noun

 * 1) ceiling

title: пурха


text:
ඉම

Adjective

 * 1)  (“this”)

Pronoun

 * 1)  (“this”)

Declension
As for masculine of adjective above.

Pronoun

 * 1)  (“this”)

Declension
As for neuter of adjective above.

title: ඉම


text:
Ticehurst

Etymology
From an unknown first element +.

Statistics

 * According to the 2010 United States Census, Ticehurst is the 119508th most common surname in the United States, belonging to 145 individuals. Ticehurst is most common among White (95.86%) individuals.

title: Ticehurst


text:
User talk:Benwing2/uk-freq-fiction

Ukrainian frequency list of non-existent terms, from mova.info. Lots of prepositions near the top. Benwing2 (talk) 22:32, 3 July 2020 (UTC)
 * Thanks very much! I know, like with many words it's easier for me to define Ukrainian prepositions in Russian but harder in English because they have too many senses. There's a lot to do here. E.g., hundreds of Belarusian terms missing inflections. I might focus on improving existing entries but will get to this list eventually. --Anatoli T. (обсудить/вклад) 03:54, 4 July 2020 (UTC)

Removed nouns
I can regenerate the list, which will remove the nouns that now have entries. However, the proper nouns and other terms that you removed that don't have entries will reappear. Can you make a list of those terms? I will then manually blacklist them. Thanks! Benwing2 (talk) 07:33, 30 July 2020 (UTC)
 * If it's hard to remove, don't worry, sometimes the capitalisations are wrong too or it's not obvious what they are, e.g. Хоч, Може, Всі. You can drop "абревіатура" I guess. Don't refresh yet, I only created a few. I will ask you again in a while. --Anatoli T. (обсудить/вклад) 07:57, 30 July 2020 (UTC)

title: User talk:Benwing2/uk-freq-fiction


text:
isoviiva

Noun

 * 1) isopleth

title: isoviiva


text: Category:es:Cities in Sonora

title: Category:es:Cities in Sonora


text: Category:Cities in Sonora

title: Category:Cities in Sonora


text:
Álamos

Etymology
From.

title: Álamos


text: Category:es:Places in Sonora

title: Category:es:Places in Sonora


text:
عابس

Etymology
, from the root.

Adjective

 * 1) frowning
 * 2) glum,  morose

title: عابس


text:
Talk:meraklon

RFV discussion: May–June 2020
DTLHS (talk) 19:59, 24 May 2020 (UTC)
 * Unless I'm mistaken, this will hinge on WT:BRAND, since there seem to be enough raw hits to pass otherwise. Chuck Entz (talk) 21:20, 24 May 2020 (UTC)

RFV-failed Kiwima (talk) 21:45, 25 June 2020 (UTC)

title: Talk:meraklon


text:
Talk:neko

RFV discussion: May–June 2020
Rfv-sense: cat DTLHS (talk) 20:14, 26 May 2020 (UTC)

 * Does either sense meet CFI? There's an occasional "Neko girl" (often capitalized): "Suddenly, the Neko girl changed to a cat".  Neko is typically used in the context of animé where people would be likely to write romanized Japanese words.  Vox Sciurorum (talk) 16:26, 7 June 2020 (UTC)

RFV-failed Kiwima (talk) 21:19, 26 June 2020 (UTC)

 * I'll try to put a bunch of links to sources, from a variety of English-speaking websites between here and my signature, that confirm that neko is a unique word in English and DOES NOT mean the same thing as just the romanization of the Japanese 猫.

AnotherNeko (talk) 03:41, 22 September 2020 (UTC)
 * 1) https://nekoarmy.fandom.com/wiki/What_are_Neko%27s%3F
 * 2) this site, https://nekos.life/, focuses on nekos. My observation is that is made by an English-speaking person. The website serves images that are not similar google search results for "猫" (romanized as "neko").
 * 3) the first list item under "see also" here https://en.wikipedia.org/wiki/Neko#See_also says that catgirl (not cat, which is what  means in Japanese) is also known as neko.
 * 4) this very nsfw subreddit https://www.reddit.com/r/NekoIRL/ shows nekos. These are not cats. They don't match any definition of neko currenly available on Wiktionary.

Here's a snippet from WikiFur's disambiguation page on Neko ( https://en.wikifur.com/wiki/Neko ): > Nekomimi ('猫耳, literally "Cat ears""), also known as Nekomusume (猫娘, "cat daughter") or catgirl, a female human/humanoid with such feline traits as cat ears, tail and whiskers, among others. Often called "neko" in English online. AnotherNeko (talk) 03:19, 25 June 2021 (UTC)

title: Talk:neko


text: Aconchi

title: Aconchi


text:
thapati

Etymology

 * compare and.

Noun

 * 1) builder, master carpenter
 * 2) overseer, officer

title: thapati


text: Yécora

title: Yécora


text: Wadhurst

title: Wadhurst


text: Oquitoa

title: Oquitoa


text: でるくぎはうたれる

title: でるくぎはうたれる


text: deru kugi wa utareru

title: deru kugi wa utareru


text: でるくいはうたれる

title: でるくいはうたれる


text: deru kui wa utareru

title: deru kui wa utareru


text: でるところへでる

title: でるところへでる


text: deru tokoro e deru

title: deru tokoro e deru


text: ときはかり

title: ときはかり


text: hompen

title: hompen


text: hompje

title: hompje


text: tokihakari

title: tokihakari


text: 時計り

title: 時計り


text:
yaxşıraq

Etymology
From.

Adjective

 * 1)  better
 * 2) alright, not bad, quite okay

title: yaxşıraq


text: Category:Azerbaijani terms suffixed with -rək


text:
թունդ

Etymology 1
From, from. .

Etymology 2
From. .

Adjective

 * 1) strong, potent
 * 2) fierce, severe; hot-spirited, quarrelsome
 * 3)  dark
 * 1) fierce, severe; hot-spirited, quarrelsome
 * 2)  dark
 * 1) fierce, severe; hot-spirited, quarrelsome
 * 2)  dark
 * 1)  dark

Adverb

 * 1) strongly, severely

title: թունդ


text: pitari

title: pitari


text: sōō

title: sōō


text:
ථපති

Noun

 * 1)  (“builder; officer”)

title: ථපති


text:
환절기

Etymology
.

Noun

 * 1) the change or turning point of seasons

title: 환절기


text: deshō

title: deshō


text: darō

title: darō


text: だろ

title: だろ


text:
お手並み拝見

Etymology
Phrase consisting of 🇰🇲.

Phrase

 * 1) let's see what you've got; show me what you've got

title: お手並み拝見


text: お手並拝見

title: お手並拝見


text: 御手並み拝見

title: 御手並み拝見


text: 御手並拝見

title: 御手並拝見


text: おてなみはいけん

title: おてなみはいけん


text: police work

title: police work


text:
手並み

Etymology
Compound of 🇰🇲.

Noun

 * 1) skill, ability

title: 手並み


text: てなみ

title: てなみ


text: ぎりょう

title: ぎりょう


text:
お手並み

Etymology
From 🇰🇲.

title: お手並み


text: おてなみ

title: おてなみ


text: -ssu

title: -ssu


text: wīssu

title: wīssu


text: wīsu

title: wīsu


text:
честек-кат

Etymology
From +. Cognate to 🇨🇬, 🇨🇬.

Noun

 * 1) strawberry

title: честек-кат


text:
ryukzak

Etymology
, from.

title: ryukzak


text:
Santa Ana

Etymology
From,.

Etymology
,.

title: Santa Ana


text: Huépac

title: Huépac


text: Ímuris

title: Ímuris


text:
厭世的

Etymology
From.

Adjective

 * 1) pessimistic

title: 厭世的


text: えんせいてき

title: えんせいてき


text:
Naco

Proper noun

 * , on the Arizona border

title: Naco


text:
楽天的

Etymology
From.

Adjective

 * 1) optimistic

title: 楽天的


text: らくてんてき

title: らくてんてき


text:
Opata

Noun

 * 1) An indigenous people of northern Sonora.

Proper noun

 * 1) The language of the Opata people.

title: Opata


text:
厭世観

Etymology
From 🇰🇲.

Noun

 * 1) pessimistic view of life; pessimism

title: 厭世観


text: えんせいかん

title: えんせいかん


text:
楽天観

Etymology
From 🇰🇲.

Noun

 * 1) optimistic view of life; optimism

title: 楽天観


text: Divisaderos

title: Divisaderos


text: らくてんかん

title: らくてんかん


text: Atil

title: Atil


text: Caborca

title: Caborca


text:
кады

Adverb

 * 1) together

Verb

 * 1) water jug

title: кады


text: こしょばい

title: こしょばい


text:
ырак

Etymology
From. Cognate with 🇨🇬.

Adjective

 * 1) remote, distant

Adverb

 * 1) far

title: ырак


text:
prepuceless

Adjective

 * 1) lacking a prepuce

title: prepuceless


text:
найырал

Etymology
Ultimately from. Cognate with 🇨🇬.

Noun

 * 1) friendship

title: найырал


text: Category:Polish terms borrowed from Tatar


text: Category:Polish terms derived from Tatar


text: Category:Polish terms derived from Kipchak-Bulgar languages


text:
User talk:몽골어 물리

It's rename to Kipchak
몽골어 물리 (talk) 01:39, 4 July 2020 (UTC) Kipchak is devided Armeno-Kipchak, Mamluk-Kipchak, Cuman. How rename Kipchak's ?

We sent you an e-mail
Hello ,

Really sorry for the inconvenience. This is a gentle note to request that you check your email. We sent you a message titled "The Community Insights survey is coming!". If you have questions, email surveys@wikimedia.org.

You can see my explanation here.

MediaWiki message delivery (talk) 18:48, 25 September 2020 (UTC)

Shor translation at butterfly.
In, one of your changes was to add * Shor: {{t|cjs| to one of the translations sections. It has since been removed. Could you double-check what you were trying to do?

Thanks in advance! —Ruakh TALK 02:44, 5 January 2021 (UTC)

title: User talk:몽골어 물리


text:
дыка

Adverb

 * 1) very, quite

title: дыка


text:
konfet

Etymology
, from, from.

title: konfet


text:
Silene coronaria

Hypernyms

 * - order; - family;  - tribe;  - genus;  - section

title: Silene coronaria


text:
ઈ

Letter

 * 1) The fourth letter and vowel of the Gujarati script.

Letter

 * 1) The fourth vowel in Gujarati

title: ઈ


text:
méekʼ koj

Noun

 * 1) flamingo

title: méekʼ koj


text: Template:table:Solar System/ar

title: Template:table:Solar System/ar


text:
星子過位

Noun

 * 1)  meteor shower

title: 星子過位


text: 星子过位

title: 星子过位


text:
ઉ

Letter

 * 1) The fifth vowel in Gujarati.

title: ઉ


text:
䁐牛

Verb

 * 1)  to graze cattle; to put cattle out to pasture

title: 䁐牛


text:
ဥဏှိဿ

Etymology
From.

Noun

 * 1)  top of the head of the Buddha

title: ဥဏှိဿ


text:
မဏိတော်

Etymology
🇰🇲

Noun

 * 1)  upper part of the Buddha's sacred hair knot

title: မဏိတော်


text:
ဥဏ္ဏလုံမွေးရှင်

Etymology
🇰🇲

Noun

 * 1)  mark on the forehead of the Buddha

title: ဥဏ္ဏလုံမွေးရှင်


text:
ဥဏ္ဏလုံ

Etymology
.

Noun

 * 1)  mark on the forehead of the Buddha

title: ဥဏ္ဏလုံ


text:
hoá tệ học

Etymology
.

Noun

 * 1) numismatics

title: hoá tệ học


text:
time loop

Noun

 * 1)  A hypothetical or fictional instance of characters living through a set period of time repeatedly until the loop can be broken.

Translations

 * German: Zeitschleife

title: time loop


text:
화폐학

Etymology
.

Noun

 * 1) numismatics

title: 화폐학


text: time loops

title: time loops


text:
бойдус

Noun

 * 1) nature, environment

title: бойдус


text:
貨幣学

Noun

 * 1) numismatics

title: 貨幣学


text:
生崽

Verb

 * 1)  to give birth (to a child)

title: 生崽


text:
貨幣學

Noun

 * 1) numismatics

title: 貨幣學


text: 货币学

title: 货币学


text: huòbìxué

title: huòbìxué


text:
farsi avanti

Etymology
lit. 'make oneself forward'.

Verb

 * 1) to advance
 * 2)  to come forward
 * 3)  to assert oneself
 * 1)  to assert oneself

title: farsi avanti


text:
a pieno

Etymology
lit. 'at full'.

title: a pieno


text:
dare ascolto

Etymology
lit. 'to give listening'.

Verb

 * 1)  to listen

title: dare ascolto


text:
Reconstruction:Proto-Germanic/kelaz

Etymology
From,.

Noun

 * 1)  throat

title: Reconstruction:Proto-Germanic/kelaz


text: Template:tyv-decl-noun

title: Template:tyv-decl-noun


text: Template:tyv-decl-noun/documentation

title: Template:tyv-decl-noun/documentation


text:
save someone's face

Verb

 * 1)  to preserve someone's pride, especially as defined by customary social settings.

title: save someone's face


text:
якийсь

Etymology
From. Cognate with 🇨🇬, 🇨🇬, 🇨🇬.

Determiner

 * 1) some, a certain

title: якийсь


text: hóa tệ học

title: hóa tệ học


text:
ઊ

Letter

 * 1) The sixth vowel in Gujarati.

title: ઊ


text:
ઋ

Letter

 * 1) The seventh vowel in Gujarati.

title: ઋ


text:
ઐ

Letter

 * 1) The ninth vowel in Gujarati.

title: ઐ


text:
ઓ

Letter

 * 1) The tenth consonant in Gujarati.

title: ઓ


text:
ઔ

Letter

 * 1) The eleventh vowel in Gujarati.

title: ઔ


text:
અં

Letter

 * 1) The twelfth vowel in Gujarati

title: અં


text:
અઃ

Letter

 * 1) The thirteenth vowel in Gujarati

title: અઃ


text:
かへいがく

Noun

 * 1)  numismatics

title: かへいがく


text: kaheigaku

title: kaheigaku


text:
User talk:ArmenianWannaBeLinguist

--Vahag (talk) 04:33, 4 July 2020 (UTC)

Armenian
Hi. Do you know Armenian? In any case, I recommend you to add a Babelbox. See Babel. --Vahag (talk) 10:29, 4 July 2020 (UTC)

 * Hi! Thank you for your welcoming message, I don't have a native level of Armenian unfortunately.

 * Thanks. I am not aware of the sense ‘to make love’ for . Where are you getting this? --Vahag (talk) 12:17, 4 July 2020 (UTC)

 * It's how we use it here in Istanbul, we are not aware of the sense "to flirt" neither. I'll try to find an example from my books and quote it.

 * Perhaps you use it jocularly or euphemistically. The word certainly means ‘to say pleasantries, love words’. --Vahag (talk) 13:37, 4 July 2020 (UTC)

 * I wouldn't say we use it euphemistically, because the word has only and solely this sexual meaning in the spoken form. However, It is indeed not a vulgar or gross way of expressing the idea of "having sex".

Resultative participles usually are not a lemma and do not get full definitions and usage examples. See Lemmas. No standard Armenian dictionary has an entry for. You can put the usage examples at the main entry, the verb. --Vahag (talk) 08:48, 5 July 2020 (UTC)

 * Thank you for the help, I will do it like this next time

I deleted, because it is unattestable. Even if was borrowed into Western Armenian, it could not be spelled, which in Western Armenian is /dagavid/. --Vahag (talk) 07:06, 14 July 2020 (UTC)

 * Here is, for example, an attestation of it : https://www.hisse.net/topluluk/showthread.php?t=28974&page=20. It is unattested in dictionnnaries but however used by 15 000 active speakers in Istanbul. Compare it to Russian loanwords in modern armenian, I am sure lot of them are unattested in dictionnaries. For the case of դաքավիդ, it is the only way to express the idea of a person being retired among w.amernian speakers. It's interesting because the turkish words it has borrowed (tekaüt) is not used anymore and normal turkish speakers would not understand it.

 * So it's, not . I also found . Since it is a colloquial Istanbul dialect expression, we should use the label , not . The word is not found in literary Standard Western Armenian. I am sure Western Armenian User:Սէրուժ does not recognize it. Also, the meaning must be "retirement" as in Turkish and Arabic, not "retired person". --Vahag (talk) 10:05, 14 July 2020 (UTC)

title: User talk:ArmenianWannaBeLinguist


text: n͠g

title: n͠g


text:
ανταρσία

Noun

 * 1) mutiny, revolt, rebellion

title: ανταρσία


text: ανταρσίας

title: ανταρσίας


text: ανταρσιών

title: ανταρσιών


text: ανταρσίες

title: ανταρσίες


text:
chân ngôn

Etymology
.

Noun

 * 1) mantra

title: chân ngôn


text:
के समक्ष

Postposition

 * 1) in front of, before one's eyes

title: के समक्ष


text: αντάρτισσων

title: αντάρτισσων


text:
αντάρτικος

Adjective

 * 1) partisan, rebel, guerilla
 * 2) rebellious, defiant

title: αντάρτικος


text:
Epaphroditus

Etymology
From, from , from.

Proper noun

 * 1) * 1611, : Authorized with Apocrypha, Robert Carroll, Stephen Prickett, eds., Oxford, 1997
 * Yet I supposed it necessary to send you to Epaphroditus, my brother, and companion in labor, and fellowsoldiar, but your messenger, and he that ministered to my wants.
 * Yet I supposed it necessary to send you to Epaphroditus, my brother, and companion in labor, and fellowsoldiar, but your messenger, and he that ministered to my wants.

title: Epaphroditus


text:
ανταρτοπόλεμος

Noun

 * 1) guerilla war, guerilla warfare

Related terms
and

title: ανταρτοπόλεμος


text: Template:tyv-decl

title: Template:tyv-decl


text: ανταρτοπόλεμου

title: ανταρτοπόλεμου


text: ανταρτοπολέμου

title: ανταρτοπολέμου


text: ανταρτοπόλεμο

title: ανταρτοπόλεμο


text: ανταρτοπόλεμε

title: ανταρτοπόλεμε


text: ανταρτοπόλεμων

title: ανταρτοπόλεμων


text: ανταρτοπολέμων

title: ανταρτοπολέμων


text: ανταρτοπόλεμοι

title: ανταρτοπόλεμοι


text: ανταρτοπόλεμους

title: ανταρτοπόλεμους


text: ανταρτοπολέμους

title: ανταρτοπολέμους


text: αντάρτικες

title: αντάρτικες


text: αντάρτικη

title: αντάρτικη


text: αντάρτικης

title: αντάρτικης


text: αντάρτικε

title: αντάρτικε


text: αντάρτικοι

title: αντάρτικοι


text: αντάρτικους

title: αντάρτικους


text: Template:tyv-noun-v

title: Template:tyv-noun-v


text: Template:tyv-noun-v/documentation

title: Template:tyv-noun-v/documentation


text:
αντασφάλεια

Noun

 * 1)  reinsurance

title: αντασφάλεια


text:
živnostník

Etymology
From.

Noun

 * 1) self-employed person

title: živnostník


text:
αντασφάλιση

Noun

 * 1)  reinsurance

title: αντασφάλιση


text: αντασφάλισης

title: αντασφάλισης


text: αντασφαλίσεως

title: αντασφαλίσεως


text: αντασφαλίσεων

title: αντασφαλίσεων


text: αντασφαλίσεις

title: αντασφαλίσεις


text: Category:el:Insurance

title: Category:el:Insurance


text: αντασφάλειας

title: αντασφάλειας


text: αντασφαλειών

title: αντασφαλειών


text: αντασφάλειες

title: αντασφάλειες


text: ごくろうさまでした

title: ごくろうさまでした


text: go-kurō-sama deshita

title: go-kurō-sama deshita


text:
総攻め

Etymology 1
Compound of ja,

Noun

 * 1) a full-scale attack, general attack

Noun

 * 1)  invariably becoming the top in any and all relationships

title: 総攻め


text: 受け

title: 受け


text: 攻め

title: 攻め


text:
せめ

Noun

 * 1)  attacking
 * 2)   top ; seme

title: せめ


text: 責め

title: 責め


text: ご苦労さまでした

title: ご苦労さまでした


text: 御苦労様でした

title: 御苦労様でした


text:
αντασφαλιστικός

Adjective

 * 1)  relating to  reinsurance

title: αντασφαλιστικός


text:
rubacchiatore

Etymology
From.

Noun

 * 1) pilferer

title: rubacchiatore


text: rubaldo

title: rubaldo


text:
rubamento

Etymology
From.

Noun

 * 1) theft

title: rubamento


text:
rubamonte

Etymology
.

title: rubamonte


text:
rubapalloni

Etymology
.

Noun

 * 1)  a player who retrieves the ball from the opposing side

title: rubapalloni


text:
rubasca

Noun

 * 1) kosovorotka

title: rubasca


text:
진언

Noun

 * 1) mantra

title: 진언


text:
ασφαλίζω

Etymology
with.

Verb

 * 1)  to insure

title: ασφαλίζω


text:
rubatore

Etymology
From.

Noun

 * 1) thief

title: rubatore


text: 眞言

title: 眞言


text: しっこく

title: しっこく


text: rubeca

title: rubeca


text: ασφαλίζομαι

title: ασφαλίζομαι


text:
ασφαλισμένος

Etymology
, passive voice of. Also substantivised.

Participle

 * 1) insured

title: ασφαλισμένος


text:
rubefacente

Adjective

 * 1) rubefacient, revulsive

Noun

 * 1) rubefacient, revulsive

title: rubefacente


text: ασφαλίστηκα

title: ασφαλίστηκα


text: ασφαλίσθηκα

title: ασφαλίσθηκα


text: ασφάλισα

title: ασφάλισα


text:
rubefazione

Noun

 * 1) rubefaction
 * 2) redness (of the skin)

title: rubefazione


text:
такий

Etymology
Inherited from.

Determiner

 * 1) such, suchlike

title: такий


text: rubellare

title: rubellare


text:
曲屏

Noun

 * 1) curved screen

title: 曲屏


text:
αντασφαλίζω

Verb

 * 1)  to reinsure

title: αντασφαλίζω


text:
такі

Etymology
.

Determiner

 * 1) such, suchlike

title: такі


text:
rubescenza

Noun

 * 1) rubescence, redness

title: rubescenza


text: αντασφαλίζομαι

title: αντασφαλίζομαι


text: αντασφάλισα

title: αντασφάλισα


text:
曲面屏

Noun

 * 1) curved screen

title: 曲面屏


text:
αντασφαλισμένος

Etymology
, passive voice of. Morphologically,

Participle

 * 1) reinsured

title: αντασφαλισμένος


text: αντασφαλίστηκα

title: αντασφαλίστηκα


text:
rubesto

Etymology
From. .

Adjective

 * 1) sturdy, strong, vigorous
 * 2) proud, harsh, haughty, disdainful

title: rubesto


text:
淫声

Noun

 * 1)  licentious music
 * , , kanbun kundoku:
 * 1)  sounds made during lovemaking
 * 1)  sounds made during lovemaking
 * 1)  sounds made during lovemaking
 * 1)  sounds made during lovemaking

title: 淫声


text:
більше

Usage notes

 * бі́льше qualifies verbs, whereas більш is generally used for forming s of adjectives and adverbs.

Determiner

 * 1) more

title: більше


text:
менше

Adverb

 * : less

Usage notes

 * ме́нше qualifies verbs, whereas менш is used for forming negative comparatives of adjectives and adverbs.

Determiner

 * 1) less, fewer

title: менше


text: rubicante

title: rubicante


text:
зовсім

Etymology
..

Adverb

 * 1) quite, entirely, totally
 * 2) at all

title: зовсім


text:
淫聲

Noun

 * 1)  licentious music
 * ,, transl.,  :

title: 淫聲


text:
rubiglio

Etymology
From.

Noun

 * 1) a variety of pea

title: rubiglio


text: ぶらさがる

title: ぶらさがる


text: rubiglione

title: rubiglione


text:
cicerchione

Noun

 * 1) peavine, vetchling

title: cicerchione


text:
ανταύγεια

Noun

 * 1) glow, glint, sheen
 * 2) splendour, brilliance, luminosity
 * 3)  highlight
 * 1)  highlight

title: ανταύγεια


text: ανταύγειας

title: ανταύγειας


text: えんじょこうさい

title: えんじょこうさい


text: ανταυγειών

title: ανταυγειών


text:
ανταύγειες

Noun

 * 1) highlights

title: ανταύγειες


text: えんこう

title: えんこう


text:
rubricario

Noun

 * 1) rubric
 * 2) address book

title: rubricario


text:
粟特人

Noun

 * 1) Sogdian person

title: 粟特人


text:
rudimentazione

Noun

 * 1) rudimentation

title: rudimentazione


text: rudità

title: rudità


text: 烏洛侯

title: 烏洛侯


text:
烏羅渾

Proper noun

 * 1)  Wuluohun, a nomadic tribe located in modern-day Inner Mongolia

title: 烏羅渾


text:
アクティビティー

Etymology
Borrowed from.

Noun

 * 1) activity

title: アクティビティー


text: まあたらしい

title: まあたらしい


text:
tamatama

Etymology
Reduplication of.

Noun

 * 1) leader

title: tamatama


text:
devil's candle

Noun

 * 1) The plant mandrake, especially when used in black magic.

title: devil's candle


text: devil's candles

title: devil's candles


text:
їхній

Pronoun

 * 1)  their, theirs

title: їхній


text:
witches' bells

Noun

 * 1) The plant foxglove.

title: witches' bells


text:
біля

Etymology
From early <  <  <, from , from , ultimately from , prefixed variant of.

Preposition

 * 1) near, next to

title: біля


text:
Talk:嘟嘟聲

Could this be considered just 嘟嘟 "beep" + 聲 "noise"? —Suzukaze-c (talk) 07:24, 4 July 2020 (UTC)
 * I think so. — justin(r)leung { (t...) 07:41, 4 July 2020 (UTC)
 * Maybe so. If you think it should be deleted as SOP, I don't object. —Granger (talk · contribs) 11:37, 4 July 2020 (UTC)

RFD discussion: July–August 2020
Sum of parts, 嘟嘟 "beep" + 聲 "noise". —Suzukaze-c (talk) 21:40, 4 July 2020 (UTC)
 * Delete. — justin(r)leung { (t...) 09:34, 9 July 2020 (UTC)

 * RFD deleted. — justin(r)leung { (t...) 23:56, 12 August 2020 (UTC)

title: Talk:嘟嘟聲


text:
ruffello

Noun

 * 1) tangle, typically of hair

title: ruffello


text: ruffianare

title: ruffianare


text:
після

Preposition

 * 1) after (in time)

Adverb

 * 1) later, afterwards

title: після


text:
трохи

Etymology
From, related to 🇨🇬.

Adverb

 * 1) a little
 * трохи спокою – a little peace (Songtext)
 * 1) slightly

title: трохи


text:
довго

Etymology
Adverb for.

Adverb

 * 1) a long time

title: довго


text:
ruffianesimo

Noun

 * 1) pandering

title: ruffianesimo


text:
можна

Etymology
.

Predicative

 * 1) one can, one may
 * 2) it is possible

Etymology
.

Predicative

 * 1) one can, one may
 * 2) it is possible

title: можна


text:
rufola

Etymology 1
.

title: rufola


text: rufolare

title: rufolare


text:
теж

Etymology
..

Adverb

 * 1) also, too, as well, likewise

title: теж


text:
generative act

Noun

 * 1) Sexual intercourse between a man and a woman.

title: generative act


text: generative acts

title: generative acts


text:
rugantinata

Noun

 * 1) bravado

title: rugantinata


text:
ruimtewezen

Etymology
Compound of.

Noun

 * 1) An extraterrestrial, an alien.

title: ruimtewezen


text: ruimtewezens

title: ruimtewezens


text:
rugantino

Noun

 * 1) braggart

title: rugantino


text: Freedom Ride

title: Freedom Ride


text: Freedom Rides

title: Freedom Rides


text:
rugato

Adjective

 * 1) wrinkled

title: rugato


text:
kolonisator

Etymology
Ultimately from.

Noun

 * 1) coloniser

title: kolonisator


text:
rugghiamento

Etymology
From.

Noun

 * 1) roar, roaring

title: rugghiamento


text: kolonisatoren

title: kolonisatoren


text: kolonisators

title: kolonisators


text: rugginente

title: rugginente


text:
rugliare

Etymology
Probably a.

Verb

 * 1) to roar
 * 2)  to rumble

title: rugliare


text: rugomare

title: rugomare


text:
rugumare

Etymology
, with metathesis.

Verb

 * 1) to ruminate, to brood

title: rugumare


text:
ಸದ್ದು

Etymology
From, from. .

Noun

 * 1) sound, noise

title: ಸದ್ದು


text:
genital organ

Noun

 * 1)  An organ used in sexual reproduction or sexual stimulation; a sex organ; (in plural) genitalia.

title: genital organ


text: genital organs

title: genital organs


text:
بیداد

Etymology
From.

Noun

 * 1)  oppression, injustice, tyranny

title: بیداد


text:
єдваб

Etymology
From.

Noun

 * 1) silk

title: єдваб


text:
Template:Ceratopogonidae Hypernyms

 * Nematocera - suborder; Culicomorpha - infraorder; Chironomoidea - superfamily; Ceratopogonidae - family

title: Template:Ceratopogonidae Hypernyms


text:
палітыка

Noun

 * 1) politics
 * 2) policy

title: палітыка


text:
радіостанція

Etymology
From.

Noun

 * 1) radio station

title: радіостанція


text:
postapocalyptisch

Etymology
Borrowed from. Equivalent to nl.

Adjective

 * 1)  postapocalyptic after a future cataclysm

title: postapocalyptisch


text:
радыёстанцыя

Noun

 * 1) radio station

title: радыёстанцыя


text:
Forcipomyia

Etymology
, from.

Hypernyms

 * ; ; - subfamily

Hyponyms

 * ,, , - selected species

title: Forcipomyia


text:
Talk:просить

To beg, to pray
Today, July 4th, 2020, the meaning for просить is "to ask, to request".

Adding "to beg, to pray" seems correct to me.

Primo, the translation section of the Russian page for просить, gives: "ask, beg, pray". Secundo, the Russian page for "ask" says: "1. спросить, спрашивать [...] 2. попросить, просить". Tertio, the Russian page for "beg" says "1. просить, умолять. [...]".

Rene1596 (talk) 08:29, 4 July 2020 (UTC)

title: Talk:просить


text:
هنيهة

Noun

 * 1) little thing, trifle little while

title: هنيهة


text:
ペンパル

Etymology
Borrowed from.

Noun

 * 1) pen pal

title: ペンパル


text:
vrouwmens

Etymology
Compound of.

Noun

 * 1)  woman
 * 2)  woman, bint

Usage notes
Use of the feminine gender is now archaic. The derogatory meaning, the most common meaning in the Netherlands, virtually always uses the neuter gender. Also compare the neuter usage at.

title: vrouwmens