| | |
| Line 114: | Line 114: |
| | break; | | break; |
| | else if(elem.tagName.toUpperCase() === 'SPAN') | | else if(elem.tagName.toUpperCase() === 'SPAN') |
| − | if(elem.className.search(/^(gender|noun-class|number)\s/) !== -1) | + | if(elem.className.search(/^(gender|noun-class|number|aspect)\s/) !== -1) |
| | ret += elem.className.split(/\s+/)[1]; | | ret += elem.className.split(/\s+/)[1]; |
| | else if(elem.className === 'serial-and') | | else if(elem.className === 'serial-and') |
/*</pre> ==Change redlinks to greenlinks== <pre>*/ function greenifyTranslinks(langcode) { if(mw.config.get('wgAction') !== 'view') return; if(! document.querySelector) return; if(! document.querySelector ('table.translations a.new > span:lang(' + langcode + ')')) return; var $ = jQuery; var headers = document.querySelectorAll('h3, h4, h5'); for(var i = 0; i < headers.length; ++i) { if($(headers[i].querySelector('.mw-headline')).text() !== 'Translations') continue; var posHeader = getPosForTransSect(i); if(! posHeader) continue; for( var elem = headers[i].nextElementSibling; elem && elem.tagName.search(/^[hH]\d$/) === -1; elem = elem.nextElementSibling ) { var linksToGreenify = elem.querySelectorAll('a.new > span:lang(' + langcode + ')'); if(linksToGreenify.length === 0) continue; var gloss = getGlossForTransTable(elem); for(var j = 0; j < linksToGreenify.length; ++j) { var link = linksToGreenify[j].parentNode; var greenData = { lang: langcode, pos: posHeader, head: $(link).text().trim().replace(/ +/g, ' '), xlit: getXlitForLink(link), g: getGenderForLink(link), trans: mw.config.get('wgPageName'), gloss: gloss }; if(mw.util.wikiUrlencode(greenData.head) === link.getAttribute('href').match(/\?(?:.*?&)?title=([^&]+)/)[1]) delete greenData.head; removeEmptyProps(greenData); var href = link.getAttribute('href'); href = href.split('#')[0]; // shouldn't be needed if(href.indexOf('?') === -1) // shouldn't happen href += '?'; href += '&greenData=' + encodeURIComponent(JSON.stringify(greenData)); link.setAttribute('href', href); link.style.color = 'rgb(34, 204, 0)'; } } } function getPosForTransSect(i) // headers[i] is the trans-sect-header { // We start at headers[i-1], and scroll back until we find a header at // a higher level than headers[i]. For example, if ====Translations==== // is at L4, then the closest-previous L3 header is the POS header. for(var j = i - 1; j >= 0; --j) if(headers[j].tagName < headers[i].tagName) { var ret = $(headers[j].querySelector('.mw-headline')).text(); ret = ret.replace(/\s+\d+$/, ''); // e.g. 'Noun 1' -> 'Noun' return ret; } return null; // shouldn't happen } function getGlossForTransTable(navFrame) { var ret = $(navFrame.querySelector('.NavHead')).text(); ret = ret.trim().replace(/^\[.*?\]\s*/, ''); return ret; } function getXlitForLink(link) { for(var node = link.nextSibling; node; node = node.nextSibling) { if(node.nodeType === Node.ELEMENT_NODE && node.tagName.toUpperCase() === 'A') // hit {{t}} or [[ ]] break; if(node.nodeType === Node.ELEMENT_NODE && node.lang === langcode) // hit {{t-SOP}} or {{l}} break; if(node.nodeType !== Node.TEXT_NODE) continue; var match = node.data.match(/^\xA0\((.*)\)(?:\xA0|, )?$/); if(match) return match[1]; } return ''; } function getGenderForLink(link) // e.g. '' or 'm' or 'c1' or 'm|f' { var ret = ''; for( var elem = link.nextElementSibling; elem; elem = elem.nextElementSibling ) if(elem.tagName.toUpperCase() === 'A') // hit {{t}} or [[ ]] break; else if(elem.lang === langcode) // hit {{t-SOP}} or {{l}} break; else if(elem.tagName.toUpperCase() === 'SPAN') if(elem.className.search(/^(gender|noun-class|number|aspect)\s/) !== -1) ret += elem.className.split(/\s+/)[1]; else if(elem.className === 'serial-and') ret += '|'; return ret; } function removeEmptyProps(obj) { var propsToRemove = []; for(var key in obj) if(obj[key] === undefined || obj[key] === null || obj[key] === '') propsToRemove.push(key); for(var i = 0; i < propsToRemove.length; ++i) delete obj[propsToRemove[i]]; } } /*</pre> ==Populate edit-window at target of a greenlink== <pre>*/ function getHeadLineForGreenData(greenData) { // allow special-casing of specific languages and POSes: if(getHeadLineForGreenData[greenData.lang + '~' + greenData.pos]) return getHeadLineForGreenData[greenData.lang+'~'+greenData.pos](greenData); var ret = '{{head|' + greenData.lang; if(greenData.pos.indexOf('=') > -1) ret += '||1=' + greenData.pos.toLowerCase(); else ret += '|' + greenData.pos.toLowerCase(); if(greenData.head) ret += '|head=' + greenData.head; if(greenData.xlit) ret += '|tr=' + greenData.xlit; if(greenData.g) ret += '|g=' + greenData.g.split('|')[0]; if(greenData.g && greenData.g.indexOf('|') > -1) ret += '|g2=' + greenData.g.split('|')[1]; ret += '}}'; return ret; } getHeadLineForGreenData['ru~Noun'] = function (greenData) { var ret = '{{ru-noun'; if(greenData.head) ret += '|head=' + greenData.head; if(greenData.xlit) ret += '|tr=' + greenData.xlit; if(greenData.g) ret += '|g=' + greenData.g.split('|')[0]; ret += '}}'; return ret; }; getHeadLineForGreenData['yi~Adjective'] = function (greenData) { var ret = '{{yi-adj'; if(greenData.xlit) ret += '|tr=' + greenData.xlit; ret += '}}'; return ret; }; function getInflSectForGreenData(greenData) { // allow special-casing of specific languages and POSes: if(getInflSectForGreenData[greenData.lang + '~' + greenData.pos]) return getInflSectForGreenData[greenData.lang+'~'+greenData.pos](greenData); return ''; } getInflSectForGreenData['yi~Adjective'] = function (greenData) { var template = '{{yi-adj-'; var curr = mw.config.get('wgTitle'); if(curr.search(/[\u05DA\u05DD\u05DF\u05E3\u05E5]$/) > -1) // final letter { if(curr.charAt(curr.length - 1) === '\u05DD') // final mem template += 'm'; else if(curr.charAt(curr.length - 1) === '\u05DF') // final nun template += 'n'; else // final khaf, final fei, or final tsadi template += 'final'; template += '|' + curr.substr(0, curr.length - 1) + String.fromCharCode(curr.charCodeAt(curr.length - 1) + 1); } else if(curr.search(/\u05D5\u05BC?$|\u05D9\u05B4?$|\u05D0[\u05B7\u05B8]$|\u05E2$/) > -1) template += 'vowel'; else template += '1'; if(greenData.xlit) template += '|' + greenData.xlit; template += '}}'; return '\n====Declension====\n' + template + '\n'; }; addOnloadHook(function () { if(mw.config.get('wgNamespaceNumber') !== 0) return; if(mw.config.get('wgAction') !== 'edit') return; if(! document.getElementById('ca-nstab-main')) return; if(document.getElementById('ca-nstab-main').className !== 'selected new') return; var greenData = document.location.href.match(/&greenData=([^&]+)/); if(! greenData) return; greenData = JSON.parse(decodeURIComponent(greenData[1])); var wikitext = ''; if(! greenData.lang || greenData.lang.search(/^[a-z-]+$/) === -1) return; wikitext += '=={{subst:' + greenData.lang + '}}==\n\n'; if(! greenData.pos) return; if(greenData.pos.search(/^=|=$/) > -1) wikitext += '=== ' + greenData.pos + ' ===\n'; else wikitext += '===' + greenData.pos + '===\n'; wikitext += getHeadLineForGreenData(greenData) + '\n\n'; if(! greenData.trans) return; wikitext += '# [[' + greenData.trans + ']]'; if(greenData.gloss) wikitext += ' {{gloss|' + greenData.gloss + '}}'; wikitext += '\n'; wikitext += getInflSectForGreenData(greenData); document.getElementById('wpTextbox1').value = wikitext; });