Wikipedia sowiki https://so.wikipedia.org/wiki/Bogga_Hore MediaWiki 1.48.0-wmf.1 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Portal Portal talk TimedText TimedText talk Module Module talk Event Event talk MediaWiki:Gadget-script-installer-core.js 8 53741 311644 311226 2026-11-02T19:47:54Z Maintenance script 11523 Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup) 311644 javascript text/javascript ( function () { // Shayga mw.Api let api; // Keydi "common" bilowga const SKINS = [ 'common', 'monobook', 'minerva', 'vector', 'vector-2022', 'timeless' ]; // Imisa qoraal ayaan u baahannahy kahor inta aanaan soo bandhigin shaandhaynta degdegga ah? const NUM_SCRIPTS_FOR_SEARCH = 5; const imports = {}; const localScriptsByName = {}; // Imisa qoraal ayaa la rakibay? let scriptCount = 0; // Waxaa lagu daraa dhammaadka soo koobidda wax-ka-beddelka const ADVERT = ' ([[:en:User:Enterprisey/script-installer|rakibaha qoraalka]])'; /** * Xadhkaha (strings), ee turjumidda */ const STRINGS = { skinCommon: 'common (kuxiran dhammaan maqaallada/maqaarka)', backlink: 'Xiriirka dib u soo celinta:', installSummary: 'Rakibidda $1', installLinkText: 'Rakib', installProgressMsg: 'Waa la rakibayaa...', uninstallSummary: 'Ka saaridda $1', uninstallLinkText: 'Ka saar', uninstallProgressMsg: 'Waa la ka saarayaa...', disableSummary: 'Daminta $1', disableLinkText: 'Dami', disableProgressMsg: 'Waa la daminayaa...', enableSummary: 'Daaridda $1', enableLinkText: 'Daar', enableProgressMsg: 'Waa la daarayaa...', moveLinkText: 'Raree', moveProgressMsg: 'Waa la rarayaa...', movePrompt: 'Meesha loo socdo? Geli mid ka mid ah:', // waxaa ku xiga magacyada maqaarka/skins normalizeSummary: 'Hagaajinta rakibidda qoraallada', remoteUrlDesc: '$1, laga raray $2', panelHeader: 'Hadda waxaad haysataa qoraallada soo socda oo la rakibay (ka hel wax dheeraad ah WP:USL)', cannotInstall: 'Lama rakibi karo', cannotInstallSkin: 'Boggan waa mid ka mid ah bogaggaaga habaynta isticmaalaha, waana uu horay u shaqeyn karaa (ama wuu shaqeyn doonaa, haddii uu yahay common.js) markasta oo bogga la raro.', cannotInstallContentModel: "Qaabka nuxurka boggu waa $1, ee ma aha 'javascript'", insecure: '(amaah ama amni-darro)', // waxaa lagu isticmaalaa dhammaadka fariimaha qaar notJavaScript: 'ma aha JavaScript', installViaPreferences: 'Ku rakib iyada oo loo marayo dooqyada', showNormalizeLinks: 'Muuji xiriirada "hagaajinta"?', normalize: 'hagaaji', showMoveLinks: 'Muuji xiriirada "raridda"?', quickFilter: 'Shaandhaynta degdegga ah:', tempWarning: 'Rakibidda bogagga aan ahayn User, ama aan la ilaalin ee MediaWiki waa ku meel gaar waxaana laga yaabaa in la tirtiro mustaqbalka.', badPageError: 'Boggu ma aha User: ama MediaWiki: mana la ilaaliyo', manageUserScripts: 'Maaree qoraallada isticmaalaha', bigSecurityWarning: "Digniin!$1\n\nDhammaan qoraallada isticmaalaha waxay yeelan karaan nuxur xaasidnimo ah oo awood u leh inuu wax u dhimo koontadaada. Rakibidda qoraal waxay la macno tahay in dad kale ay beddeli karaan; hubi inaad ku kalsoon tahay qoraageeda. Haddii aadan hubin in qoraalku ammaan yahay, ka hubi golaha bulshada farsamada. Ma rakibtaa qoraalkan?", securityWarningSection: ' Waxaa la rabaa in la rakibo $1.' }; const USER_NAMESPACE_NAME = mw.config.get( 'wgFormattedNamespaces' )[ 2 ]; /** * Dhisidda Soo-dejinta (Import). Soo-dejintu waa xariiq ku jirta faylka JS oo soo dejineysa * qoraalka isticmaalaha. Astaamaha: * * KELIYAHADDA mid ka mid ah "page" ama "url" ayaa eber ah (null) soo-dejinta kasta. * * this.type = 0 haddii ay tahay maxalli (local), 1 haddii meel fog laga soo raray, iyo 2 haddii ay tahay URL. */ function Import( page, wiki, url, target, disabled ) { this.page = page; this.wiki = wiki; this.url = url; this.target = target; this.disabled = disabled; this.type = this.url ? 2 : ( this.wiki ? 1 : 0 ); } Import.ofLocal = function ( page, target, disabled ) { if ( disabled === undefined ) { disabled = false; } return new Import( page, null, null, target, disabled ); }; /** * URL-ka loo dhoofiyo. Waxay u qaadanaysaa wgScriptPath inuu yahay "/w" */ Import.ofUrl = function ( url, target, disabled ) { if ( disabled === undefined ) { disabled = false; } const URL_RGX = /^(?:https?:)?\/\/(.+?)\.org\/w\/index\.php\?.*?title=(.+?(?:&|$))/; const match = URL_RGX.exec( url ); if ( match ) { const title = decodeURIComponent( match[ 2 ].replace( /&$/, '' ) ), wiki = decodeURIComponent( match[ 1 ] ); return new Import( title, wiki, null, target, disabled ); } return new Import( null, null, url, target, disabled ); }; Import.fromJs = function ( line, target ) { const IMPORT_RGX = /^\s*(\/\/)?\s*importScript\s*\(\s*(?:"|')(.+?)(?:"|')\s*\)/; let match = IMPORT_RGX.exec( line ); if ( match ) { return Import.ofLocal( unescapeForJsString( match[ 2 ] ), target, !!match[ 1 ] ); } const LOADER_RGX = /^\s*(\/\/)?\s*mw\.loader\.load\s*\(\s*(?:"|')(.+?)(?:"|')\s*\)/; match = LOADER_RGX.exec( line ); if ( match ) { return Import.ofUrl( unescapeForJsString( match[ 2 ] ), target, !!match[ 1 ] ); } }; Import.prototype.getDescription = function ( useWikitext ) { switch ( this.type ) { case 0: return useWikitext ? ( '[[' + this.page + ']]' ) : this.page; case 1: return STRINGS.remoteUrlDesc.replace( '$1', this.page ).replace( '$2', this.wiki ); case 2: return this.url; } }; /** * URL bini'aadamku akhrin karo (oo aan khasab ku ahayn ResourceLoader). */ Import.prototype.getHumanUrl = function () { switch ( this.type ) { case 0: return '/wiki/' + encodeURI( this.page ); case 1: return '//' + this.wiki + '.org/wiki/' + encodeURI( this.page ); case 2: return this.url; } }; Import.prototype.toJs = function () { const dis = this.disabled ? '//' : ''; let url = this.url; switch ( this.type ) { case 0: return dis + "importScript('" + escapeForJsString( this.page ) + "'); // " + STRINGS.backlink + ' [[' + escapeForJsComment( this.page ) + ']]'; case 1: url = '//' + encodeURIComponent( this.wiki ) + '.org/w/index.php?title=' + encodeURIComponent( this.page ) + '&action=raw&ctype=text/javascript'; /* KU DHAC HOOS */ case 2: return dis + "mw.loader.load('" + escapeForJsString( url ) + "');"; } }; /** * Rakibaadda soo-dejinta. */ Import.prototype.install = function () { return api.postWithEditToken( { action: 'edit', title: getFullTarget( this.target ), summary: STRINGS.installSummary.replace( '$1', this.getDescription( /* useWikitext */ true ) ) + ADVERT, appendtext: '\n' + this.toJs() } ); }; /** * Hel dhammaan nambarada xariiqda ee bogga bartilmaameedka ah ee xusaya * qoraalka cayiman. */ Import.prototype.getLineNums = function ( targetWikitext ) { function quoted( s ) { return new RegExp( "(['\"])" + escapeForRegex( s ) + '\\1' ); } let toFind; switch ( this.type ) { case 0: toFind = quoted( escapeForJsString( this.page ) ); break; case 1: toFind = new RegExp( escapeForRegex( encodeURIComponent( this.wiki ) ) + '.*?' + escapeForRegex( encodeURIComponent( this.page ) ) ); break; case 2: toFind = quoted( escapeForJsString( this.url ) ); break; } const lineNums = [], lines = targetWikitext.split( '\n' ); for ( let i = 0; i < lines.length; i++ ) { if ( toFind.test( lines[ i ] ) ) { lineNums.push( i ); } } return lineNums; }; /** * Ka saarista soo-dejinta la bixiyay. Taasi waa, tirtir dhammaan xariiqyada bogga * bartilmaameedka ah ee soo dejinaya qoraalka cayiman. */ Import.prototype.uninstall = function () { const that = this; return getWikitext( getFullTarget( this.target ) ).then( ( wikitext ) => { const lineNums = that.getLineNums( wikitext ), newWikitext = wikitext.split( '\n' ).filter( ( _, idx ) => lineNums.indexOf( idx ) < 0 ).join( '\n' ); return api.postWithEditToken( { action: 'edit', title: getFullTarget( that.target ), summary: STRINGS.uninstallSummary.replace( '$1', that.getDescription( /* useWikitext */ true ) ) + ADVERT, text: newWikitext } ); } ); }; /** * Dejinta in soo-dejinta la bixiyay ay curyaan tahay (disabled), iyadoo sal looga dhigayo qiimaha * boolean-ka ee la bixiyay. */ Import.prototype.setDisabled = function ( disabled ) { const that = this; this.disabled = disabled; return getWikitext( getFullTarget( this.target ) ).then( ( wikitext ) => { const lineNums = that.getLineNums( wikitext ), newWikitextLines = wikitext.split( '\n' ); if ( disabled ) { lineNums.forEach( ( lineNum ) => { if ( newWikitextLines[ lineNum ].trim().indexOf( '//' ) !== 0 ) { newWikitextLines[ lineNum ] = '//' + newWikitextLines[ lineNum ].trim(); } } ); } else { lineNums.forEach( ( lineNum ) => { if ( newWikitextLines[ lineNum ].trim().indexOf( '//' ) === 0 ) { newWikitextLines[ lineNum ] = newWikitextLines[ lineNum ].replace( /^\s*\/\/\s*/, '' ); } } ); } const summary = ( disabled ? STRINGS.disableSummary : STRINGS.enableSummary ) .replace( '$1', that.getDescription( /* useWikitext */ true ) ) + ADVERT; return api.postWithEditToken( { action: 'edit', title: getFullTarget( that.target ), summary: summary, text: newWikitextLines.join( '\n' ) } ); } ); }; Import.prototype.toggleDisabled = function () { this.disabled = !this.disabled; return this.setDisabled( this.disabled ); }; /** * U rarista soo-dejintan fayl kale. */ Import.prototype.move = function ( newTarget ) { if ( this.target === newTarget ) { return; } const old = new Import( this.page, this.wiki, this.url, this.target, this.disabled ); this.target = newTarget; return $.when( old.uninstall(), this.install() ); }; function getAllTargetWikitexts() { return $.getJSON( mw.util.wikiScript( 'api' ), { format: 'json', action: 'query', prop: 'revisions', rvprop: 'content', rvslots: 'main', titles: SKINS.map( getFullTarget ).join( '|' ) } ).then( ( data ) => { if ( data && data.query && data.query.pages ) { const result = {}; Object.values( data.query.pages ).forEach( ( moreData ) => { const nameWithoutExtension = new mw.Title( moreData.title ).getNameText(); const targetName = nameWithoutExtension.substring( nameWithoutExtension.indexOf( '/' ) + 1 ); result[ targetName ] = moreData.revisions ? moreData.revisions[ 0 ].slots.main[ '*' ] : null; } ); return result; } } ); } function buildImportList() { return getAllTargetWikitexts().then( ( wikitexts ) => { Object.keys( wikitexts ).forEach( ( targetName ) => { const targetImports = []; if ( wikitexts[ targetName ] ) { const lines = wikitexts[ targetName ].split( '\n' ); let currImport; for ( let i = 0; i < lines.length; i++ ) { currImport = Import.fromJs( lines[ i ], targetName ); if ( currImport ) { targetImports.push( currImport ); scriptCount++; if ( currImport.type === 0 ) { if ( !localScriptsByName[ currImport.page ] ) { localScriptsByName[ currImport.page ] = []; } localScriptsByName[ currImport.page ].push( currImport.target ); } } } } imports[ targetName ] = targetImports; } ); } ); } /** * "Hagaajinta" (jaangooynta qaabdhismeedka) xariiqyada bogga habaynta * ee la bixiyay. */ function normalize( target ) { return getWikitext( getFullTarget( target ) ).then( ( wikitext ) => { const lines = wikitext.split( '\n' ), newLines = Array( lines.length ); let currImport; for ( let i = 0; i < lines.length; i++ ) { currImport = Import.fromJs( lines[ i ], target ); if ( currImport ) { newLines[ i ] = currImport.toJs(); } else { newLines[ i ] = lines[ i ]; } } return api.postWithEditToken( { action: 'edit', title: getFullTarget( target ), summary: STRINGS.normalizeSummary + ADVERT, text: newLines.join( '\n' ) } ); } ); } function conditionalReload( openPanel ) { if ( window.scriptInstallerAutoReload ) { if ( openPanel ) { document.cookie = 'open_script_installer=yes'; } window.location.reload( true ); } } /******************************************** * * Koodka UI * ********************************************/ function makePanel() { const $list = $( '<div>' ).attr( 'id', 'script-installer-panel' ) .append( $( '<header>' ).text( STRINGS.panelHeader ) ); const $container = $( '<div>' ).addClass( 'container' ).appendTo( $list ); // Meesha sanduuqyada calaamadaynta (checkboxes) $container.append( $( '<div>' ) .attr( 'class', 'checkbox-container' ) .append( $( '<input>' ) .attr( { id: 'siNormalize', type: 'checkbox' } ) .on( 'click', () => { $( '.normalize-wrapper' ).toggle( 0 ); } ), $( '<label>' ) .attr( 'for', 'siNormalize' ) .text( STRINGS.showNormalizeLinks ), $( '<input>' ) .attr( { id: 'siMove', type: 'checkbox' } ) .on( 'click', () => { $( '.move-wrapper' ).toggle( 0 ); } ), $( '<label>' ) .attr( 'for', 'siMove' ) .text( STRINGS.showMoveLinks ) ) ); if ( scriptCount > NUM_SCRIPTS_FOR_SEARCH ) { $container.append( $( '<div>' ) .attr( 'class', 'filter-container' ) .append( $( '<label>' ) .attr( 'for', 'siQuickFilter' ) .text( STRINGS.quickFilter ), $( '<input>' ) .attr( { id: 'siQuickFilter', type: 'text' } ) .on( 'input', function () { const filterString = $( this ).val(); if ( filterString ) { const sel = "#script-installer-panel li[name*='" + $.escapeSelector( $( this ).val() ) + "']"; $( '#script-installer-panel li.script' ).toggle( false ); $( sel ).toggle( true ); } else { $( '#script-installer-panel li.script' ).toggle( true ); } } ) ) ); // Hadda, ka saar sanduuqyada calaamadaynta jidka $container.find( '.checkbox-container' ) .css( 'float', 'right' ); } $.each( imports, ( targetName, targetImports ) => { const fmtTargetName = ( targetName === 'common' ? STRINGS.skinCommon : targetName ); if ( targetImports.length ) { $container.append( $( '<h2>' ).append( fmtTargetName, $( '<span>' ) .addClass( 'normalize-wrapper' ) .append( ' (', $( '<a>' ) .text( STRINGS.normalize ) .on( 'click', () => { normalize( targetName ).done( () => { conditionalReload( true ); } ); } ), ')' ) .hide() ), $( '<ul>' ).append( targetImports.map( ( anImport ) => $( '<li>' ) .addClass( 'script' ) .attr( 'name', anImport.getDescription() ) .append( $( '<a>' ) .text( anImport.getDescription() ) .addClass( 'script' ) .attr( 'href', anImport.getHumanUrl() ), ' (', $( '<a>' ) .text( STRINGS.uninstallLinkText ) .on( 'click', function () { $( this ).text( STRINGS.uninstallProgressMsg ); anImport.uninstall().done( () => { conditionalReload( true ); } ); } ), ' | ', $( '<a>' ) .text( anImport.disabled ? STRINGS.enableLinkText : STRINGS.disableLinkText ) .on( 'click', function () { $( this ).text( anImport.disabled ? STRINGS.enableProgressMsg : STRINGS.disableProgressMsg ); anImport.toggleDisabled().done( function () { $( this ).toggleClass( 'disabled' ); conditionalReload( true ); } ); } ), $( '<span>' ) .addClass( 'move-wrapper' ) .append( ' | ', $( '<a>' ) .text( STRINGS.moveLinkText ) .on( 'click', function () { let dest = null; const PROMPT = STRINGS.movePrompt + ' ' + SKINS.join( ', ' ); do { dest = ( window.prompt( PROMPT ) || '' ).toLowerCase(); } while ( dest && SKINS.indexOf( dest ) < 0 ); if ( !dest ) { return; } $( this ).text( STRINGS.moveProgressMsg ); anImport.move( dest ).done( () => { conditionalReload( true ); } ); } ) ) .hide(), ')' ) .toggleClass( 'disabled', anImport.disabled ) ) ) ); } } ); return $list; } function buildCurrentPageInstallElement() { let addingInstallLink = false; // miyaanu ku daraynaa xiriir rakibid oo sax ah? const $installElement = $( '<span>' ); // waxaa la isticmaalaa oo keliya haddii addingInstallLink loo dejiyeen run (true) const namespaceNumber = mw.config.get( 'wgNamespaceNumber' ); const pageName = mw.config.get( 'wgPageName' ); // Magaca bannaan (Namespace) 2 waa User if ( namespaceNumber === 2 && pageName.indexOf( '/' ) > 0 ) { const contentModel = mw.config.get( 'wgPageContentModel' ); if ( contentModel === 'javascript' ) { const prefixLength = mw.config.get( 'wgUserName' ).length + 6; if ( pageName.indexOf( USER_NAMESPACE_NAME + ':' + mw.config.get( 'wgUserName' ) ) === 0 ) { const skinIndex = SKINS.indexOf( pageName.substring( prefixLength ).slice( 0, -3 ) ); if ( skinIndex >= 0 ) { return $( '<abbr>' ).text( STRINGS.cannotInstall ) .attr( 'title', STRINGS.cannotInstallSkin ); } } addingInstallLink = true; } else { return $( '<abbr>' ).text( STRINGS.cannotInstall + ' (' + STRINGS.notJavaScript + ')' ) .attr( 'title', STRINGS.cannotInstallContentModel.replace( '$1', contentModel ) ); } } // Magaca bannaan (Namespace) 8 waa MediaWiki if ( namespaceNumber === 8 ) { return $( '<a>' ).text( STRINGS.installViaPreferences ) .attr( 'href', mw.util.getUrl( 'Special:Preferences' ) + '#mw-prefsection-gadgets' ); } const editRestriction = mw.config.get( 'wgRestrictionEdit' ) || []; if ( ( namespaceNumber !== 2 && namespaceNumber !== 8 ) && ( editRestriction.indexOf( 'sysop' ) >= 0 || editRestriction.indexOf( 'editprotected' ) >= 0 ) ) { $installElement.append( ' ', $( '<abbr>' ).append( $( '<img>' ).attr( 'src', 'https://thumb.wikimedia.org/wikipedia/commons/thumb/3/35/Achtung-yellow.svg/20px-Achtung-yellow.svg.png' ).addClass( 'warning' ), STRINGS.insecure ) .attr( 'title', STRINGS.tempWarning ) ); addingInstallLink = true; } if ( addingInstallLink ) { const fixedPageName = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ); $installElement.prepend( $( '<a>' ) .attr( 'id', 'script-installer-main-install' ) .text( localScriptsByName[ fixedPageName ] ? STRINGS.uninstallLinkText : STRINGS.installLinkText ) .on( 'click', makeLocalInstallClickHandler( fixedPageName ) ) ); // Haddii qoraalka la rakibay laakiin uu curyaan yahay, u oggolow isticmaalaha inuu daarayo const allScriptsInTarget = imports[ localScriptsByName[ fixedPageName ] ]; const importObj = allScriptsInTarget && allScriptsInTarget.find( ( anImport ) => anImport.page === fixedPageName ); if ( importObj && importObj.disabled ) { $installElement.append( ' | ', $( '<a>' ) .attr( 'id', 'script-installer-main-enable' ) .text( STRINGS.enableLinkText ) .on( 'click', function () { $( this ).text( STRINGS.enableProgressMsg ); importObj.setDisabled( false ).done( () => { conditionalReload( false ); } ); } ) ); } return $installElement; } return $( '<abbr>' ).text( STRINGS.cannotInstall + ' ' + STRINGS.insecure ) .attr( 'title', STRINGS.badPageError ); } function showUi() { $( '#firstHeading' ).append( $( '<span>' ) .attr( 'id', 'script-installer-top-container' ) .append( buildCurrentPageInstallElement(), ' | ', $( '<a>' ) .text( STRINGS.manageUserScripts ).on( 'click', () => { if ( !document.getElementById( 'script-installer-panel' ) ) { $( '#mw-content-text' ).before( makePanel() ); } else { $( '#script-installer-panel' ).remove(); } } ) ) ); } function attachInstallLinks() { // Dhamaadka tarjumaad kasta oo {{Userscript}}, waxaa jira // <span id='User:Foo/Bar.js' class='scriptInstallerLink'></span> $( 'span.scriptInstallerLink' ).each( function () { const scriptName = this.id.replace( /_/g, ' ' ); $( this ).append( ' | ', $( '<a>' ) .text( localScriptsByName[ scriptName ] ? STRINGS.uninstallLinkText : STRINGS.installLinkText ) .on( 'click', makeLocalInstallClickHandler( scriptName ) ) ); } ); // Ku dar badhan rakibid oo buluug ah oo weyn {{Infobox user script}} kasta $( 'table.infobox-user-script' ).each( function () { const $infoboxScriptField = $( this ).find( "th:contains('Source')" ).next(); let scriptName = mw.config.get( 'wgPageName' ); const isHyperlink = $infoboxScriptField.html() !== $infoboxScriptField.text(); if ( isHyperlink ) { const $link = $infoboxScriptField.find( 'a' ).first(); const isExternalLink = $link.hasClass( 'external' ); if ( !isExternalLink ) { scriptName = /\/wiki\/(.*)/.exec( $link.attr( 'href' ) )[ 1 ]; } } else { scriptName = $infoboxScriptField.text(); } scriptName = /user:.+?\/.+?.js/i.exec( scriptName )[ 0 ]; scriptName = scriptName.replace( /_/g, ' ' ); // hubi in magaca qoraalku uusan lahayn hoosta ka xarriiq (underscores) $( this ).children( 'tbody' ).append( $( '<tr>' ).append( $( '<td>' ) .attr( 'colspan', '2' ) .addClass( 'script-installer-ibx' ) .append( $( '<button>' ) .addClass( 'mw-ui-button mw-ui-progressive mw-ui-big' ) .text( localScriptsByName[ scriptName ] ? STRINGS.uninstallLinkText : STRINGS.installLinkText ) .on( 'click', makeLocalInstallClickHandler( scriptName ) ) ) ) ); }); } function makeLocalInstallClickHandler( scriptName ) { return function () { const $this = $( this ); if ( $this.text() === STRINGS.installLinkText ) { const okay = window.confirm( STRINGS.bigSecurityWarning.replace( '$1', STRINGS.securityWarningSection.replace( '$1', scriptName ) ) ); if ( okay ) { $( this ).text( STRINGS.installProgressMsg ); Import.ofLocal( scriptName, window.scriptInstallerInstallTarget ).install().done( () => { $( this ).text( STRINGS.uninstallLinkText ); conditionalReload( false ); } ); } } else { $( this ).text( STRINGS.uninstallProgressMsg ); const uninstalls = uniques( localScriptsByName[ scriptName ] ) .map( ( target ) => Import.ofLocal( scriptName, target ).uninstall() ); $.when.apply( $, uninstalls ).then( () => { $( this ).text( STRINGS.installLinkText ); conditionalReload( false ); } ); } }; } /******************************************** * * Shaqooyinka kaalmada (Utility functions) * ********************************************/ /** * Hel wikitext-ka bogga oo wata cinwaanka la bixiyay (magaca bannaanka / namespace ayaa loo baahan yahay). */ function getWikitext( title ) { return $.getJSON( mw.util.wikiScript( 'api' ), { format: 'json', action: 'query', prop: 'revisions', rvprop: 'content', rvslots: 'main', rvlimit: 1, titles: title } ).then( ( data ) => { const pageId = Object.keys( data.query.pages )[ 0 ]; if ( data.query.pages[ pageId ].revisions ) { return data.query.pages[ pageId ].revisions[ 0 ].slots.main[ '*' ]; } return ''; } ); } function escapeForRegex( s ) { return s.replace( /[-/\\^$*+?.()|[\]{}]/g, '\\$&' ); } /** * Ka baxsashada xadhig si loogu isticmaalo xadhig suugaaneed JavaScript ah. * Shaqadan waxaa laga soo qaatay * https://github.com/joliss/js-string-escape/blob/6887a69003555edf5c6caaa75f2592228558c595/index.js * (waxaa lagu sii daayay shatiga MIT). */ function escapeForJsString( s ) { return s.replace( /["'\\\n\r\u2028\u2029]/g, ( character ) => { switch ( character ) { case '"': case "'": case '\\': return '\\' + character; case '\n': return '\\n'; case '\r': return '\\r'; case '\u2028': return '\\u2028'; case '\u2029': return '\\u2029'; } } ); } /** * Ka baxsashada xadhig si loogu isticmaalo faallo JavaScript ah oo dhexda ku jirta (faallooyinka ku billowda labada jeex "//"). */ function escapeForJsComment( s ) { return s.replace( /[\n\r\u2028\u2029]/g, ( character ) => { switch ( character ) { case '\n': return '\\n'; case '\r': return '\\r'; case '\u2028': return '\\u2028'; case '\u2029': return '\\u2029'; } } ); } /** * Dib-u-soo-celinta xadhig suugaaneed JavaScript ah. */ function unescapeForJsString( s ) { return s.replace( /\\"|\\'|\\\\|\\n|\\r|\\u2028|\\u2029/g, ( substring ) => { switch ( substring ) { case '\\"': return '"'; case "\\'": return "'"; case '\\\\': return '\\'; case '\\r': return '\r'; case '\\n': return '\n'; case '\\u2028': return '\u2028'; case '\\u2029': return '\u2029'; } } ); } function getFullTarget( target ) { return USER_NAMESPACE_NAME + ':' + mw.config.get( 'wgUserName' ) + '/' + target + '.js'; } // Laga soo qaatay https://stackoverflow.com/a/10192255 function uniques( array ) { return array.filter( ( el, index, arr ) => index === arr.indexOf( el ) ); } if ( window.scriptInstallerAutoReload === undefined ) { window.scriptInstallerAutoReload = true; } if ( window.scriptInstallerInstallTarget === undefined ) { window.scriptInstallerInstallTarget = 'common'; // si caadi ah, ugu rakib waxyaabaha common.js ee isticmaalaha } const jsPage = mw.config.get( 'wgPageName' ).slice( -3 ) === '.js' || mw.config.get( 'wgPageContentModel' ) === 'javascript'; $.when( $.ready, mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ) ).then( () => { api = new mw.Api(); buildImportList().then( () => { attachInstallLinks(); if ( jsPage ) { showUi(); } // Si otomaatig ah u fur guddiga haddii aan dejino cookie-ga si aan sidaas u yeelno (eeg `conditionalReload()`) if ( document.cookie.indexOf( 'open_script_installer=yes' ) >= 0 ) { document.cookie = 'open_script_installer=; expires=Thu, 01 Jan 1970 00:00:01 GMT'; $( "#script-installer-top-container a:contains('Manage')" ).trigger( 'click' ); } } ); } ); }() ); krdya7xhxcqoac64q8fu5png0jm738b MediaWiki:Gadget-mobile-sidebar.js 8 53807 311642 311003 2026-11-02T19:47:51Z Maintenance script 11523 Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup) 311642 javascript text/javascript /* _____________________________________________________________________________ * | | * | === DIGTOOR: FAYLKA GADGET-KA CAALAMIGA AH === | * | Isbeddellada boggan waxay saameeyaan isticmaaleyaal badan. | * | Fadlan kala hadal isbeddellada bogga wadahadalka ama [[WT:Gadget]] ka hor inta| * | aadan wax ka beddelin. | * |_____________________________________________________________________________| * * Laga soo guuriyay [[meta:User:Brion VIBBER/mobile-sidebar.js]] laga bilaabo cusboonaysiintii ugu dambaysay (2014-10-13, [[meta:Special:Permalink/10185490]]) * Sidoo kale eeg https://github.com/brion/MediaWiki-MobileSidebar * * Gadget-ka hordhaca dhinaca mobilada (Mobile sidebar preview gadget) * * Hack degdeg ah si loo tuso sida bogagga ugu eg yihiin mobilada * inta la dhex mushaaxayo bogga desktop-ka. * * Brion Vibber <bvibber@wikimedia.org> * 2014-10-10 * Waxaa nadiifiyay oo hagaajiyay prtksxna * Waxaa sii nadiifiyay Brion :D */ $(function () { // Cabbirkii duuga ahaa ee iPhone, ugu yaraan ee aan badanaa aragno var width = 320, height = 480; // @todo malaha ka dhig cabbirka mid la dooran karo oo laga helayo xulashooyin qaar... // Ogow in cabbirada pixel ay yihiin kuwo marin habaabin ku ah mobilada, maadaama inta badan uu jiro // cufnaanta factor-ka. Tusaale ahaan shaashadaha 480x800 ee 1.5x waxay dabooli lahaayeen // oo kaliya 320x533 ama wax la mid ah. Hana gelinina arinta iPhone 6 Plus! function showSidebar() { localStorage['mw-mobile-sidebar-state'] = 'show'; var $content = $('#content'); var top = $content.position().top, page = mw.config.get('wgPageName'), src = '/wiki/' + encodeURIComponent(page) + '?useformat=mobile', lang = mw.config.get('wgContentLanguage'); var $container = $('<div>').attr('id', 'mobile-sidebar'); var $mobileLink = $('<a>') .text( 'Mobil' ) .addClass ( 'mobile_link' ) .attr( 'href', src ) .attr( 'target', '_blank') .appendTo( $container ); var $egg = $( '<div>' ) .addClass( 'egg' ) .append( $( '<img>' ).attr( 'src', 'https://thumb.wikimedia.org/wikipedia/commons/thumb/8/81/Wikimedia-logo.svg/240px-Wikimedia-logo.svg.png' ), $( '<p>' ).html( 'Haddii aad lumiso fadlan ugu soo celi <a href="https://meta.wikimedia.org/wiki/User:Brion_VIBBER">Brion Vibber</a>' ) ) .appendTo( $container ) .hide(); // @todo ogaado scrollbars oo magdhab ballaca var $frame = $('<iframe>') .attr('src', src) .css('width', width + 'px') .css('height', height + 'px') .appendTo($container); var $close = $('<a>') .html(' &times;') .addClass('close') .click( hideSidebar ) .appendTo( $container ); $container.on( 'dblclick', function () { $egg.toggle(); $mobileLink.toggle(); $close.toggle(); $frame.toggle(); } ); var frame = $frame[0]; $frame.on('load',function () { // ka fogow TypeError: null is not an object (evaluating 'frame.contentDocument.querySelector') if(!frame.contentDocument) return; // Magdhab scrollbars-ka browser-ada ku dara var scrollBarWidth = width - frame.contentDocument.querySelector('body').clientWidth; if ( scrollBarWidth > 0 ) { $frame.css( 'width', ( width + scrollBarWidth ) + 'px' ); } // Maaree navigation-ka xiriirka ee dhexda u ah dokumentiga hordhaca mobilada $(frame.contentDocument).on('click', 'a', function (e) { e.preventDefault(); if ($(this).attr('href') && $(this).attr('href').indexOf('#') !== 0) { window.location = this.href; } }); }); if ( mw.config.get( 'skin' ) === 'vector-2022' && window.innerWidth >= 1800 && document.body.classList.contains( 'vector-feature-limited-width-enabled' ) ) { // Uma baahna in la wareejiyo nuxurka maadaama ballaca nuxurka xaddidan ee Vector 2022 uu shaqaynayo oo firfircoon yahay } else { $('#content').css('margin-right', '360px'); } $('#content').after($container); } function hideSidebar() { localStorage['mw-mobile-sidebar-state'] = 'hidden'; $('#mobile-sidebar').remove(); $('#content').css('margin-right', '0'); } function toggleState() { if (localStorage['mw-mobile-sidebar-state'] !== 'hidden') { hideSidebar(); } else { showSidebar(); } } if (mw.config.get('wgAction') == 'view') { var item = mw.util.addPortletLink( 'p-views', '#', 'Mobil', 'ca-mobile', 'Toggle mobile view sidebar' ); if ( item ) { item.classList.remove( 'vector-tab-noicon' ); if ( mw.config.get( 'skin' ) === 'vector-2022' ) { item.querySelector('a').classList.add( 'cdx-button', 'cdx-button--fake-button', 'cdx-button--fake-button--enabled', 'cdx-button--weight-quiet', 'cdx-button--icon-only' ); } else { item.classList.add( 'icon' ); } $(item).click( toggleState ); } if (localStorage['mw-mobile-sidebar-state'] == 'hidden') { hideSidebar(); } else { showSidebar(); } } }); 8412lszh5z3zt9xipnwub7t94bo65yx MediaWiki:Gadget-ProveIt-classic.js 8 53902 311641 311104 2026-11-02T19:47:50Z Maintenance script 11523 Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup) 311641 javascript text/javascript /* _____________________________________________________________________________ * | | * | === DIGRIIN: FAYLKA GADGET-KA CAALAMIGA AH === | * | Isbeddellada faylkan waxay saameeyaan isticmaaleyaal badan. | * | Fadlan kala hadal isbeddellada bogga wadahadalka ama [[WT:Gadget]] ka hor inta aadan wax ka beddelin.| * |_____________________________________________________________________________| */ // <nowiki> /* * Waxaa laga soo dejiyay Git commit 72b9abf17fe33ab8af55a7cfb074a9beb35365ab laga bilaabo 2015-03-09 laga soo bilaabo https://github.com/proveit-js/proveit * Isbeddellada waa in lagu sameeyaa mashruuca GitHub ee halkaas ah. */ /* * ProveIt ([[User:ProveIt GT]]) waa qalab GUI oo xoog badan oo loogu talagalay in lagu arko, lagu daro, loona beddelo, loona geliyo tixraacyada Wikipedia. * * Xuquuqda daabacaadda 2008 - 2011 * * Georgia Tech Research Corporation * * Atlanta, GA 30332-0415 * * Xuquuqda daabacaadda 2011 - * * Matthew Flaschen * * XUQUUQDA DHAMMAAN WAA LA DHAWAYNAYAA * * ProveIt waxaa lagu heli karaa iyada oo la raacayo Shatiga Dokumentiyada Xorta ah ee GNU (GFDL-1.3.txt), Shatiga Creative Commons * Attribution/Share-Alike License 3.0 (http://creativecommons.org/licenses/by-sa/3.0/), iyo Shatiga Guud ee Dadweynaha GNU 2 (GPL-2.txt) * * Waxaa ku jira astaamo laga soo qaatay xirmada Silk (http://www.famfamfam.com/lab/icons/silk/), oo uu leeyahay Mark James, lana isticmaalay iyada oo la raacayo * Shatiga Creative Commons Attribution 3.0. */ /** * Bulshooyinka Barashada Elektroniga ah * @module elc */ ( function ( mw, $ ) { /* Halbeegga labaad (sheyga proveit ee horay u jiray, haddii uu jiro) ee loo gudbiyay kordhinta ayaa ka sarreeya kan koowaad. Wuxuu siinayaa isticmaaleyaasha ikhtiyaarka ah inay si fudud uga gudbaan xarumaha bilowga ah, sida shouldAddSummary. Haddii proveit si lama filaan ah looga soo dejiyo wax ka badan hal jeer, soo dejinta koowaad ayaa mudnaan yeelan doonta. */ /** * Fasalka ugu weyn iyo meesha magaca ee barnaamijka ProveIt. Tani waa keligii doorsoomaha caalamiga ah. * @class proveit */ var proveit = window.proveit = $.extend({ /** * Qiyaastii kala bar dhererka sanduuqa wax-ka-beddelka. Waxaa lagu isticmaalaa duubista marka la muujinayo qoraalka. * @type Number */ HALF_EDIT_BOX_HEIGHT: 200, // Tani waxay noqon kartaa mid ay maamusho doorbididda, halkii ay ka ahaan lahayd mid adag (hard-coded). /** * Luqadda loo isticmaalo sharaxaadaha * @type String */ LANG: "en", /** * Qoraalka ka hor magaca cabbirka (tusaale url, cinwaan, iwm.) ee sanduuqa abuurista, si looga fogaado isku dhacyada aqoonsiyada aan la xiriirin. * @type String */ NEW_PARAM_PREFIX: "newparam", /** * Qoraalka ka hor magaca cabbirka (tusaale url, cinwaan, iwm.) ee sanduuqa wax-ka-beddelka, si looga fogaado isku dhacyada aqoonsiyada aan la xiriirin. * @type String */ EDIT_PARAM_PREFIX: "editparam", GUI_ID: "proveit", /* Waxaa loo isticmaalaa in lagu dhex miiro furayaasha, oo ay ku jiraan magacyada cabbirka tixraaca, iyo qoraalka ay akhriyi karaan dadku. Waxaa loo tarjumi karaa * si fudud. Ku dar sharaxaadaha.xx , halkaasoo xx ay tahay * lambarka ISO 639-1 ee luqadda, ka dibna deji proveit.LANG "xx" * si aad u isticmaasho sharaxaadaha cusub. */ descriptions : { en : { agency: "Wakaaladda", name: "Magaca", author: "Qoraha (Magaca Dambe, Magaca Koowaad)", author2: "Qoraha labaad (Magaca Dambe, Magaca Koowaad)", author3: "Qoraha saddexaad (Magaca Dambe, Magaca Koowaad)", author4: "Qoraha afraad (Magaca Dambe, Magaca Koowaad)", author5: "Qoraha shanaad (Magaca Dambe, Magaca Koowaad)", author6: "Qoraha lixaad (Magaca Dambe, Magaca Koowaad)", author7: "Qoraha toddobaad (Magaca Dambe, Magaca Koowaad)", author8: "Qoraha siddeedaad (Magaca Dambe, Magaca Koowaad)", author9: "Qoraha sagaalaad (Magaca Dambe, Magaca Koowaad)", last: "Magaca dambe", last2: "Magaca dambe (qor. labaad)", last3: "Magaca dambe (qor. saddexaad)", last4: "Magaca dambe (qor. afraad)", last5: "Magaca dambe (qor. shanaad)", last6: "Magaca dambe (qor. lixaad)", last7: "Magaca dambe (qor. toddobaad)", last8: "Magaca dambe (qor. siddeedaad)", last9: "Magaca dambe (qor. sagaalaad)", first: "Magaca koowaad", first2: "Magaca koowaad (qor. labaad)", first3: "Magaca koowaad (qor. saddexaad)", first4: "Magaca koowaad (qor. afraad)", first5: "Magaca koowaad (qor. shanaad)", first6: "Magaca koowaad (qor. lixaad)", first7: "Magaca koowaad (qor. toddobaad)", first8: "Magaca koowaad (qor. siddeedaad)", first9: "Magaca koowaad (qor. sagaalaad)", authorlink: "Magaca maqaalka qoraha", title: "Cinwaanka", trans_title: "Cinwaanka Ingiriisi", publisher: "Daabacaha", year: "Sanadka", location: "Goobta", place: "Goobta shaqada", isbn: "ISBN", id: "Aqoonsiga (ID)", doi: "DOI", page: "Bogga", pages:رځ "Bogagga", quote: "Oraahda", month: "Bisha", journal: "Joornaalka", edition: "Daabacaadda", volume: "Tilmaanta mugga", issue: "Tirada", url: "URL", date: "Taariikhda daabacaadda", accessdate: "Taariikhda la helay", coauthors: "Wadajir u qorayaasha", booktitle: "Cinwaanka Kulamada", contribution: "Tabarruca/Cutubka", encyclopedia: "Encyclopaedia", newsgroup: "Kooxda wararka", version: "Nooca", site: "Goobta", newspaper: "Wargeyska", "publication-place": "Goobta daabacaadda", editor: "Tifaftiraha (Magaca Dambe, Magaca Koowaad)", article: "Maqaalka", pubplace: "Goobta daabacaha", pubyear: "Sanadka daabacaadda", inventor: "Hal-abuuraha (Magaca Dambe, Magaca Koowaad)", "issue-date": "Taariikhda la soo saaray", "patent-number": "Lambarka ruqsad-abuurka (Patent)", "country-code": "Summadda dalka (XX)", work: "Shaqada", format: "Qaabka", issn: "ISSN", pmid: "PMID", chapter: "Cutubka", web: "Shabakadda", book: "Buugga", conference: "Shirka", news: "Warka", paper: "Warqadda", "press release": "War-saxaafadeedka", interview: "Wareysiga", "AV media": "Shaqada maqalka iyo muuqaalka", subject: "Muducda", subjectlink: "Magaca maqaalka mawduuca", subject2: "Mawduuca labaad", subjectlink2: "Magaca maqaalka mawduuca labaad", subject3: "Mawduuca saddexaad", subjectlink3: "Magaca maqaalka mawduuca saddexaad", subject4: "Mawduuca afraad", interviewer: "Wareystaha", cointerviewers: "Wada-wareystayaasha", type: "Nooca", program: "Barnaamijka", callsign: "Calaamadda wicitaanka", city: "Magaalada", archiveurl: "URL-ka kaydka", archivedate: "Taariikhda la kaydiyay", episode: "Qaybta (Episode)", episodelink: "Magaca maqaalka qaybta", series: "Taxanaha", serieslink: "Magaca maqaalka taxanaha", credits: "Abaalmarinnada/Aqoonsiga hawlwadeennada", network: "Shabakadda", station: "Istishanka", airdate: "Taariikhda la baahiyay", began: "Taariikhda billowga", ended: "Taariikhda dhammaadka", season: "Lambarka xilli-ciyaareedka (Season)", seriesno: "Lambarka xilli-ciyaareedka", number: "Lambarka", minutes: "Daqiiqadaha", transcript: "Qoraalka codka la rogay (Transcript)", transcripturl: "URL-ka qoraalka codka la rogay", people: "Dadka", medium: "Dhexdhexaadinta wax-soosaarka", language: "Luqadda", time: "Waqtiga", oclc: "OCLC", ref: "Aqoonsiga barroosinka (Anchor ID)", deadurl: 'URL dhintay?', raw: 'Qaab aan la aqoon' }, // Turjumaadda Finnishka waxaa qoray Olli (ollinpostit at gmail.com) fi: { agency: "Edustaja", name: "Nimi", author: "Tekijä", author2: "Tekijä kaksi", author3: "Tekijä kolme", author4: "Tekijä neljä", author5: "Tekijä viisi", author6: "Tekijä kuusi", author7: "Tekijä seitsemän", author8: "Tekijä kahdeksan", author9: "Tekijä yhdeksän", last: "Sukunimi", last2: "Sukunimi (tekijä 2)", last3: "Sukunimi (tekijä 3)", last4: "Sukunimi (tekijä 4)", last5: "Sukunimi (tekijä 5)", last6: "Sukunimi (tekijä 6)", last7: "Sukunimi (tekijä 7)", last8: "Sukunimi (tekijä 8)", last9: "Sukunimi (tekijä 9)", first: "Etunimi", first2: "Etunimi (tekijä 2)", first3: "Etunimi (tekijä 3)", first4: "Etunimi (tekijä 4)", first5: "Etunimi (tekijä 5)", first6: "Etunimi (tekijä 6)", first7: "Etunimi (tekijä 7)", first8: "Etunimi (tekijä 8)", first9: "Etunimi (tekijä 9)", authorlink: "Tekijästä kertova sivu", title: "Otsikko", publisher: "Julkaisija", year: "Vuosi", location: "Paikka", place: "Työn paikka", isbn: "ISBN", id: "ID", doi: "DOI", page: "Sivu", pages: "Sivuja", quote: "Lainaus", month: "Kuukausi", journal: "Aikakauslehti", edition: "Painos", volume: "Vuosikerta", issue: "Numero", url: "Osoite", date: "Julkaisupäivä", accessdate: "Luettu", coauthors: "Muut tekijät", booktitle: "Jatko-osien otsikko", contribution: "Osallistuminen/yhteistyö", encyclopedia: "Tietosanakirja", newsgroup: "Uutisryhmä", version: "Versio", site: "Sivusto", newspaper: "Sanomalehti", "publication-place": "Julkaisupaikka", editor: "Toimittaja", article: "Artikkeli", pubplace: "Julkaisijan paikka", pubyear: "Julkaisuvuosi", inventor: "Keksijä", "issue-date": "Saatavilla päivänä", "patent-number": "Patenttinumero", "country-code": "Maakoodi (XX)", work: "Työ", format: "Muoto", issn: "ISSN", pmid: "PMID", chapter: "Luku", web: "Verkko", book: "Kirja", conference: "Kokous", news: "Uutiset", paper: "Lehti", "press release": "Lehdistötiedote", interview: "Haastattelu", subject: "Otsikko", subjectlink: "Artikkelin otsikko", subject2: "Otsikko kaksi", subjectlink2: "Artikkelin kaksi otsikko", subject3: "Otsikko kolme", subjectlink3: "Artikkelin kolme otsikko", subject4: "Otsikko neljä", interviewer: "Haastattelija", cointerviewers: "Muut haastattelijat", type: "Tyyppi", program: "Ohjelma", callsign: "Call sign", city: "Kaupunki", archiveurl: "Arkiston osoite", archivedate: "Arkistointipäivämäärä", episode: "Jakso", episodelink: "Jakson sivun nimi", series: "Sarja", serieslink: "Sarjan sivun nimi", credits: "Tekijät", network: "Verkko", station: "Asema", airdate: "Lähetyspäivä", began: "Aloituspäivä", ended: "Lopetuspäivä", season: "Kauden numero", seriesno: "Kauden numero", number: "Numero", minutes: "Minuutit", transcript: "Puhtaaksi kirjoitettu teksti", transcripturl: "Puhtaaksikirjoitetun osoite", video: "Video", people: "Ihmiset", medium: "Tuotantomedia", language: "Kieli", time: "Aika", oclc: "OCLC", ref: "Ankkurin ID-tunnus" } }, /** * Doorashada ikhtiyaariga ah si loo cayimo qaabka taariikhda caadiga ah ee tixraacyada cusub. * Haddii la dejiyo, waxay ka sarreysaa doorbididda taariikhda guud ee ka timid Special:Preferences. * * @type {String} xadhigga qaabka taariikhda ee la taageero */ dateFormatString: null, /** * Singleton loo isticmaalo in lagu qaabeeyo taariikhaha iyadoo la raacayo doorbididda isticmaalaha * * @type DateFormatter */ dateFormatter: null, /** * Wuxuu helayaa doorbididda waxtarka leh ee qaabka taariikhda. Haddii aaysan jirin doorbidid gaar u ah ProveIt * oo hore u joogtay proveit.dateFormatString, waxay go'aamin doontaa doorbididda saxda ah * oo ka timid doorbididda isticmaalaha MW. Kadib, waxay kaydin doontaa qiimahaas proveit.dateFormatString * * @return {String} qaabka xadhigga ee loo isticmaalo taariikhaha */ getDatePreference: function () { if (this.dateFormatString === null) { this.dateFormatString = mw.user.options.get('date'); } return this.dateFormatString; }, /** * Wuxuu soo celinayaa sharaxaadaha luqadda hadda. * @return {Object} sharaxaadaha */ getDescriptions: function() { // Tani waxay noqon kartaa mid gaar u ah Cite haddii loo baahdo. return this.descriptions[proveit.LANG]; }, /** * Qoraalka lagu daray diiwaannada si loo fududeeyo raadinta * @type String */ LOG_MARKER: "[ProveIt] ", /** * Shaqada diiwaangelinta fudud * @type {...Object} var_args walxaha (oo ay ku jiraan xadhigaha) ee la diiwaangelinayo */ log: function() { var args = Array.prototype.slice.call(arguments); args.unshift(this.LOG_MARKER); mw.log.apply(mw, args); }, /** * Diiwaangeliso shayga qaladka haddii ay suurtagal tahay, iyadoo la isticmaalayo qalad (oo la door bido), ama diiwaan, haddii la heli karo. * @param {Error} ex shayga qaladka */ logException: function(ex) { var args = [ex, ex.stack]; if(typeof(console) === "object" && $.isFunction(console.error)) { args.unshift(this.LOG_MARKER); console.error.apply(null, args); } else { this.log.apply(this, args); } }, /** * Wuxuu soo celinayaa run haddii boggu leeyahay sanduuqa wax-ka-beddelka wikitext * * @return {Boolean} run haddii boggu leeyahay sanduuqa wax-ka-beddelka wikitext, beenta haddii kale */ isEditPage: function() { var contentModel = mw.config.get( 'wgPageContentModel' ), action = mw.config.get( 'wgAction' ); return contentModel === 'wikitext' && ( action === 'edit' || action === 'submit' ); }, /** * Wuxuu soo celinayaa run haddii boggu ay u badan tahay inuu ka kooban yahay tixraacyo * @return {Boolean} run haddii boggu la taageero, beenta haddii kale */ isSupportedPage: function() { var namespace = mw.config.get( 'wgCanonicalNamespace' ), pageName = mw.config.get( 'wgPageName' ); // Maqaal "caadi ah", meesha isticmaalaha, ama Wikipedia:Sandbox (ka reebitaan tijaabo ah). return ( namespace === '' || namespace === 'User' || pageName === 'Wikipedia:Sandbox'); }, /** * Shaqada fududeynta. Waxaa la soo celinayaa curiyaha sanduuqa tixraaca (refbox). * @return {$Node} sanduuqa tixraaca */ getReferenceBox: function() { return $("#refs"); }, /** * Waxay bixisaa leexashada x (bidix) iyo y (kor) ee curiyaha la bixiyay. Laga soo qaatay QuirksMode (http://www.quirksmode.org/js/findpos.html), oo ah bog si xor ah loo heli karo oo uu leeyahay Peter-Paul Koch * @param {Node} node kasta oo HTML node ah * @return {Object} leexashada node-ka, oo ah shay leh sifooyinka bidix iyo kor (left and top). */ getPosition: function(node) { var left = 0, top = 0; do { left += node.offsetLeft; top += node.offsetTop; } while (node = node.offsetParent); return {"left": left, "top": top}; }, /** * Wuxuu muujinayaa dherer gaar ah oo qoraal ah, oo ku yaal tusmo gaar ah. * @param {Number} startInd tusmada bilowga ah ee sanduuqa wax-ka-beddelka Wikipedia * @param {Number} length dhererka xadhigga la muujinayo * @return {Boolean} had iyo jeer waa run */ highlightLengthAtIndex: function(startInd, length) { if(startInd < 0 || length < 0) { this.log("highlightStringAtIndex: doodaha taban ee aan saxda ahayn"); } var box = this.getTextbox(); var origText = box.value; var editTop = this.getPosition(box).top; box.value = origText.substring(0, startInd); box.focus(); box.scrollTop = 1000000; // Ka weyn sanduuq kasta oo dhab ah (rajo ahaan) var curScrollTop = box.scrollTop; box.value += origText.substring(startInd); if(curScrollTop > 0) { box.scrollTop = curScrollTop + this.HALF_EDIT_BOX_HEIGHT; } $(box).focus().textSelection('setSelection', { start: startInd, end: startInd + length }); editTop = this.getPosition(box).top; window.scroll(0, editTop); return true; }, /** * Wuxuu muujinayaa dhacdada ugu horreysa ee xadhig la bixiyay ee sanduuqa wax-ka-beddelka MediaWiki. * @param {String} targetStr xadhigga sanduuqa wax-ka-beddelka ee la rabo in la muujiyo * @return {Boolean} run haddii ay guulaysato, beenta haddii kale */ highlightTargetString: function(targetStr) { var origText = this.getTextboxText(); var startInd = origText.indexOf(targetStr); if(startInd == -1) { this.log("Xadhigga bartilmaameedka ah \"" + targetStr + "\" la ma helin."); return false; } return this.highlightLengthAtIndex(startInd, targetStr.length); }, /** * Shaqada fududeynta. Wuxuu soo celinayaa curiyaha textarea ee MediaWiki ee ceyriinka ah. * @return {Node} curiyaha sanduuqa wax-ka-beddelka */ getTextbox: function() { return $("#wpTextbox1")[0]; }, /** * Waxay bixisaa qiimaha sanduuqa wax-ka-beddelka oo leh caadiyaynta CR * * @return {String} qiimaha sanduuqa wax-ka-beddelka iyadoo CRs la tirtiray haddii document.selection uu jiro */ getTextboxText: function() { var box = this.getTextbox(); var value = box.value; if(!box.selectionStart && document.selection) // Dabeecad u eg IE 8 { value = value.replace(/\r\n/g, "\n"); } return value; }, /** * Wuxuu soo celinayaa curiyaha foomka wax-ka-beddelka ee ceyriinka ah, kaas oo ka kooban MWEditBox, iyo waxyaabo kale. * @return {Node} curiyaha foomka wax-ka-beddelka */ getMWEditForm: function() { return $("#editform")[0]; }, /** * Wuxuu socodsiiyaa shaqo la bixiyay marka la soo gudbiyo foomka wax-ka-beddelka * @param {Function} subFunc shaqada la socodsiinayo marka la soo gudbinayo */ addOnsubmit: function(subFunc) { var form = this.getMWEditForm(); if(!form) { throw new Error("Ma jiro foom wax-ka-beddel ah, waxaa laga yaabaa inay sabab u tahay bog la ilaaliyo."); } form.addEventListener("submit", subFunc, false); }, /** * Wuxuu soo celinayaa curiyaha kooban ee wax-ka-beddelka MW ee ceyriinka ah * @return {Node} curiyaha soo koobitaanka wax-ka-beddelka */ getSummary: function() { return $("#wpSummary")[0]; }, /** * La soco inaan horay u soo darnay shaqada onsubmit si loogu daro ProveIt soo koobitaanka. * Tani waxay damaanad qaadaysaa inaan shaqada laba jeer la socodsiinin. * @type Boolean */ summaryFunctionAdded: false, /** * Ma rabtaa isticmaalahu inaan mar walba ku darno soo koobitaanka "Waxaa wax ka beddelay ProveIt"? * @type Boolean */ shouldAddSummary: true, /** * ProveIt waa inay ka muuqataa rarka (halkii laga rabi lahaa gujinta badhanka qalabka) ee bogagga wax-ka-beddelka ee la taageero * @type Boolean */ loadVisible: true, /** * Weynweeeyso ProveIt marka ay ugu horrayn muuqato. Haddii ay beenta tahay, waxay ka billaaban doontaa yaraynta. Tani saameyn ku ma leh goorta ay muuqaneyso. * @type Boolean */ loadMaximized: false, /** * Waxay cayimeysaa in lagu daro soo koobitaanka wax-ka-beddelka ProveIt keydinta xigta. * Waa la damin karaa iyadoo la beddelayo shouldAddSummary */ includeProveItEditSummary: function() { if(this.shouldAddSummary && !this.summaryFunctionAdded) { try { var thisproveit = this; this.addOnsubmit(function() { var summary = thisproveit.getSummary(); if(summary.value.indexOf("ProveIt") == -1) { summary.value += " (waxaa wax ka beddelay [[User:ProveIt_GT|ProveIt]])"; } }); this.summaryFunctionAdded = true; } catch(e) { this.log("Way ku guuldarraysatay in lagu daro hawlwadeenka onsubmit. e.message: " + e.message); } } }, /** * Deji badhanka si isticmaaleyaashu ay ugu raran karaan ProveIt marka loo baahdo */ setupButton: function() { var $box = $(this.getTextbox()); // Waxay hubisaa in wikiEditor la soo raray $box.on('wikiEditor-toolbar-buildSection-main', function(event, section) { delete section.groups.insert.tools.reference; section.groups.insert.tools.proveit = { label: 'ProveIt', type: 'button', icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/1/19/ProveIt_logo_for_user_boxes.svg/22px-ProveIt_logo_for_user_boxes.svg.png', action: { type: 'callback', execute: function() { proveit.toggleVisibility(); } } }; }); }, /** * Deji ProveIt haddii aan joogno bog wax-ka-beddel. Tani waxaa ku jira dejinta badhanka qalabka. Iyadoo ku xiran qaabeynta iyo bogga hadda, waxay sidoo kale wici kartaa rarid si loo muujiyo ProveIt. */ setup: function() { if(this.isEditPage()) { if(this.loadVisible && this.isSupportedPage()) { this.load(); } this.setupButton(); } }, /** * Waxay soo dejisaa ku-tiirsanaanta waxayna abuurtaa GUI */ load: function() { $(function() { var dependencies = ['jquery.ui', 'jquery.textSelection', 'mediawiki.util']; var preference = proveit.getDatePreference(); proveit.dateFormatter = new proveit.DateFormatter(preference); mw.loader.using(dependencies, function() { try { proveit.createGUI(); if(proveit.loadMaximized) { proveit.toggleViewAddVisibility(); } } catch(ex) { proveit.logException(ex); } }, function(ex, errorDependencies) { proveit.log('Wuu ku guuldarraystay inuu soo raro mid ka mid ah kuwan: ', errorDependencies); }); }); }, /** * Nadiifi refBox ee refBoxRows, marka laga reebo safafka macmalka ah (dummy rows). * @return {Boolean} beenta haddii refBox aan la helin */ clearRefBox: function() { var box = this.getReferenceBox(); if(box == null) { this.log("Sanduuqa tixraaca weli lama soo darin."); return false; } $("tr:not('tr#dummyRef')", box).remove(); return true; }, /** Gelisa qoraalka tixraaca sanduuqa wax-ka-beddelka MW. * @param {String} ref Qoraalka tixraaca ee la gelinayo * @param {Boolean} full Geli qoraalka tixraaca buuxa haddii ay run tahay, oraahda haddii kale. * @return {Boolean} beenta haddii ay jiraan khaladaad */ insertRefIntoMWEditBox: function(ref, full) { var txtarea = this.getTextbox(); if(!txtarea) { this.log("insertRefIntoMWEditBox: txtarea waa null"); return false; } txtarea = $(txtarea); var insertionText = ref.getInsertionText(full); // Beddel xulashada hadda jirta (haddii ay jirto), ka dibna duub txtarea.textSelection('encapsulateSelection', { peri: insertionText, replace: true }); var caretPos = txtarea.textSelection('getCaretPosition', {startAndEnd: true}); // Tani waa mid xoogaa dib loo celiyay. Waxaa loogu yeeraa ugu horrayn shaqada duubista ee wareejinta (scrolling workaround) this.highlightLengthAtIndex(caretPos[0], caretPos[1] - caretPos[0]); this.includeProveItEditSummary(); }, /** * Wax ka beddel shayga tixraaca ee ka yimid GUI-da uu isticmaalahu wax ka beddelay. Shayga tixraaca waxaa lagu beddelaa meesha, markaa qiimaha la soo celiyo waa u jeeddo fududeyn oo keliya. * * @param {Node} editPane curiyaha ceyriinka ah ee editPane * @param {AbstractReference} ref shayga oraahda asalka ah ee aan wax ka beddelayno * * @return {AbstractReference} tixraaca isla marka la soo gudbiyay */ changeRefFromEditPane: function(ref, editPane) { var paramBoxes = $(editPane).find("div.input-row"); var refName = $('#editrefname').val(); ref.name = refName != "" ? refName : null; // Kaydi magacyada madhan sida null // Nadiifi cabbirkii hore ref.params = {}; var paramName, paramVal; for (var i = 0; i < paramBoxes.length; i++) { var paramRow = paramBoxes[i]; var valueTextbox = $(paramRow).find(".paramvalue")[0]; if($(paramRow).hasClass("addedrow")) // Lagu daray "Ku dar goob kale" { paramName = $.trim($(paramRow).find(".paramdesc")[0].value); } else { paramName = valueTextbox.id.substring(this.EDIT_PARAM_PREFIX.length); } this.log("paramName: " + paramName); paramVal = $.trim(valueTextbox.value); this.log("paramVal: " + paramVal); if (paramName != "" && paramVal != "") { ref.params[paramName] = paramVal; } } if (ref.toString() != ref.orig) { ref.save = false; } ref.update(); return ref; }, /** * Waxay abuurtaa refBoxRow, waxay cusboonaysiisaa lambarada dhammaan refBoxRows, waxay ku beddeshaa refBoxRow-kii hore mid cusub, waxayna cusboonaysiisaa qoraalka tixraaca ee MWEditBox. * @param {AbstractReference} ref tixraaca aan rabno inaan keydinno. */ saveRefFromEdit: function(ref) { if(!ref.save) { var newRichItem = this.makeReferenceBoxRow(ref, true); var oldRichItem = $('.selected', this.getReferenceBox()).get(0); var oldNumber = $('td.number', oldRichItem).text(); $('td.number', newRichItem).text(oldNumber); // ilaali lambaraynta hore oldRichItem.parentNode.replaceChild(newRichItem, oldRichItem); $(newRichItem).addClass('selected'); ref.updateInText(); this.includeProveItEditSummary(); } }, /** * Waxay cusboonaysiisaa muraayadda wax-ka-beddelka marka aad doorato tixraac aad wax ka beddesho. * @param {AbstractReference} ref tixraaca la doortay. */ updateEditPane: function(ref) { $('#editrefname').val(ref.name || ""); // Ha ku wasakheynin shayga dhabta ah cabbirro qashin ah. var tempParams = {}; for(var param in ref.params) { tempParams[param] = ref.params[param]; } // Ku dar cabbirro caadi ah oo leh qiimayaal madhan. var defaults = ref.getDefaultParams(); for(var i = 0; i < defaults.length; i++) { if(!tempParams[defaults[i]]) { tempParams[defaults[i]] = ""; } } var required = ref.getRequiredParams(); var paramNames = []; for(var item in tempParams) // Marka ugu horreysa dhex mar si aad u hesho magacyada. { paramNames.push(item); } var sorter = ref.getSorter(); if(sorter) { paramNames.sort(sorter); } else { paramNames.sort(); } /* Si loo kala sooco si loo bixiyo interface joogto ah. Wuxuu isticmaalaa nidaam kala soocid oo gaar ah (oo si fudud loo habeeyo) haddii ay suurtagal tahay. Javascript waxay sameysaa kala soocid burburin ah, taas oo kiiskan ah mid ku habboon... */ $('#edit-fields').children('.paramlist').children().remove('div:not(.hidden)'); // nadiifi dhammaan goobaha ku jira sanduuqa wax-ka-beddelka (marka laga reebo kuwa qarsoon) for(var j = 0; j < paramNames.length; j++) { this.addPaneRow($("#edit-pane").get(), tempParams, this.getDescriptions(), paramNames[j], required[paramNames[j]], true); } var acceptButton = $('#edit-buttons .accept'); var acceptEdit = function() { proveit.changeRefFromEditPane(ref, $("#edit-pane").get()); proveit.saveRefFromEdit(ref); $("#edit-pane").hide(); $("#view-pane").show(); }; // Iyadoo aan la lahayn setTimeout, dib u dejinta scroll-ka kama shaqayso Firefox. setTimeout(function() { // Dib u deji scroll-ka $('#edit-fields').scrollTop(0); }, 0); acceptButton.off('click.proveit').on('click.proveit', acceptEdit); }, /** * Ku dar saf editPane ama addPane. * @param {Node} root curiyaha xididka ee muraayadda * @param {Object} params shayga cabbirka ee tixraaca, ama null ee safarka lagu daray. * @param {Object} descs shayga sharaxaadda ee la isticmaalayo, ama null haddii aysan jirin sharaxaad * @param {String} item magaca cabbirka hadda * @param {Boolean} req run haddii magaca cabbirka hadda loo baahan yahay, haddii kale looma baahna. * @param {Boolean} fieldType run summad (label), beenta sanduuqa qoraalka (textbox). */ addPaneRow: function(root, params, descs, item, req, fieldType) { var id = fieldType ? "preloadedparamrow" : "addedparamrow"; var newline = $('#'+id).clone(); // nuqul ka qaado safka qarsoon $(newline).attr('id',''); // nadiifi aqoonsiga (ma yeelan karo laba curiye oo isla aqoonsi leh) //this.activateRemoveField(newline); var paramName = $('.paramdesc', newline).eq(0); var paramValue = $('.paramvalue', newline).eq(0); $('.paramlist', root).append(newline); if(req) // haddii goobta loo baahan yahay... { $(paramName).addClass('required'); // tilmaamaha muuqaalka ah in summadda loo baahan yahay $('.delete-field', newline).remove(); // ha u oggolaan dadka inay ka saaraan goobaha loo baahan yahay } else { this.activateRemoveField(newline); } if(fieldType) // sharaxaadda/magacu waa summad (ma aha sanduuq qoraal) { paramName.attr("for", this.EDIT_PARAM_PREFIX + item); paramValue.attr('id',this.EDIT_PARAM_PREFIX + item); var desc = descs[item]; if(!desc) { this.log("Sharaxaad aan la qeexin ee cabbirka: " + item + ". Si toos ah loogu isticmaalayaa sharaxaad ahaan."); desc = item; } $(paramName).text(desc).attr('title', item); $(paramValue).val(params[item]); } else { // lagu daray saf cusub, markaa ka dhig mid qurux badan $(newline).show('highlight',{},'slow'); $('.inputs', root).scrollTop(100000); } }, /* * kuwani waa qaabka hadda iyo qiimayaasha gelinta si loo muuqdo midka * hadda shaqeeya */ /** * run waxay tilmaamaysaa tixraacyada qaabka-cite, qaabka-oraahda (citation-style) haddii kale. Waxaa la isticmaalaa marka la abuurayo tixraac. * @type Boolean */ togglestyle: true, // TODO: Tani waa in meesha laga saaro haddii gelinta magaca keliya la oggol yahay. /** run waxay tilmaamaysaa tixraacyo buuxa, magaca keliya haddii kale. Waxaa la isticmaalaa marka la gelinayo. * Ogow in tixraacyada cusub had iyo jeer la geliyo si buuxda. * * @type Boolean */ toggleinsert: false, /* Kala-goyska Iskutallaabta-Browser-ka (Cross-Browser Split) 1.0.1 (c) Steven Levithan <stevenlevithan.com>; Shatiga MIT http://blog.stevenlevithan.com/archives/cross-browser-split Qaabka kala-goyska ee iskutallaabta-browser-ka ee waafaqsan ECMA */ /** * Hirgelinta iskutallaabta-browser-ka ee shaqada ECMAScript String.prototype.split. * * @param {String} str xadhigga gelinta ee la kala goynayo * @param separator kala-goysaha lagu kala goynayo, sida RegExp ama String * @param {Number} limit xadka tirada kala-goysyada. Haddii cabbirku maqan yahay, wax xad ah laguma soo rogo. * @return {Array} safka ka dhashay kala-goyska */ split: function (str, separator, limit) { // haddii `separator` uusan ahayn regex, isticmaal kan dhalashada `split` if (Object.prototype.toString.call(separator) !== "[object RegExp]") { return proveit.split._nativeSplit.call(str, separator, limit); } var output = [], lastLastIndex = 0, flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.sticky ? "y" : ""), separator = RegExp(separator.source, flags + "g"), // ka dhig `global` oo ka fogow dhibaatooyinka `lastIndex` adoo la shaqeynaya nuqul separator2, match, lastIndex, lastLength; str = str + ""; // beddelka nooca if (!proveit.split._compliantExecNpcg) { separator2 = RegExp("^" + separator.source + "$(?!\\s)", flags); // uma baahna /g ama /y, laakiin wax ma yeelaan } /* dabeecadda `limit`: haddii ay tahay... - `undefined`: xad ma jiro. - `NaN` ama eber: soo celi saf madhan. - lambar togan: isticmaal `Math.floor(limit)`. - lambar taban: xad ma jiro. - mid kale: beddel nooca, ka dibna isticma A xeerarka kore. */ if (limit === undefined || +limit < 0) { limit = Infinity; } else { limit = Math.floor(+limit); if (!limit) { return []; } } while (match = separator.exec(str)) { lastIndex = match.index + match[0].length; // `separator.lastIndex` ma aha mid lagu kalsoonaan karo iskutallaabta-browser-ka if (lastIndex > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); // hagaaji browser-yada kuwaas oo hababkooda `exec` aysan si joogto ah u soo celin `undefined` ee kooxaha qabsashada ee aan qayb qaadanayn if (!proveit.split._compliantExecNpcg && match.length > 1) { match[0].replace(separator2, function () { for (var i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undefined) { match[i] = undefined; } } }); } if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = lastIndex; if (output.length >= limit) { break; } } if (separator.lastIndex === match.index) { separator.lastIndex++; // ka fogow wareeg aan dhammaad lahayn } } if (lastLastIndex === str.length) { if (lastLength || !separator.test("")) { output.push(""); } } else { output.push(str.slice(lastLastIndex)); } return output.length > limit ? output.slice(0, limit) : output; }, // TODO: Ka saar koodka kala-goyska, oo kaliya isticmaal regex caadi ah (oo leh laba kooxood oo waaweyn magaca iyo qiimaha), si joogto ah. Regex.find? Ka dhig tilmaamayaasha magaca iyo qiimaha inay is waafaqaan, oo dib u habee koodka wicitaanka sida loo baahdo. Sidoo kale, hubi sida tan looga sameeyay koodka asalka ah. /** * Regex aad u caqli badan oo lagu falanqeeyo xadhigga shabakadda (template string) (tusaale |last=Smith|first=John|title=My Life Story) iyadoo loo kala qaadayo lammaanaha magaca iyo qiimaha. * * magacyadu waa saf ka kooban dhammaan magacyada, qiimayaashuna waa saf ka kooban dhammaan qiimayaasha. Waxay leeyihiin dherer siman. * * @param {String} workingString xadhigga shabakadda ee la falanqeynayo. * @return {Object} shay leh laba sifo, magacyada iyo qiimayaasha. */ splitKeysAndValues: function (workingString) { var split = {}; // Qaybta koowaad waa qoraal "caadi ah" (tuubooyin ma laha), halka tan labaad ay tahay xiriiriye wiki oo dheellitiran, oo leh tuubo ikhtiyaari ah. Isku-darka kasta ee labada ah ayaa muuqon kara. split.names = proveit.split(workingString.substring(workingString.indexOf("|") + 1), /=(?:[^|]*?(?:\[\[[^|\]]*(?:\|(?:[^|\]]*))?\]\])?)+(?:\||\}\})/); split.names.length--; // Ka saar curiyaha madhan ee keliya dhamaadka split.values = proveit.split(workingString.substring(workingString.indexOf("=") + 1, workingString.indexOf("}}")), /\|[^|=]*=/); return split; }, /** * Baadi tixraacyada ku jira MWEditBox, oo abuur shay tixraac iyo refBoxRow mid kasta. */ scanForReferences: function() { // kuwani waa xadhigyo loo isticmaalo in lagu oggolaado falanqaynta saxda ah ee tixraaca var workingstring; var cutupstring; this.clearRefBox(); var textValue = this.getTextboxText(); // maadaama aan dooranayno magaca ka hor inta aan nimid nooca tixraaca, halkan waxaa ku yaal doorsoome lagu hayo var name; // furaha - magaca // qiimaha - // shayga - furaha - "reference", qiimaha - shayga tixraaca . Wuxuu ka fogaadaa celcelinta shayga isku midka ah ee safafka tixraacyada. // furaha - "strings", qiimaha - safka xadhigaha asalka ah var citations = {}; // Safka shayada tixraaca. Dhamaadka shaqada, addNewElement ayaa lagu wacaa mid kasta. var references = []; // allRefs waa inay tiriisaa tixraacyada furitaanka, laakiin ma aha oraahda tixraaca (ma aha <ref name="..."" />) var allRefs = textValue.match(/<[\s]*ref[^\/>]*>/gi); // currentScan waxay haysaa liiska tixraacyada ee la falanqeeyay (match objects). Regex waxay la mid tahay tixraaca buuxa ama magaca-keliya. var currentScan = textValue.match(/<[\s]*ref[^>]*>(?:[^<]*<[\s]*\/[\s]*ref[\s]*>)?/gi); // [^<]* si sax ah uma maareyso tags-yada HTML ee ku dhex jira (ama faallooyinka). // haddii ay jiraan natiijooyin, if (currentScan) { for (var i = 0; i < currentScan.length; i++) { var reference = this.makeReference(currentScan[i]); if(reference) // Shayga tixraaca buuxa { name = reference.name; if(!name) // iyadoo aan la lahayn magac, suurtogal ma ahan magac soo noqnoqda. { references.push(reference); } } else // Ma aha tixraac buuxa. Suurtogal waa oraah (citation). { var match = currentScan[i].match(this.REF_REGEX); name = match && (match[1] || match[2] || match[3]); } if(name) { if(!citations[name]) { // Abuur safka xadhigaha tixraaca asalka ah citations[name] = {}; if(!citations[name].strings) { citations[name].strings = []; } } if(reference && !citations[name].reference) // tixraac, oo aan weli ahayn mid magacan leh { citations[name].reference = reference; references.push(reference); } // Ku dar safka citations[name].strings.push(currentScan[i]); } } } for(var j = 0; j < references.length; j++) { if(references[j].name) { var citation = citations[references[j].name]; references[j].setCitationStrings(citation.strings); } this.addNewElement(references[j]); } }, /** * Regex ee falanqaynta qoraal kasta oo tixraac ah. * @type RegExp */ REF_REGEX: /<[\s]*ref[\s]*name[\s]*=[\s]*(?:(?:\"(.*?)\")|(?:\'(.*?)\')|(?:(.*?)))[\s]*\/?[\s]*>/, /** * Shaqada warshadda ee tixraacyada. Waxay qaadataa qoraalka tixraaca, waxayna soo celineysaa tusaale ka mid ah fasalka ku habboon. * @param {String} refText qoraalka tixraaca * @return {AbstractReference} null haddii refText uusan ahayn tixraac, haddii kale shayga tixraaca */ makeReference: function(refText) { var isReference = /<[\s]*ref[^>]*>[^<]*\S[^<]*<[\s]*\/[\s]*ref[\s]*>/.test(refText); // Waxay tijaabisaa tixraaca (ma aha oraah); if(!isReference) { return null; } var citeFunction = refText.match(/{{[\s]*cite/i) ? this.CiteReference : refText.match(/{{[\s]*Citation/i) ? this.CitationReference : this.RawReference; if(citeFunction != this.RawReference) { var workingstring = refText.match(/{{[\s]*(cite|Citation)[\s\S]*?}}/i)[0]; var match = refText.match(this.REF_REGEX); if(match && match != null) { var name = match[1] || match[2] || match[3]; // 3 suurtogalnimadood, oo u dhigma regex-ka kore, waa <ref name="foo">, <ref name='bar'>, iyo <ref name=baz> } var cutupstring = workingstring.split(/\|/g); // Khiyaanadan yar waxay ku tiirsan tahay xaqiiqda ah in 'e' ay soo muuqato marka ugu horreysa sida xarafka dambe ee 'cite', noocuna uu xigaa. if(citeFunction == this.CiteReference) { var beforeBar = cutupstring[0]; var typeStart = beforeBar.toLowerCase().indexOf('e'); // Xirmada curly ee dhammaadka koowaad var rightCurly = beforeBar.indexOf('}'); // Badanaa, rightCurly waxay noqon doontaa -1. Laakiin tani waxay tixgelineysaa tixraacyada madhan sida <ref>{{cite web}}</ref> var typeEnd = rightCurly != -1 ? rightCurly : beforeBar.length; // qaado nooca, ka dibna hagaaji (trim). var type = $.trim(beforeBar.substring(typeStart + 1, typeEnd)); } } // nooca waxaa laga yaabaa inaan la qeexin, laakiin taas waa la aqbali karaa. var citation = new citeFunction({"name": name, "type": type, "save": true, "inMWEditBox": true, "orig": refText}); if(citeFunction != this.RawReference) { var split = this.splitKeysAndValues(workingstring); var names = split.names; var values = split.values; for (var j = 0; j < names.length; j++) { /* Iska tuur booska madhan, iyo |'s oo aan lahayn cabbirro, kuwaas oo aan weligood sax ku ahayn shabakadaha tixraaca.*/ var paramName = $.trim(names[j]).replace(/(?:\s*\|)*(.*)/, "$1"); var paramVal = $.trim(values[j]); // Miyay jiri kartaa shaqada setParam? Waxay xallin kartaa qiimayaasha madhan, oo xitaa ka tiri karta (si aamusmiisan ama si kale) cabbirada aan ansax ahayn. Sidoo kale, miyaa cabbirada lagu gudbin karaa dhisaha (constructor)? if (paramVal != "") { citation.params[paramName] = paramVal; } } } return citation; }, // TODO: Isticmaal https://gerrit.wikimedia.org/r/#/c/67166/ marka la mideeyo. /** * Fasalka qaabaynta taariikhda (Date-formatting class) * * @param {String} format mid ka mid ah xadhigyada qaabka ee uu taageero xudunta MW. * Hadda, qiimayaasha la taageero waa 'default', 'mdy', 'dmy', 'ymd', iyo 'ISO 8601'. * Haddii qiime aan la aqoon la gudbiyo, waxay isticmaali doontaa wgDefaultDateFormat. */ DateFormatter: function (format) { // 1-indexed (sababtoo ah shayga buuxinta ee 0), luqadda nuxurka bogga. var monthNames = mw.config.get('wgMonthNames'); var supportedFormats = ['mdy', 'dmy', 'ymd', 'ISO 8601']; if($.inArray(format, supportedFormats) === -1) { format = mw.config.get('wgDefaultDateFormat'); } function getMonthName(date) { return monthNames[date.getMonth() + 1]; } this.formatAsMdy = function(date) { return getMonthName(date) + ' ' + date.getDate() + ', ' + date.getFullYear(); }; this.formatAsDmy = function(date) { return date.getDate() + ' ' + getMonthName(date) + ' ' + date.getFullYear(); }; this.formatAsYmd = function(date) { return date.getFullYear() + ' ' + getMonthName(date) + ' ' + date.getDate(); }; this.formatAsISO8601 = function(date) { return date.getFullYear() + '-' + (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate(); }; var formatters = { mdy: this.formatAsMdy, dmy: this.formatAsDmy, ymd: this.formatAsYmd, 'ISO 8601': this.formatAsISO8601 }; /** * Waxay qaabeysaa taariikhda iyadoo la raacayo doorbididda la kaydiyay * * @param {Date} date taariikhda la qaabeynayo * * @return {String} taariikhda la qaabeeyey sida String */ this.format = function(date) { return formatters[format](date); }; }, /** * Nooca tixraaca xididka (Root reference type). Waalidka RawReference, CiteReference, iyo CitationReference. * @class AbstractReference * @for proveit * @constructor * @param {Object} argObj shayga doodda ee leh furayaasha ikhtiyaar kasta */ AbstractReference: function(argObj) { // CiteReference waxay leedahay baabi'in aan caadi ahayn (override) tan. Tan waxaa la qeexay goor hore (iyo si shuruudaysan) sababtoo ah waxaa lagu isticmaalaa dhisaha (constructor). if(!this.setType) { /** * @param {String} type nooca tixraaca */ this.setType = function(type) { this.type = type; }; } /** * Cusboonaysii xadhigyada oraahda ka dib markaad beddesho tixraaca. Tani waxay socotaa ka dib wax-ka-beddelka goobaha tixraaca (magaca, cabbirrada), laakiin ka hor inta aan la beddelin orig */ this.update = function() { var newCiteText = this.toString(); var strings = this.getCitationStrings(); /* * Cusboonaysii oraahda ugu weyn ee safafka xadhigaha. * * TODO: * Isticmaal safka xadhigaha halkan si aad u hesho oo aad u cusboonaysiiso oraahyada aan ahayn tixraacyada ugu weyn. Sida ay yihiin, waa kuwo aan lahayn cid daryeesha (orphaned). * Labada saf iyo sanduuqa qoraalka waa la cusboonaysiin karaa. * Waxaa laga yaabaa inay ku filnaato in la dejiyo dhammaan oraahyada aan ahayn kuwa ugu weyn ee ku jira qoraalka iyo safka kuwaas oo ah this.getInsertionText(false). * Si kastaba ha ahaatee, haddii ay ka saaraan magaca gabi ahaanba (lagu talin maayo), taasi waxay noqon laakiin dhibaato. */ if(strings.length > 0) // Tani waxay tilmaamaysaa inuu jiray magac hore { for(var i = 0; i < strings.length; i++) { // Haddii aan helno oraahda buuxa sida oraah, u cusboonaysii qoraalka cusub. if(strings[i] == this.orig) { // this.orig lafteedu waa la cusboonaysiiyaa updateInText strings[i] = newCiteText; } } } else if(this.name != null) // Waxay ku dareen magac, markaa waa inay haysataa oraah weyn. { // Hadda oo ay leedahay magac, waa oraah u gaar ah. strings.push(newCiteText); } }; /** * &lt;ref name /&gt; ee tixraaca * @type String */ this.name = argObj.name != "" ? argObj.name : null; // Kaydi magacyada madhan sida null /* nooca tixraaca, tusaale cite web, cite news. Sidoo kale waxaa loo isticmaalaa (oo ay ku jiraan shayada CitationReference) si loo go'aamiyo goobaha caadiga ah. */ this.setType(argObj.type); //TODO: Dib u eeg in labada (ama midkoodna) ee save ama inMWEditBox ay dhab ahaantii lagama maarmaan yihiin. Ma laga go'aan ka gaari karaa xaaladda? /** * calaamad lagu go'aaminayo in oraahda la keydiyo iyo inkote. beenta waxay tilmaamaysaa oraah "wasakh ah" oo ay tahay in lagu cusboonaysiiyo qoraalka iyo metadata. * @type Boolean */ this.save = argObj.save; /** * run haddii iyo keliya haddii tixraacu ku jiro sanduuqa wax-ka-beddelka MW oo wata qiime la mid ah kan orig ee shaygan. * @type Boolean */ this.inMWEditBox = argObj.inMWEditBox; /** * wikitext-ka asalka ah ee tixraaca * @type String */ this.orig = argObj.orig; /** * khariidadaynta magacyada cabbirka ee qiimayaasha * @type Object */ this.params = {}; /** * Shaqada fududeynta. Wuxuu soo celinayaa kala-soocaha cabbirada. * @return {Function} kala-soocaha cabbirada */ this.getSorter = function() { var thisCite = this; // Ka dhig xidhitaanka (closure) mid u shaqeeya sida loogu talagalay. // Kala-soocuhu wuxuu isticmaalaa paramSortKey marka hore, ka dibna wuxuu ku soo noqdaa nidaamka alifbeetada. return function(paramA, paramB) { var aInd = thisCite.getSortIndex(paramA); var bInd = thisCite.getSortIndex(paramB); if(aInd != -1 && bInd != -1) { return aInd - bInd; } else { proveit.log('Cabbirka wuu ka maqan yahay getSortIndex, taas oo keenta in kala-soociddu noqoto mid aan ansax ahayn. paramA: ', paramA, ', aInd: ', aInd, ', paramB: ', paramB, ', bInd: ', bInd); if(paramA < paramB) { return -1; } else if(paramA == paramB) { return 0; } else { return 1; } } }; }; /** * Wuxuu soo celinayaa run haddii tixraacani sax yahay, beenta haddii kale. * U qaado dhammaan shayada AbstractReference inay yihiin kuwo sax ah. Waxa lagu baabi'in karaa noocyada hoose (subtypes). * @return {Boolean} AbstractReference.isValid mar walba waxay soo celisaa run */ this.isValid = function(){return true;}; /** * Waxay abuurtaa summadda tixraaca iyadoo la isticmaalayo cinwaanka, qoraha, iwm. * @return {String} summadda la abuuray */ this.getLabel = function() { var label = ""; if (this.params.author) { label = this.params.author + "; "; } else if (this.params.last) { label = this.params.last; if (this.params.first) { label += ", " + this.params.first; } label += "; "; } if (this.params.title) { label += this.params.title; } if(label == "") { var value; for (value in this.params) { break; } if(value) // Ma jiri karaan cabbirro { label = value; } } return label; }; /** * Wuxuu helayaa qoraalka gelinta (sanduuqa wax-ka-beddelka). * * TODO: Abuur shay regex ah halkaas (getInsertionRegExp), si muujinta aysan ugu guuldarraysan isbeddellada fudud (tusaale bannaanada). * @param {Boolean} full Haddii ay run tahay, geli qoraalka buuxa, magaca tixraaca keliya haddii kale * @return {String} qoraalka gelinta */ this.getInsertionText = function(full) { if(full) { return this.toString(); } else { if(this.name) { return "<ref name=\"" + this.name + "\" />"; } else { throw new Error("getInsertionText: ref.name waa null"); } } }; /** * Waxay cusboonaysiisaa tixraacatan sanduuqa wax-ka-beddelka. */ this.updateInText = function() { var txtarea = proveit.getTextbox(); if (!txtarea || txtarea == null) return; txtarea.focus(); var text = proveit.getTextboxText(); text = text.replace(this.orig, this.toString()); // Ku samee beddelka textarea. txtarea.value = text; // Saldhigga wax-ka-beddellada mustaqbalka this.orig = this.toString(); this.save = true; proveit.highlightTargetString(this.toString()); }; /** * Habka caawiyaha gudaha ee toString. * @param {String} template template-ka tixraaca (hadda "cite" ama "Citation" * @param {Boolean} includeType run si loo daro this.type, beenta haddii kale * @return {String} xadhigga tixraaca hadda */ this.toStringInternal = function(template, includeType) { if(this.name) { var returnstring = "<ref name=\"" + this.name + "\">"; } else { var returnstring = "<ref>"; } returnstring += "{{" + template + (includeType ? " " + this.type : ""); for (var name in this.params) { returnstring += " | " + name + "=" + this.params[name]; } returnstring += "}}</ref>"; return returnstring; }; /** * Safka xadhigaha oraahda ee tixraacatan. * @type Array */ this.citationStrings = []; /** * Waxay u dejisaa citationStrings saf * @param {Array} strings safka xadhigaha oraahda, aan ahayn null */ this.setCitationStrings = function(strings) { this.citationStrings = strings; }; /** * Wuxuu helayaa safka citationStrings. * @return {Array} (laga yaabaa inuu madhan yahay) safka xadhigaha oraahda. Ma soo celin doono null. */ this.getCitationStrings = function() { return this.citationStrings; }; /** * Hel URL-ka summadda (icon URL) ee tixraaca * @return {String} URL-ka summadda */ this.getIcon = function() { return '//upload.wikimedia.org/wikipedia/commons/d/dd/Silk-Page_white.png'; }; }, /** * Dhisaha (constructor) nooca CiteReference. * @class CiteReference * @for proveit * @constructor * @extends AbstractReference * @param {Object} argObj shayga doodda, oo leh furayaasha ikhtiyaar kasta */ CiteReference: function(argObj) { /* Tani waa asal ahaan matalaad degdeg ah ee dib-u-jeedinnada template-ka, oo ay la socdaan * is-khariidadaynta. */ var typeNameMappings = { web: "web", book: "book", journal: "journal", conference: "conference", encyclopedia: "encyclopedia", news: "news", newsgroup: "newsgroup", paper: "journal", "press release": "press release", "pressrelease": "press release", interview: "interview", episode: "episode", "AV media": "AV media", DVD: "AV media", audio: "AV media", "av media": "AV media", cd: "AV media", dvd: "AV media", media: "AV media", movie: "AV media", "music video": "AV media", video: "AV media", visual: "AV media" }; // Wuxuu dejiyaa nooca (tusaale web ee cite web), iyadoo la adeegsanayo khariidadaynta. Tani waxay ku taal dusha sare sababtoo ah waxaa lagu isticmaalaa dhisaha AbstractReference. this.setType = function(rawType) { var mappedType = typeNameMappings[rawType]; if(mappedType != null) this.type = mappedType; else this.type = rawType; // Isticmaal nooca fudud sida kaydka badbaadada (fallback). }; /** * Wuxuu soo celinayaa nooca ujeeddada bandhigga, iyadoo lagu saleynayo fariimaha sharaxaadda. Tusaale ahaan, "AV media" waxay hadda soo celineysaa "Shaqada maqalka iyo muuqaalka". * * @return {String} nooca bandhigga */ this.getTypeForDisplay = function() { return proveit.getDescriptions()[this.type]; }; proveit.AbstractReference.call(this, argObj); // TODO: Miyuu CiteReference.getSortIndex iyo CitationReference.getSortIndex ku midoobaa AbstractCitation? Mid aad u yar, laakiin fudud in la ilaaliyo. /** * Wuxuu soo celinayaa tusmada kala-soocidda (sort index) ee cabbir la bixiyay * @param {String} param magaca cabbirka * @return {Number} tusmada kala-soocidda haddii la helo, -1 haddii kale */ this.getSortIndex = function(param) { // Tani waa nidaamka goobaha la soo bandhigi doono ama la soo saari doono. return $.inArray(param, [ "url", "title", "trans_title", "encyclopedia", "publisher", "work", "date", "agency", "accessdate", "author", "last", "first", "subject", "subjectlink", "inventor", "editor", "author2", "last2", "first2", "subject2", "subjectlink2", "author3", "last3", "first3", "subject3", "subjectlink3", "author4", "last4", "first4", "subject4", "author5", "last5", "first5", "author6", "last6", "first6", "author7", "last7", "first7", "author8", "last8", "first8", "author9", "last9", "first9", "authorlink", "coauthors", "interviewer", "cointerviewers", "type", "newsgroup", "journal", "booktitle", "program", "episodelink", "series", "serieslink", "credits", "network", "station", "callsign", "city", "airdate", "began", "ended", "season", "seriesno", "number", "minutes", "transcript", "transcripturl", "people", "year", "month", "article", "contribution", "format", "medium", "newspaper", "conference", "volume", "edition", "issue", "location", "pages", "page", "language", "isbn", "issn", "oclc", "doi", "pmid", "id", "archiveurl", "archivedate", "deadurl", "time", "quote", "ref" ]); }; /** * Wuxuu soo celinayaa tixraacatan sida xadhig ah. * @return {String} tixraaca sida xadhig */ this.toString = function() { return this.toStringInternal("cite", true); }; // Tixraacyada aan lahayn cabbiradan waxaa lagu calaamadin doonaa gaduud. // Run waxay tilmaamaysaa in loo baahan yahay (null, ama undefined, waxay ka dhigan tahay looma baahna) var requiredParams = { web: { "url": true, "title": true}, book: { "title": true }, journal: { "title": true }, conference: { "title": true }, encyclopedia: { "title": true, "encyclopedia": true }, news: { "title": true, "work": true, "date": true }, newsgroup: { "title": true }, "press release" : { "title": true }, interview: { "last": true }, // TODO: Wareysigu wuxuu u baahan yahay last *ama* subject. Hadda, ma matali karno taas. episode: { "title": true }, "AV media": { "title": true } }; /** * Soo celi cabbirada looga baahan yahay noocan oraahda. * @return {Object} shay leh cabbirada looga baahan yahay furayaal ahaan iyo run qiime ahaan; shay madhan oo ah nooc aan la aqoon */ this.getRequiredParams = function() { var curReq = requiredParams[this.type]; if(curReq) return curReq; else return {}; // Soo celi shay madhan halkii laga soo celin lahaa null si looga fogaado dereferencing null. }; // Cabbiradan waxaa loo soo jeedin doonaa si toos ah marka la wax ka beddelayo. var defaultParams = { web: [ "url", "title", "author", "accessdate", "work", "publisher", "date", "pages"], book: [ "title", "author", "authorlink", "year", "isbn", "publisher", "location", "pages", "url" ], journal: [ "title", "author", "journal", "volume", "issue", "year", "month", "pages", "url", "doi", "pmid" ], conference: [ "conference", "title", "booktitle", "author", "editor", "year", "month", "url", "id", "accessdate", "location", "pages", "publisher" ], encyclopedia: [ "title", "encyclopedia", "author", "editor", "accessdate", "edition", "year", "publisher", "volume", "location", "pages" ], news: [ "title", "author", "url", "work", "date", "accessdate", "pages", "location", "agency" ], newsgroup: [ "title", "author", "date", "newsgroup", "id", "url", "accessdate" ], "press release" : [ "title", "url", "publisher", "date", "accessdate" ], interview: ["last", "first", "subjectlink", "interviewer", "title", "callsign", "city", "date", "program", "accessdate"], episode: ["title", "series", "credits", "airdate", "city", "network", "season"], "AV media": ["people", "date", "url", "title", "medium", "location", "publisher"] }; /** * Wuxuu soo celinayaa cabbirada caadiga ah (lagu soo jeedinayo marka la wax ka beddelayo) ee tixraaca hadda * @return {Array} safka magacyada cabbirka caadiga ah; saf madhan haddii aan la aqoon */ this.getDefaultParams = function() { var curDefault = defaultParams[this.type]; if(curDefault) return curDefault; else return []; // Soo celi saf madhan halkii laga soo celin lahaa null si looga fogaado dereferencing null. }; this.isValid = function() { if(this.type == '') { return false; } var req = this.getRequiredParams(); var i = 0; var allFound = true; for(var reqParam in req) { /* Iska indhatir cabbirada ku jira shayga req ee ah null, undefined, ama false. Looma baahna. */ if(!req[reqParam]) continue; allFound &= (reqParam in this.params); if(!allFound) break; } return allFound; }; var iconMapping = { web: "//upload.wikimedia.org/wikipedia/commons/f/f0/Silk-Page_white_world.png", book: "//upload.wikimedia.org/wikipedia/commons/1/1e/Silk-Book.png", journal: "//upload.wikimedia.org/wikipedia/commons/f/f8/Silk-Page_white_text.png", news: "//upload.wikimedia.org/wikipedia/commons/3/32/Silk-Newspaper.png", newsgroup: "//upload.wikimedia.org/wikipedia/commons/5/5c/Silk-Comments.png", "press release": "//upload.wikimedia.org/wikipedia/commons/b/bd/Silk-Transmit_blue.png", interview: "//upload.wikimedia.org/wikipedia/commons/f/f7/Silk-Telephone.png", episode: "//upload.wikimedia.org/wikipedia/commons/b/b2/Silk-Television.png", "AV media": "//upload.wikimedia.org/wikipedia/commons/1/1a/Silk-film.png" }; var superGetIcon = this.getIcon; this.getIcon = function() { var icon = iconMapping[this.type]; if(icon) { return icon; } return superGetIcon.call(this); }; }, /** * Shaqada tixraacyada qaabka oraahda (citation style refs). * @class CitationReference * @for proveit * @constructor * @extends AbstractReference * @param {Object} argObj shayga doodda ee leh furayaasha ikhtiyaar kasta */ CitationReference: function(argObj) { proveit.AbstractReference.call(this, argObj); // Midna hadda looma baahna; var requiredParams = {}; // Cabbiradan waxaa loo soo jeedin doonaa si toos ah marka la wax ka beddelayo. var defaultParams = { web: [ "url", "author", "title", "date", "accessdate"], news: [ "author", "title", "newspaper", "url", "publication-place", "volume", "issue", "date", "pages"], encyclopedia: ["author", "editor", "contribution", "title", "publisher", "place", "year", "volume", "pages"], book: ["author", "title", "publisher", "place", "year"], journal: ["author", "title", "journal", "volume", "issue", "year", "pages"], patent: ["inventor", "title", "issue-date", "patent-number", "country-code"] }; /** * Wuxuu soo celinayaa tusmada kala-soocidda (sort index) ee cabbir la bixiyay * @param {String} param magaca cabbirka * @return {Number} tusmada kala-soocidda haddii la helo, -1 haddii kale */ this.getSortIndex = function(param) { // Tani waa nidaamka goobaha la soo bandhigi doono ama la soo saari doono. return $.inArray(param, [ "last", "first", "url", "author", "editor", "contribution", "author-link", "last2", "first2", "author2-link", "publication-date", "inventor", "title", "issue-date", "patent-number", "country-code", "journal", "volume", "newspaper", "issue", "date", "publisher", "place", "year", "edition", "publication-place", "series", "version", "pages", "page", "id", "isbn", "doi", "oclc", "accessdate" ]); }; /** * Wuxuu soo celinayaa tixraacatan sida xadhig ah. * @return {String} tixraaca sida xadhig */ this.toString = function() { return this.toStringInternal("Citation", false); }; /** * Soo celi cabbirada looga baahan yahay noocan oraahda. * @return {Object} shay leh cabbirada looga baahan yahay furayaal ahaan iyo run qiime ahaan; shay madhan oo ah nooc aan la aqoon */ this.getRequiredParams = function() { return requiredParams; }; /** * Wuxuu soo celinayaa cabbirada caadiga ah (lagu soo jeedinayo marka la wax ka beddelayo) ee tixraaca hadda * @return {Array} safka magacyada cabbirka caadiga ah; saf madhan haddii aan la aqoon */ this.getDefaultParams = function() { if(this.type) { return defaultParams[this.type]; } else { return ["url", "title", "author", "date", "publisher"]; // Ma go'aamin karo xaddidyo gaar ah markaad wax ka beddeleyso Citation hore u jirtay. } }; }, /** * Dhisaha nooca RawReference. * @class RawReference * @for proveit * @constructor * @extends AbstractReference * @param {Object} argObj shayga doodda, oo leh furayaasha ikhtiyaar kasta */ RawReference: function(argObj) { proveit.AbstractReference.call(this, argObj); this.type = 'raw'; /** * Wuxuu soo celinayaa tixraacatan sida xadhig ah. * @return {String} tixraaca sida xadhig */ this.toString = function() { return this.orig; }; this.params['title'] = this.orig; this.getIcon = function() { return 'https://upload.wikimedia.org/wikipedia/commons/d/db/Silk-Page_white_code_red.png'; }; this.getTypeForDisplay = function() { return proveit.getDescriptions()['raw']; }; }, // TODO: Tani waa in lagu mideeyaa changeRefFromEditPane /** * Beddel waxyaabaha ku jira guddi-hoosaadka lagu daro oraahda ee hadda oo ka dhig tixraac (tusaale CiteReference(), CitationReference()) * @for proveit * @param {Node} box nooca xididka GUI ee lagu daro (muraayadda nooca gaarka ah, tusaale joornaalka) * @return {AbstractReference} ref ama null haddii aysan muraayad jirin weli. */ getReferenceFromAddPane: function(box) { var $box = $(box); var type = $box.data('proveitRefType'); // hel magaca <ref> var refName = $('#addrefname').val(); var citeFunc = this.togglestyle ? this.CiteReference : this.CitationReference; var ref = new citeFunc({"name": refName, "type": type}); var paramName, paramVal; var paramList = $(".paramlist", box)[0]; var paramRows = $('div', paramList); for (var i = 0; i < paramRows.length; i++) { var paramRow = paramRows[i]; var valueTextbox = $(".paramvalue", paramRow)[0]; if($(paramRow).hasClass("addedrow")) // Lagu daray "Ku dar goob kale" { paramName = $.trim($(".paramdesc", paramRow)[0].value); } else { paramName = valueTextbox.id.substring(this.NEW_PARAM_PREFIX.length); } paramVal = $.trim(valueTextbox.value); if(paramName != "" && paramVal != "") { // Aan madhanayn ref.params[paramName] = paramVal; } } ref.update(); return ref; }, /** * Waxaa laga wacaa guddiga lagu daro oraahda, tani waa shaqada loo isticmaalo * in lagu daro oraahda dhabta ah. * * @param {AbstractReference} ref tixraaca la darayay */ addReference: function(ref) { // ka dhig mid shaqeeya, qoraal badan ayaa halkan ka jira. this.addNewElement(ref); ref.orig = ref.toString(); /* * Dhex mar sanduuqyada oo qabso aqoonsiyada marka loo eego qiimayaasha, ilaali * sanduuqa ugu dambeeya oo hubi inaad soo qabato nooca sidoo kale */ this.insertRefIntoMWEditBox(ref, true); // run waxay ka dhigan tahay geli qoraalka buuxa halkan, iyadoon loo eegin beddelka caalamiga ah. ref.save = true; ref.inMWEditBox = true; }, /** * Nadiifi dhammaan safafka guddiyada lagu daro tixraaca ee la soo gudbiyay. * @param {Node} citePanes curiyaha DOM ee ceyriinka ah */ clearCitePanes: function(citePanes) { if(citePanes.hasChildNodes()) { citePanes.removeChild(citePanes.firstChild); } }, /** * Ku dar hawlwadeenka dhacdada badhanka Tirtir Goobta (Delete Field) ee guddiyada Ku Dar/Wax ka Beddel Tixraaca * @param {Node} fieldRow curiyaha DOM ee fieldRow ee la tirtirayo */ activateRemoveField: function(fieldRow) { $('.delete-field', fieldRow).click(function() { $(fieldRow).hide( 'highlight',{},'slow', function() { $(fieldRow).remove(); } ); }); }, /** * Waxay beddeshaa muraayadda guddiga lagu daro tixraaca si ay u noqoto nooca saxda ah ee gelitaanka * @param {Node} menu Curiyaha menu-ga HTML ee ceyriinka ah */ changeAddPane: function(menu) { // Dib u deji scroll-ka $('#add-fields').scrollTop(0); $(menu.parentNode).show(); // cite/citation vbox. var citePanes = $(".addpanes", menu.parentNode.parentNode).get(0); this.clearCitePanes(citePanes); var newRefType = menu.value; var genPane = document.getElementById("dummyCitePane").cloneNode(true); var $genPane = $(genPane).attr('id', ''); $genPane.data('proveitRefType', newRefType); // magacaabi ref-name-row $('.ref-name-row', $genPane).children('input').attr('id','addrefname'); $('.ref-name-row', $genPane).children('label').attr('for','addrefname'); // Wax yar oo hab-qabsi ah. Waa maxay habka ugu fiican? var newRef; if(menu.id == "citemenu") { newRef = new this.CiteReference({}); } else { newRef = new this.CitationReference({}); } newRef.type = newRefType; var descs = this.getDescriptions(); var defaultParams = newRef.getDefaultParams().slice(0); // nuqul defaultParams.sort(newRef.getSorter()); //var required = newRef.getRequiredParams(); // Suurtagal, shayada Cite waa inay si toos ah ugu daraan cabbirada caadiga ah khariidadaha cabbirkooda. Taasi waxay u ekaan kartaa mid tan ka fudud. for(var i = 0; i < defaultParams.length; i++) { newRef.params[defaultParams[i]] = ""; } // Miyay jiri kartaa getParamKeys ama shaqo la mid ah tan, ama xitaa getSortedParamKeys? var newParams = []; for(param in newRef.params) { newParams.push(param); } newParams.sort(newRef.getSorter()); var required = newRef.getRequiredParams(); var paramList = $(".paramlist", $genPane)[0]; for(var i = 0; i < newParams.length; i++) { var param = newParams[i]; var paramBox; if(descs[param]) { paramBox = document.getElementById("preloadedparamrow").cloneNode(true); var label = $('.paramdesc', paramBox); if(required[param]) { label.addClass("required"); $('.delete-field', paramBox).remove(); // ha u oggolaan dadka inay ka saaraan goobaha loo baahan yahay } else { this.activateRemoveField(paramBox); } label.text(descs[param]); // Asal ahaan waa koodh la mid ah nameHbox ee kor ku xusan label.attr("for", this.NEW_PARAM_PREFIX + param); if(param == 'accessdate') $('.paramvalue', paramBox).val(this.dateFormatter.format(new Date)); } else { // Tuurista qaladka halkan macno ma samaynayso haddii goobaha uu isticmaalahu ku daray la koobi karo. // throw new Error("Sharaxaad aan la qeexin ee cabbirka: " + param); paramBox = document.getElementById("addedparamrow").cloneNode(true); var nameTextbox = $(".paramdesc", paramBox)[0]; nameTextbox.setAttribute("value", param); } paramBox.id = ""; this.activateRemoveField(paramBox); $(".paramvalue", paramBox)[0].id = this.NEW_PARAM_PREFIX + param; //paramBox.childNodes[2].value = newRef.params[param]; // Waxay keentaa in cabbiradu dintaan. Maxay tahay sababtu? paramList.appendChild(paramBox); } $(citePanes).prepend($genPane); }, /** * Abuur oo soo celi curiye qarsoon oo haya curiyeyaasha shabakadda (template elements) * (curiyeyaasha meel-qabashada ee dambe la nuqul iyo oo lagu buuxiyay xog dhab ah) * * @return {jQuery} $root Curiyaha xididka qarsoon ee haya shabakadaha */ createTemplateElement: function() { var $root = $('<div>', { id: 'proveit-templates' }); // Dummy cite pane var dummyCite = $('<div>', { id: 'dummyCitePane', "class": 'typepane' }); var $addRefNameRow = this.createReferenceNameRow(); //$('input', $addRefNameRow).attr('id', 'addrefname'); //$('label', $addRefNameRow).attr('for', 'addrefname'); dummyCite.append($addRefNameRow); dummyCite.append($('<div>', {"class": 'paramlist'})); $root.append(dummyCite); var preloadedparam = $('<div>', { id: 'preloadedparamrow', "class": 'preloadedrow input-row' }).append($('<label>', { "class": 'paramdesc' })); var paramvalue = $('<input>', { "class": 'paramvalue', tabindex: 0 }); preloadedparam.append(paramvalue); var deleteButton = $('<button>', { "class": 'delete-field', tabindex: -1 }).text('tirtir goobta'); deleteButton.button({ icons: { primary: 'ui-icon-close' }, text: false }); preloadedparam.append(deleteButton); $root.append(preloadedparam); var addedparam = $('<div>', { id: 'addedparamrow', "class": 'addedrow input-row'}). append($('<input>', { "class": 'paramdesc', tabindex: 0 })). append(paramvalue.clone()). append(deleteButton.clone()); $root.append(addedparam); return $root; }, /** * Waxay abuurtaa saf loo isticmaalo in lagu geliyo sifo magac ee ref (<ref name="..." />) * * @return {jQuery} <ref> safka magaca */ createReferenceNameRow: function() { // div.ref-name-row var $refNameRow = $('<div>', { "class": 'ref-name-row', tabindex: -1 }); var refLabel = $('<label>', { "for": 'editrefname', title: 'Kani waa aqoonsi gaar ah oo loo isticmaali karo in lagu tixraaco tixraacan meel kale oo ka mid ah bogga.', "class": 'paramdesc' }).text('magaca <ref>'); $refNameRow.append(refLabel); $refNameRow.append($('<input>', { id: 'editrefname', "class": 'paramvalue', tabindex: 0 })); return $refNameRow; }, /** * Abuur ProveIt HTML GUI */ createGUI: function() { if(this.getGUI().length > 0) { // GUI hore ayaa loo abuuray return false; } // CSS-ka JqueryUI badan: http://blog.jqueryui.com/2009/06/jquery-ui-172/ var gui = $('<div>', {id: this.GUI_ID}); var $tabs = $('<div>', {id: 'proveit-tabs'}); var created = $('<h1>'); var createdLink = $('<a>').attr({title: 'Waxaa abuuray Shaybaarka ELC ee ku yaal Georgia Tech', href: 'http://proveit.cc.gatech.edu', target: '_blank'}); // Astaanta ugu weyn ee kor-midig var logo = $('<img>' ).attr( {src: 'https://upload.wikimedia.org/wikipedia/commons/0/0d/ProveIt_user_interface_logo.png', alt: 'ProveIt', height: 30, width: 118 } ); createdLink.append(logo); created.append(createdLink); // Badhanka yaraynta/weynaynta (Minimize/maximize) var showHideButton = $('<button>', { id: 'proveit-show-hide-toggle' } ).text('tus/qari'); created.append(showHideButton); $tabs.append(created); var header = $('<ul>'); var view = $('<li>'); // Xiriiriyaha tabka Aragtida (View) var viewTab = $('<a/>', {id: 'proveit-view-tab', "class": 'tab-link', href: '#proveit-view-edit-panel'}).text('Tixraacyada ('); var numRefs = $('<span>').attr({id: 'numRefs'}).text('0'); viewTab.append(numRefs, ')'); view.append(viewTab); header.append(view); var add = $('<li>'); // Xiriiriyaha tabka Ku Darista (Add) var addTab = $('<a>').attr({id: 'proveit-add-tab', "class": 'tab-link', href: '#proveit-add-panel'}).text('Ku dar Tixraac'); add.append(addTab); header.append(add); $tabs.append(header); // Muraayadda Aragtida iyo Wax-ka-beddelka var viewEditPanel = $('<div>', {id: 'proveit-view-edit-panel'}); // Muraayadda aragtida ee loo isticmaalo soo bandhigidda tixraacyada; dhexda tabka aragtida var viewPane = $('<div>', {id: 'view-pane'}); var viewScroll = $('<div>', {"class": 'scroll', style: 'height: 210px;'}); // Curiyaha xididka ee liiska tixraaca var refTable = $('<table>', {id: 'refs'}); var dummyRef = $('<tr>', {id: 'dummyRef', style: 'display: none;'}); dummyRef.append($('<td>', {"class": 'number'})). append($('<td>', {"class": 'type'})). append($('<td>', {"class": 'title'})); //append($('<td>', {"class": 'details'})); var editTd = $('<td>', {"class": 'edit'}). append($('<button>', {text: 'wax ka beddel'})); dummyRef.append(editTd); refTable.append(dummyRef); viewScroll.append(refTable); viewPane.append(viewScroll); viewEditPanel.append(viewPane); // div#edit-pane, dhexda tabka aragtida var editPane = $('<div>', {id: 'edit-pane', style: 'display: none'}); // div#edit-fields var editFields = $('<div>', {id: 'edit-fields', "class": 'inputs scroll', style: 'height: 170px', tabindex: -1}); var refNameRow = this.createReferenceNameRow(); // div.paramlist var paramList = $('<div/>', {"class": 'paramlist'}); editFields.append(refNameRow); editFields.append(paramList); editPane.append(editFields); // div#edit-buttons, qayb ka mid ah muraayadda wax-ka-beddelka var editButtons = $('<div/>', {id: 'edit-buttons'}); var addFieldButton = $('<button/>', {style: 'margin-right: 50px;'}). append('ku dar goob'); editButtons.append(addFieldButton); var reqSpan = $('<span/>', {"class": 'required', text: 'geesinimo (bold)'}); editButtons.append(reqSpan). append(' = goobta loo baahan yahay'); var saveButton = $('<button/>', {"class": 'right-side accept', text: 'cusboonaysii foomka wax-ka-beddelka'}); editButtons.append(saveButton); var cancelButton = $('<button/>', {"class": 'right-side cancel', text: 'jooji'}); editButtons.append(cancelButton); editPane.append(editButtons); viewEditPanel.append(editPane); $tabs.append(viewEditPanel); // Muraayadda Ku Darista var addPanel = $('<div/>', {id: 'proveit-add-panel'}); var addFields = $('<div/>', {id: 'add-fields', "class": 'inputs scroll', style: 'height: 170px', tabindex: -1}); var cite = $('<div/>', {style: 'display: none', id: 'cite', "class": 'input-row'}); var refCiteTypeLabel = $('<label/>', {'for': 'citemenu', "class": 'paramdesc required', text: 'Nooca tixraaca'}); cite.append(refCiteTypeLabel); var citemenu = $('<select/>', {id: 'citemenu', change: function() { proveit.changeAddPane(citemenu.get(0)); }}); var citeTypes = this.CiteReference.getTypes(); var descs = this.getDescriptions(); for(var i = 0; i < citeTypes.length; i++) { citemenu.append($('<option/>', {value: citeTypes[i], text: descs[citeTypes[i]]})); } cite.append(citemenu); addFields.append(cite); addFields.append($('<div/>', {"class": 'addpanes', id: 'citepanes', tabindex: -1})); var citation = $('<div/>', {style: 'display: none', id: 'citation', "class": 'input-row'}); var refCitationTypeLabel = refCiteTypeLabel.clone().attr('for', 'citationmenu'); citation.append(refCitationTypeLabel); var citationmenu = $('<select/>', {id: 'citemenu', change: function() { proveit.changeAddPane(citationmenu.get(0)); }}); var citationTypes = ['web', 'book', 'journal', 'encyclopedia', 'news', 'patent']; for(var j = 0; j < citationTypes.length; j++) { citationmenu.append($('<option/>', {value: citationTypes[i], text: descs[citationTypes[i]]})); } citation.append(citationmenu); addFields.append(citation). append($('<div/>', {"class": 'addpanes', id: 'citationpanes', style: 'display: none;'})); addPanel.append(addFields); // Badhannada ku darista, qayb ka mid ah tabka ku darista var addButtons = $('<div/>', {id: 'add-buttons'}); addButtons.append($('<button/>', {style: 'margin-right: 50px;', text: 'ku dar goob'})). append(reqSpan.clone()). append(" = loo baahan yahay"). append(saveButton.clone().text('geliyo sanduuqa wax-ka-beddelka')). append(cancelButton.clone()); addPanel.append(addButtons); $tabs.append(addPanel); gui.append($tabs); $(document.body).prepend(gui); var cancelEdit = function() { $("#edit-pane").hide(); $("#view-pane").show(); }; // deji tab-yada $tabs.tabs({ collapsible: true, active: false, // Bilowgii dhammaantood way laabnaayeen beforeActivate: function(event, ui) { // TODO: Dooro shayga hadda la daray ee ku jira liiska tixraaca, marka loo guurayo tabka ku darista loona guurayo tabka aragtida // Maba dhacdo dhacdadan gujin tab ah? var isClickOnTab = event.currentTarget && $(event.currentTarget).is('.tab-link'); // Ku guurista ku darista (oo ay ku jirto weynaynta) if(ui.newPanel.is(addPanel)) { cancelEdit(); proveit.changeAddPane(document.getElementById(proveit.togglestyle ? 'citemenu' : 'citationmenu')); } if(ui.newPanel.length === 0) { if(isClickOnTab) { // Ha oggolaan in la laabo adigoo gujinaya tab. event.preventDefault(); // Gujiyay tabka aragtida markii aragtida ama wax-ka-beddelku ay muuqdeen if(ui.oldPanel.is(viewEditPanel)) { // Jooji wax-ka-beddelka oo tusi liiska tixraaca cancelEdit(); } } else { // Waxay gujiyeen badhanka tus/qari; ha laabo oo cusboonaysii astaanta. showHideButton.button("option", "icons", { primary: 'ui-icon-triangle-1-n' } ); } } else { // Waxaa jira muraayad cusub oo muuqata; cusboonaysii astaanta. showHideButton.button("option", "icons", { primary: 'ui-icon-triangle-1-s' } ); } } }); // ku dar badhannada guddiga $("#add-buttons button:first").button({ icons: { primary: 'ui-icon-circle-plus' } }).click(function() { proveit.addPaneRow(document.getElementById("proveit-add-panel")); }) .next().next().button({ icons: { primary: 'ui-icon-circle-check', secondary: 'ui-icon-circle-arrow-e' } }).click(function() { proveit.addReference(proveit.getReferenceFromAddPane($('#proveit-add-panel .typepane').get(0))); $tabs.tabs( { active: 0 } ); // Dhaqaaji muraayadda aragtida $("div.scroll, #view-pane").scrollTop(100000); // u wareeji tixraaca cusub }).next(). button({ icons: { primary: 'ui-icon-circle-close' } }).click(function() { $tabs.tabs( { active: 0 } ); // Dhaqaaji muraayadda aragtida }); // jooji badhannada $("button.cancel").click(cancelEdit); // badhannada guddiga wax-ka-beddelka $("#edit-buttons button:first").button({ icons: { primary: 'ui-icon-circle-plus' } }).click(function() { proveit.addPaneRow($("#edit-pane")); }). next().next(). button({ icons: { primary: 'ui-icon-circle-check' } }).next().button({ icons: { primary: 'ui-icon-circle-close' } }); // abuur badhanka yaraynta showHideButton.button({ icons: { primary: 'ui-icon-triangle-1-n' }, text: false }); var viewAndAdd = $(viewEditPanel).add(addPanel); this.viewAndAddPanes = viewAndAdd; var prevActiveTabPaneIndex = 0; function minimize() { prevActiveTabPaneIndex = $tabs.tabs('option', 'active'); // Laabo dhammaan tab-yada $tabs.tabs('option', 'active', false); } function maximize() { $tabs.tabs('option', 'active', prevActiveTabPaneIndex); } this.toggleViewAddVisibility = function() { // Dhammaan tab-yada waa la laabay if($tabs.tabs('option', 'active') === false) { maximize(); } else { minimize(); } }; showHideButton.click(this.toggleViewAddVisibility); this.scanForReferences(); $("#refs tr").eq(0).click().click(); // dooro shayga koowaad ee liiska. TODO: Maxaa laba .click ah? // beddel midabada safka $("#refs tr:even").addClass('light'); $("#refs tr:odd").addClass('dark'); gui.append(this.createTemplateElement()); }, /** * Tixraaca ururinta ka kooban labada shay, aragtida iyo tab-yada ku darista. Waxaa bilaabi doona createGUI, markaa waa mid aan eber ahayn haddii ProveIt uu muuqdo * * @type {$NodeSet} */ viewAndAddPanes: null, /* * Wuxuu helayaa habaynta jQuery ee ProveIt GUI, taas oo noqon doonta mid madhan haddii ProveIt ausan bilaaban * * @return {$Node} xididka ProveIt */ getGUI: function() { return $('#' + this.GUI_ID); }, /** * Qari ProveIt gabi ahaanba */ hide: function() { this.getGUI().hide(); }, /** * Tusi ProveIt */ show: function() { this.createGUI(); this.getGUI().show(); }, /** * Beddel muuqaalka guud. Haddii hadda la qariyo, u tag yaraynta. Haddii la yareeyay, weyneeyo. Haddii la weyneeyo, qari */ toggleVisibility: function() { if(this.getGUI().is(':visible')) { if(this.viewAndAddPanes.is(':visible')) // la weyneeyay { this.hide(); } /* * Haddii hore loo weyneeyay, waxaan yareyneynaa ka dib marka aan qarinno, markaa marka aan tusno, waxay noqon doontaa mid horay loo yareeyay. * Haddii la yareeyay, waanu weynaynaynaa */ this.toggleViewAddVisibility(); } else { this.show(); } }, /** * Beddel muuqaalka muraayadaha aragtida iyo ku darista. Waxaa bilaabay createGUI * * @method toggleViewAddVisibility */ toggleViewAddVisibility: null, /** * Waxay abuurtaa safka refbox iyo dhammaan carruurta, si ay u isticmaasho addNewElement, iyo marka la cusboonaysiinayo * * @param {AbstractReference} ref tixraaca laga soo saarayo * @param {Boolean} isReplacement haddii ay run tahay, tani waxay beddeshaa shay kale oo refbox ah, markaa lambar lama qoondeyn doono, tirada ayaana la cusboonaysiin doono. * @return {Node} safka refbox cusub ee refbox */ makeReferenceBoxRow: function(ref, isReplacement) { var refName = ref.name; //waxaa laga yaabaa inay noqoto null ama madhan //var refbox = this.getReferenceBox(); var newchild = $('<tr><td class="number"></td><td class="type"></td><td class="title"></td><td class="edit"></td></tr>').get(0); // la saaray <span class="pointers"></span> // la saaray <td class="details"></td> if(!ref.isValid()) { // Calaamadi sida aan sax ahayn. $(newchild).addClass('invalid'); } // qabso curiyeyaasha u baahan in laga beddelo var neweditimage = $('.edit button', newchild).get(0); var thisproveit = this; var title = ''; var shortTitle = ''; if(ref.params['title'] != null) { title = ref.params['title']; shortTitle = this.truncateTitle(title); } $('td.title', newchild).text(shortTitle); $('td.title', newchild).attr('title', title); // wax ka qabashada kala duwanaanshaha xogta taariikhda var formattedYear = ''; if(ref.params['year']) formattedYear = ref.params['year']; else if (ref.params['date']) { var yearMatch = ref.params['date'].match(/^([12]\d{3})/); if(yearMatch) { formattedYear = yearMatch[1]; } } //$('td.year', newchild).text(formattedYear); // wax ka qabashada kala duwanaanshaha xogta qoraha var formattedAuthor = ''; if(ref.params['author']) formattedAuthor = ref.params['author']; else if (ref.params['last']) { // if(ref.params['first']) // formattedAuthor = ref.params['last'] + ', ' + ref.params['first']; // else formattedAuthor = ref.params['last']; } if(ref.params['coauthors'] || ref.params['last2']) formattedAuthor += ' <i>et al.</i>'; // dhis unugga "faahfaahinta" iyadoo lagu saleynayo joogitaanka xogta qoraha/sanadka // var details = ''; // if (formattedYear != '' && formattedAuthor != '') // details = '(' + formattedAuthor + ', ' + formattedYear + ')'; // else if (formattedYear != '') // details = '(' + formattedYear + ')'; // else if (formattedAuthor != '') // details = '(' + formattedAuthor + ')'; // $('td.details', newchild).html(details); // soo saar URL iyadoo lagu saleynayo nooca tixraaca var icon = ref.getIcon(), url = '', refType = ref.type; switch(refType) { case 'web': url = ref.params['url']; break; case 'book': if(ref.params['isbn'] != null) url = mw.util.getUrl( 'Special:BookSources', { isbn: ref.params['isbn'] } ); break; case 'journal': case 'conference': if(ref.params['doi'] != null) url = 'http://dx.doi.org/' + ref.params['doi']; break; case 'news': url = ref.params['url']; break; case 'episode': url = 'http://www.imdb.com/find?s=ep&q=' + escape(ref.params['title']); break; } $('td.type', newchild).css('background-image','url('+icon+')'); var authorByline = '', yearByline = '', refTypeByline = ''; if(formattedAuthor != '') authorByline = 'Qoraa: <span class="author">' + formattedAuthor + '</span>'; if(formattedYear != '') yearByline = 'Taariikh: <span class="date">' + formattedYear + '</span>'; if(refType != null) { var displayType = ref.getTypeForDisplay(), formattedRefType = displayType; $('td.type', newchild).attr('title', displayType); if(url != '') formattedRefType = '<a href="' + url + '" target="_blank">' + formattedRefType + '</a>'; refTypeByline = 'Nooca: <span class="type">' + formattedRefType + '</span>'; } //alert("authorByline: " + authorByline + "\n yearByline: " + yearByline + "\n refTypeByline: " + refTypeByline); var byline = '', separator = ' | '; if(refType == 'raw') { byline = refTypeByline + separator + mw.html.escape(ref.toString()); } else if(authorByline != '') // a?? { if(yearByline != '') // ad? { if(refTypeByline != '') // adt byline = authorByline + separator + yearByline + separator + refTypeByline; else // ad- byline = authorByline + separator + yearByline; } else // a-? { if(refTypeByline != '') // a-t byline = authorByline + separator + refTypeByline; else // a-- byline = authorByline; } } else // -?? { if(yearByline != '') // -d? { if(refTypeByline != '') // -dt byline = yearByline + separator + refTypeByline; else // -d- byline = yearByline; } else // --? { if(refTypeByline != '') // --t byline = refTypeByline; // looma baahna --- } } byline = '<p>' + byline + '</p>'; //alert(byline); // abuur <div> la ballaaray var expanded = $('<div />',{ "class": 'expanded' }); // ku dar infobar sanduuqa macluumaadka la ballaariyay $(expanded).append(byline); // ku dar sanduuqa macluumaadka la ballaariyay ciwaanka <td> $('td.title', newchild).append(expanded); if(!isReplacement) { // hel lambarka tixraaca adoo tirinaya tirada tixraacyada (tani waxaa ku jira dummy ref, laakiin ma aha kan aan abuureyno) var numRefs = $('#refs tr').length; $('td.number', newchild).text(numRefs); $('#numRefs').text(numRefs); // cusboonaysii tirada tixraacyada ee tabka aragtida } // hawlwadeenka dhacdada ee doorashada tixraaca) $(newchild).click(function() { thisproveit.highlightTargetString(ref.orig); //thisproveit.highlightTargetString(ref.orig); $("#refs tr").removeClass('selected'); $(newchild).addClass('selected'); }); var doEdit = function() { thisproveit.updateEditPane(ref); $("#view-pane").hide(); $("#edit-pane").show(); }; var citationStrings = ref.getCitationStrings(); //var pointers = $('.pointers', newchild); var allCitations = $('<span class="all-citations" />'); for(var i = 0; i < citationStrings.length; i++) { var dividend = i + 1; var colName = ""; while(dividend > 0) { var mod = --dividend % 26; colName = String.fromCharCode(97 + mod) + colName; // a = 97 dividend = Math.floor(dividend / 26); } var citationHolder = $('<a href="#">' + colName + '</a>'); // Xidh (Bind) i var clickFunc = (function(i) { return function() { var last = 0, j = 0; var text = proveit.getTextboxText(); for(j = 0; j < i; j++) { last = text.indexOf(citationStrings[j], last); // Ma aha in la dhaco. Waxay tilmaamaysaa in xadhigyada oraahdu ay dhaceen waqtigoodii (out of date). if(last == -1) { proveit.log("citationStrings[" + j + "]: " + citationStrings[j] + " la ma helin. Soo celinayaa."); return false; } last += citationStrings[j].length; } var startInd = text.indexOf(citationStrings[i], last); if(startInd == -1) { proveit.log("citationStrings[" + i + "]: " + citationStrings[i] + " la ma helin."); } else { proveit.highlightLengthAtIndex(startInd, citationStrings[i].length); } return false; }; })(i); citationHolder.click(clickFunc); allCitations.append(citationHolder); } if(citationStrings.length > 1) { var newP = $('<p />'); newP.append('Tixraacan waxaa lagu xusay maqaalka <span class="num-citations">' + citationStrings.length + ' jeer</span>: ').append(allCitations); expanded.append(newP); } // badhannada wax-ka-beddelka if(ref.type != 'raw') { // BADHANKA WAX-KA-BEDDELKA YAR // abuur badhan var smallEditBtn = $('<button />',{ text: 'wax ka beddel' }); // beddel badhanka $(smallEditBtn).button({ icons: { primary: 'ui-icon-pencil' }, text: false }); // hawlwadeenka dhacdada gujinta badhanka smallEditBtn.click(doEdit); // ku dar badhanka $('.edit', newchild).append(smallEditBtn); // BADHANKA WAX-KA-BEDDELKA WEYN // abuur badhan var editBtn = $('<button />',{ "class": 'edit', text: 'wax ka beddel tixraacan' }); // beddel badhanka $(editBtn).button({ icons: { primary: 'ui-icon-pencil' }, text: true }); // hawlwadeenka dhacdada gujinta badhanka editBtn.click(doEdit); // ku dar badhanka expanded.append(editBtn); // HAWLWADEENKA DHACDADA SAFKA $(newchild).dblclick(doEdit); } else { // waxaa looga baahan yahay in dhammaan safafka la ilaaliyo dherer isku mid ah $('.edit', newchild).append('&nbsp;'); } // badhanka ibid if(citationStrings.length > 0) { // abuur badhan var ibidBtn = $('<button />',{ "class": 'insert', text: 'geli tixraacan halka uu khaanad-tilmaameedku (cursor) joogo' }); // beddel badhanka $(ibidBtn).button({ icons: { primary: 'ui-icon-arrowthick-1-e' }, text: true }); // hawlwadeenka dhacdada gujinta badhanka ibidBtn.click(function(){ thisproveit.insertRefIntoMWEditBox(ref, false); return false; }); // ku dar badhanka expanded.append(ibidBtn); } return newchild; }, /** * Gaabisa ciwaanka si uu ugu habboonaado safka refbox ee ProveIt. * @param {String} title ciwaanka la gaabinayo * @return {String} ciwaanka la gaabiyay */ truncateTitle: function(title) { var MAX_LENGTH = 86; var truncated = title; if(title.length > MAX_LENGTH) { truncated = truncated.substring(0, MAX_LENGTH); var lastSpacePos = truncated.lastIndexOf(' '); if(lastSpacePos != -1) { truncated = truncated.substr(0, lastSpacePos); truncated += " ..."; } } return truncated; }, /** * Kaliya in loo isticmaalo gudaha si loogu daro oraahyada liiska * * @param {AbstractReference} ref tixraaca lagu darayo */ addNewElement: function(ref) { var refbox = this.getReferenceBox(); $(refbox).append(this.makeReferenceBoxRow(ref, false)); } }, window.proveit); /** * Habka static (Static method). Wuxuu soo celinayaa noocyada tixraaca Cite ee saxda ah * @for CiteReference * @static * @return {Array} safka noocyada habka cite */ proveit.CiteReference.getTypes = function() { return ["web", "book", "journal", "conference", "encyclopedia", "news", "newsgroup", "press release", "interview", "episode", "AV media"]; }; proveit.split._compliantExecNpcg = /()??/.exec("")[1] === undefined; // NPCG: nonparticipating capturing group proveit.split._nativeSplit = String.prototype.split; proveit.setup(); }( mediaWiki, jQuery ) ); // Local Variables: // js2-basic-offset: 8 // End: // </nowiki> 5nhq6y6eogg5eva7nr3r41u05mhzir7 MediaWiki:Gadget-refToolbarBase.js 8 53925 311643 311127 2026-11-02T19:47:52Z Maintenance script 11523 Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup) 311643 javascript text/javascript /* jshint asi: true */ /* global mw, $, CiteTB, citeTemplate, citeErrorCheck */ if (window.CiteTB === undefined) { window.CiteTB = { "Templates": {}, // Dhammaan tampleetyada "Options": {}, // Ikhtiyaarrada caalamiga ah "UserOptions": {}, // Ikhtiyaarrada isticmaalaha "DefaultOptions": {}, // Heerarka caadiga ah ee qoraalka "ErrorChecks": {} // Shaqooyinka hubinta khaladaadka }; } // Shayga tampleetyada xigashada (cite templates) window.citeTemplate = function (templatename, shortform, basicfields, expandedfields) { // Sifooyinka this.templatename = templatename; // Magaca tampleetka - "cite web", "cite book", iwm. this.shortform = shortform; // Nooc gaaban, oo loo isticmaalo sanduuqa hoos-u-dhaca (dropdown box) this.basic = basicfields; // Goobaha aasaasiga ah - qoraa, cinwaan, daabacaaye... // Kuwa aan sida badan loo isticmaalin - xigasho (quote), archiveurl - waa inay ahaadaan wax kasta oo tampleetku taageerayo marka laga reebo kuwa aasaasiga ah this.extra = expandedfields; this.incrementables = {}; // Ku dar liiska CiteTB.Templates[this.templatename] = this; // Hababka (Methods) this.makeFormInner = function (fields, incrsetup) { var i = 0; var trs = []; var autofills = [] for (i = 0; i < fields.length; i++) { var fieldobj = fields[i]; var field = labelfield = fieldobj.field; var ad = false; if (incrsetup && fieldobj.increment_group) { field = fieldobj.field.replace('<N>', '1'); labelfield = fieldobj.field.replace('<N>', ''); if (this.incrementables[fieldobj.increment_group] && !this.incrementables[fieldobj.increment_group].setup) { // Shayga waa la abuuray, laakiin si buuxda looma bilaabin this.incrementables[fieldobj.increment_group]['fields'].push(fieldobj) } else if (!this.incrementables[fieldobj.increment_group]) { // Shayga weli lama abuurin this.incrementables[fieldobj.increment_group] = { 'fields': [fieldobj], 'val': 1, 'setup': false }; } else if (this.incrementables[fieldobj.increment_group] && this.incrementables[fieldobj.increment_group].setup) { // Si buuxda loogu bilaabay wicitaankii hore ee shaqadan, oo kaliya dib loo dejinayo lambarka this.incrementables[fieldobj.increment_group].val = 1 } } else if (fieldobj.increment_group) { // Ku daridda saf cusub incrval = this.incrementables[fieldobj.increment_group].val; field = fieldobj.field.replace('<N>', incrval.toString()); labelfield = fieldobj.field.replace('<N>', ''); } if ($.inArray(field, CiteTB.getOption('autodate fields')) != -1) { im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/7/7b/Nuvola_apps_date.svg/20px-Nuvola_apps_date.svg.png'); im.attr('alt', mw.messages.get('cite-insert-date')).attr('title', mw.messages.get('cite-insert-date')); var ad = $('<a />').attr('href', '#'); ad.append(im); ad.attr('id', 'cite-date-' + CiteTB.escStr(this.shortform) + '-' + field); $(document).on('click', '#cite-date-' + CiteTB.escStr(this.shortform) + '-' + field, CiteTB.fillAccessdate); } if (fieldobj.autofillid) { var autotype = fieldobj.autofillid; im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/1/17/System-search.svg/20px-System-search.svg.png'); im.attr('alt', mw.messages.get('cite-autofill-alt')).attr('title', mw.messages.get('cite-autofill-alt')); var ad = $('<a />').attr('href', '#'); ad.append(im); ad.attr('id', 'cite-auto-' + CiteTB.escStr(this.shortform) + '-' + field + '-' + autotype); autofills.push('#cite-auto-' + CiteTB.escStr(this.shortform) + '-' + field + '-' + autotype); } if (fieldobj.increment_button) { var incrtype = fieldobj.increment_group; im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/b/b9/Nuvola_action_edit_add.svg/20px-Nuvola_action_edit_add.svg.png'); im.attr('alt', mw.messages.get('cite-increment-alt')).attr('title', mw.messages.get('cite-increment-alt')); var ad = $('<a />').attr('href', '#'); ad.append(im); ad.attr('id', 'cite-incr-' + CiteTB.escStr(this.shortform) + '-' + incrtype); } var display = mw.messages.get('cite-' + labelfield + '-label'); if (typeof display !== 'string') { if (fieldobj.label) { display = CiteTB.fixStr(fieldobj.label); } else { display = CiteTB.fixStr(labelfield) } } var tooltip = fieldobj.tooltip ? $('<abbr />').attr('title', mw.messages.get(fieldobj.tooltip)).html('<sup>?</sup>') : false; var input = ''; if (ad) { input = $('<input tabindex="1" style="width:85%" type="text" />'); } else { input = $('<input tabindex="1" style="width:100%" type="text" />'); } input.attr('id', 'cite-' + CiteTB.escStr(this.shortform) + '-' + field); if (fieldobj.autofillprop) { classname = 'cite-' + CiteTB.escStr(this.shortform) + '-' + fieldobj.autofillprop if (fieldobj.increment_group) { input.addClass('cite-' + CiteTB.escStr(this.shortform) + '-incr-' + fieldobj.increment_group); classname += '-' + this.incrementables[fieldobj.increment_group].val.toString(); } input.addClass(classname); } var label = $('<label />'); label.attr('for', 'cite-' + CiteTB.escStr(this.shortform) + '-' + field).text(display); if (tooltip) { label.append(tooltip); } var style = 'text-align:right; width:20%;'; if (i % 2 == 1) { style += ' padding-left:1em;'; } else { var tr = $('<tr />'); } var td1 = $('<td class="cite-form-td" />').attr('style', style); td1.append(label); tr.append(td1); var td2 = $('<td class="cite-form-td" style="width:30%" />'); td2.append(input); if (ad) { td2.append(ad); } tr.append(td2); if (i % 2 == 0) { trs.push(tr); } } var needsetup = false; for (g in this.incrementables) { if (!this.incrementables[g].setup) { needsetup = true; $(document).on('click', '#cite-incr-' + CiteTB.escStr(this.shortform) + '-' + g, CiteTB.incrementFields); this.incrementables[g].setup = true; } } if (needsetup || $.isEmptyObject(this.incrementables)) { for (i = 0; i < autofills.length; i++) { $(document).on('click', autofills[i], CiteTB.initAutofill); } } return trs; } // waxay bixisaa HTML yar si foomka furan loo aqoonsado this.getInitial = function () { var hidden = '<input type="hidden" class="cite-template" value="' + this.templatename + '"/>'; return hidden; } // waxay abuurootaa foomka lagu isticmaalo sanduuqyada wada-hadalka (dialog boxes) this.getForm = function () { var main = $("<div class='cite-form-container' />"); var form1 = $('<table style="width:100%; background-color:transparent;" class="cite-basic-fields" />'); var i = 0; var trs = this.makeFormInner(this.basic, true); for (var i = 0; i < trs.length; i++) { form1.append(trs[i]); } var form2 = $('<table style="width:100%; background-color:transparent; display:none" class="cite-extra-fields">'); trs = this.makeFormInner(this.extra, true); for (var i = 0; i < trs.length; i++) { form2.append(trs[i]); } main.append(form1).append(form2); var form3 = $('<table style="width:100%; background-color:transparent;padding-top:1em" class="cite-other-fields">'); var tr = $('<tr />'); var td1 = $('<td class="cite-form-td" style="text-align:right; width:20%" />'); var label1 = $('<label />'); label1.attr('for', "cite-" + CiteTB.escStr(this.shortform) + '-name').text(mw.messages.get('cite-name-label')); td1.append(label1); var td2 = $('<td class="cite-form-td" style="width:30%" />'); var input1 = $('<input tabindex="1" style="width:100%" type="text" />'); input1.attr('id', 'cite-' + CiteTB.escStr(this.shortform) + '-name'); td2.append(input1); var td3 = $('<td class="cite-form-td" style="text-align:right; padding-left:1em; width:20%">'); var label2 = $('<label />'); label2.attr('for', 'cite-' + CiteTB.escStr(this.shortform) + '-group').text(mw.messages.get('cite-group-label')); td3.append(label2); var td4 = $('<td class="cite-form-td" style="width:30%" />'); var input2 = $('<input tabindex="1" style="width:100%" type="text" />'); input2.attr('id', 'cite-' + CiteTB.escStr(this.shortform) + '-group'); td4.append(input2); tr.append(td1).append(td2).append(td3).append(td4); form3.append(tr); main.append(form3); var extras = $('<div />'); extras.append('<input type="hidden" class="cite-form-status" value="closed" />'); var hidden = $('<input type="hidden" class="cite-template" />'); hidden.val(this.templatename); extras.append(hidden); var span1 = $('<span class="cite-preview-label" style="display:none;" />'); span1.text(mw.messages.get('cite-raw-preview')); extras.append(span1).append('<div class="cite-ref-preview" style="padding:0.5em; font-size:110%" />'); var span2 = $('<span class="cite-prev-parsed-label" style="display:none;" />'); span2.text(mw.messages.get('cite-parsed-label')); extras.append(span2).append('<div class="cite-preview-parsed" style="padding-bottom:0.5em; font-size:110%" />'); var link = $('<a href="#" class="cite-prev-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'); link.text(mw.messages.get('cite-form-parse')); extras.append(link); main.append(extras); return main; } } /* Fasalka hubinta khaladaadka FIXME: DOKUMENTIYADA WAAYEL AH type - nooca hubinta khaladaadka - ikhtiyaarrada hadda: * 'refcheck' - ku dabool shaqo xigasho kasta si gaar ah * shaqadu waa inay aqbashaa shay xigasho ah, oo soo celisa xarig (string) * 'reflist' - ku dabool shaqo liiska xigashada oo dhan * shaqadu waa inay aqbashaa saf (array) oo ah shayada xigashada, oo soo celisa saf xiriiro ah * 'search' - ku dabool shaqo qoraalka bogga * shaqadu waa inay aqbashaa qoraalka bogga oo ah xarig, oo soo celisa saf xiriiro ah Xarigyada ay soo celiso shaqadu waa inay ahaadaan HTML sax ah func - Shaqada lagu sharaxay kor ku xusan testname - Magaca hubinta khaladaadka, waa inaysan ku jirin meelo bannaan (spaces) desc - Sharaxaad kooban oo ku saabsan tijaabada */ window.citeErrorCheck = function (obj) { this.obj = obj CiteTB.ErrorChecks[this.obj.testname] = this; this.run = function () { var errors = []; switch (this.obj['type']) { case "refcheck": CiteTB.loadRefs(); for (var i = 0; i < CiteTB.mainRefList.length; i++) { var e = this.obj.func(CiteTB.mainRefList[i]); if (e) { errors.push(e); } } break; case "reflist": CiteTB.loadRefs(); errors = this.obj.func(CiteTB.mainRefList); break; case "search": var func = this.obj.func CiteTB.getPageText(function (text) { errors = func(text); }); break; } return errors; } this.getRow = function () { var row = $("<li />"); var check = $("<input type='checkbox' name='cite-err-test' />"); check.attr('value', this.obj.testname); var label = $("<label />").html(mw.messages.get(this.obj.desc)); label.attr('for', this.obj.testname); row.append(check).append(' &ndash; ').append(label); return row; } } $('head').trigger('reftoolbarbase'); rdr65ydvy1hwlww2ku7pwhn2g3pqn1w MediaWiki:Group-sysop.js 8 54128 311645 2026-11-02T19:59:03Z Isma4l 41797 Bog cusub: // <nowiki> $(function () { // Ka bixid if ( window.disableSysopJS ) { return; } /** * Liiska hoos-u-dhaca tirtiridda tooska ah * * Wuxuu bogga ka raadiyaa tusmooyinka CSD/XFD/PROD; haddii midkood jiro, * wuxuu soo qaataa sababta tirtiridda ee ku qarsoon tusmada, wuxuuna * hagaajiyaa xiriiriyaha tab-ka 'tirtir' si sababtaas loogu sii geliyo * soo-koobidda tirtiridda. */ (function () { if (document.getElementById('delete-criterion')) { var deleteLink =... 311645 javascript text/javascript // <nowiki> $(function () { // Ka bixid if ( window.disableSysopJS ) { return; } /** * Liiska hoos-u-dhaca tirtiridda tooska ah * * Wuxuu bogga ka raadiyaa tusmooyinka CSD/XFD/PROD; haddii midkood jiro, * wuxuu soo qaataa sababta tirtiridda ee ku qarsoon tusmada, wuxuuna * hagaajiyaa xiriiriyaha tab-ka 'tirtir' si sababtaas loogu sii geliyo * soo-koobidda tirtiridda. */ (function () { if (document.getElementById('delete-criterion')) { var deleteLink = document.getElementById('ca-delete'); if (deleteLink) { deleteLink = deleteLink.getElementsByTagName('A')[0]; } else { // Muuqaalka moobilka var links = document.getElementsByClassName('menu__item--page-actions-overflow-delete'); if (links) { deleteLink = links[0]; } } var reason = document.getElementById('delete-reason').innerHTML; deleteLink.setAttribute('href' , deleteLink.getAttribute('href') + '&wpReason=' + reason); } })(); /** * Hubiyaha cinwaannada IP-ga xasaasiga ah * * Wuxuu maamulayaasha ogeysiiyaa marka ay dhici karto inay xannibaan * cinwaan IP oo xasaasi ah. Cinwaannada IP-ga waxaa loo aqoonsan karaa * kuwo xasaasi ah sababo siyaasadeed awgood, ama sababtoo ah waxay * saameeyaan bot-yada ama adeegyada kale ee farsamo ee Wikipedia * isticmaasho. Faahfaahin dheeraad ah ka eeg [[WP:SIP]]. * * Dadka ilaaliya: Mr. Stradivarius */ if (mw.config.get('wgCanonicalSpecialPageName') === 'Block' || mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') { // Soo rar ku-tiirsanayaasha. mw.loader.using([ 'ext.gadget.libSensitiveIPs', 'mediawiki.api', 'mediawiki.util', 'mediawiki.jqueryMsg', ]).then( function() { // Hubi in aan haysanno cinwaan IP ama xad CIDR oo sax ah, // haddii kale jooji. (Haddii doodda labaad ee isIPAddress // ay tahay true, xuduudaha CIDR-na waa la oggol yahay.) // Lama isticmaali karo wgRelevantUserName, sababtoo ah laguma qeexin xuduudaha IP-ga: [[phab:T206954]] if (mw.config.get('wgCanonicalSpecialPageName') === 'Block') { $ip = $('input[name=wpTarget]'); } else if (mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') { $ip = $('input[name=target]'); } if (!$ip.length || !mw.util.isIPAddress($ip.val(), true)) { return; } // Hubi in cinwaanka IP-ga ama xadku yahay mid xasaasi ah. mw.libs.sensitiveIPs.query({ test: [$ip.val()] }).then(function (data) { var match = data.sensitiveips.matches[0], description, $msg; if (!match) { // Cinwaanka IP-ga ama xadku ma aha mid xasaasi ah, sidaas darteed jooji. return; } // Cinwaanka IP-ga ama xadku waa mid xasaasi ah, sidaas darteed // isticmaalaha ogeysii. Marka hore hel sharraxaadda cidda // iska leh cinwaanka IP-ga ama xadka. description = data.sensitiveips.entities[match['entity-id']].description; if (!description) { throw new Error('No description found for entity with code "' + match['entity-id'] + '"'); } // Beddel farriinta iyadoo ku xiran bogga var action = mw.config.get('wgCanonicalSpecialPageName') === 'Block' ? 'xannibidda' : 'daawashada'; // Deji qoraalka farriinta. Sharraxaaddu waxay ku qoran tahay wikitext, // sidaas darteed farriinta oo dhan waxaan u dejinaynaa wikitext, // ka dibna HTML ayaan ugu beddelaynaa message.parse(). mw.messages.set({ 'sysop-sensitive-ip-block-warning': 'Waxaad ' + action + ' cinwaan IP oo xasaasi ah oo uu leeyahay ' + description + '. Fadlan hubi inaad isla markiiba ogeysiiso kooxda ' + '[[:meta:Wikimedia Foundation/Communications/External Communications|Xiriirka Dibadda ee Wikimedia Foundation]] ee press@' + 'wikimedia.org ' + 'haddii cinwaanka la xannibo.' }); // Diyaari farriinta lagu ogeysiinayo isticmaalaha. $msg = $('<table>').append( $('<tr>').append( $('<td>').css({'vertical-align':'center'}).append( $('<img>').attr({'src': '//thumb.wikimedia.org/wikipedia/commons/thumb/f/f7/Nuvola_apps_important.svg/60px-Nuvola_apps_important.svg.png'}).css({width: '48px'}) ) ).append( '<td>' + mw.message('sysop-sensitive-ip-block-warning').parse() + '</td>' ) ); // Dir ogeysiiska. mw.notify($msg, { autoHide: false, type: 'warn' }); }); }); } }); // </nowiki> 8urkxr6l0kv3hx2mz1q3jb6v6wcg57a 311647 311645 2026-11-02T20:08:18Z Isma4l 41797 311647 javascript text/javascript // <nowiki> $(function () { // Ka bixid if ( window.disableSysopJS ) { return; } /** * Liiska hoos-u-dhaca tirtiridda tooska ah * * Wuxuu bogga ka raadiyaa tusmooyinka CSD/XFD/PROD; haddii midkood jiro, * wuxuu soo qaataa sababta tirtiridda ee ku qarsoon tusmada, wuxuuna * hagaajiyaa xiriiriyaha tab-ka 'tirtir' si sababtaas loogu sii geliyo * soo-koobidda tirtiridda. */ (function () { if (document.getElementById('delete-criterion')) { var deleteLink = document.getElementById('ca-delete'); if (deleteLink) { deleteLink = deleteLink.getElementsByTagName('A')[0]; } else { // Muuqaalka moobilka var links = document.getElementsByClassName('menu__item--page-actions-overflow-delete'); if (links) { deleteLink = links[0]; } } var reason = document.getElementById('delete-reason').innerHTML; deleteLink.setAttribute('href' , deleteLink.getAttribute('href') + '&wpReason=' + reason); } })(); /** * Hubiyaha cinwaannada IP-ga xasaasiga ah * * Wuxuu maamulayaasha ogeysiiyaa marka ay dhici karto inay xannibaan * cinwaan IP oo xasaasi ah. Cinwaannada IP-ga waxaa loo aqoonsan karaa * kuwo xasaasi ah sababo siyaasadeed awgood, ama sababtoo ah waxay * saameeyaan bot-yada ama adeegyada kale ee farsamo ee Wikipedia * isticmaasho. Faahfaahin dheeraad ah ka eeg [[WP:SIP]]. * * Dadka ilaaliya: Mr. Stradivarius */ if (mw.config.get('wgCanonicalSpecialPageName') === 'Block' || mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') { // Soo rar ku-tiirsanayaasha. mw.loader.using([ 'ext.gadget.libSensitiveIPs', 'mediawiki.api', 'mediawiki.util', 'mediawiki.jqueryMsg', ]).then( function() { // Hubi in aan haysanno cinwaan IP ama xad CIDR oo sax ah, // haddii kale jooji. (Haddii doodda labaad ee isIPAddress // ay tahay true, xuduudaha CIDR-na waa la oggol yahay.) // Lama isticmaali karo wgRelevantUserName, sababtoo ah laguma qeexin xuduudaha IP-ga: [[phab:T206954]] if (mw.config.get('wgCanonicalSpecialPageName') === 'Block') { $ip = $('input[name=wpTarget]'); } else if (mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') { $ip = $('input[name=target]'); } if (!$ip.length || !mw.util.isIPAddress($ip.val(), true)) { return; } // Hubi in cinwaanka IP-ga ama xadku yahay mid xasaasi ah. mw.libs.sensitiveIPs.query({ test: [$ip.val()] }).then(function (data) { var match = data.sensitiveips.matches[0], description, $msg; if (!match) { // Cinwaanka IP-ga ama xadku ma aha mid xasaasi ah, sidaas darteed jooji. return; } // Cinwaanka IP-ga ama xadku waa mid xasaasi ah, sidaas darteed // isticmaalaha ogeysii. Marka hore hel sharraxaadda cidda // iska leh cinwaanka IP-ga ama xadka. description = data.sensitiveips.entities[match['entity-id']].description; if (!description) { throw new Error('Lama helin sharraxaad u dhiganta aqoonsiga "' + match['entity-id'] + '"'); } // Beddel farriinta iyadoo ku xiran bogga var action = mw.config.get('wgCanonicalSpecialPageName') === 'Block' ? 'xannibidda' : 'daawashada'; // Deji qoraalka farriinta. Sharraxaaddu waxay ku qoran tahay wikitext, // sidaas darteed farriinta oo dhan waxaan u dejinaynaa wikitext, // ka dibna HTML ayaan ugu beddelaynaa message.parse(). mw.messages.set({ 'sysop-sensitive-ip-block-warning': 'Waxaad ' + action + ' cinwaan IP oo xasaasi ah oo uu leeyahay ' + description + '. Fadlan hubi inaad isla markiiba ogeysiiso kooxda ' + '[[:meta:Wikimedia Foundation/Communications/External Communications|Xiriirka Dibadda ee Wikimedia Foundation]] ee press@' + 'wikimedia.org ' + 'haddii cinwaanka la xannibo.' }); // Diyaari farriinta lagu ogeysiinayo isticmaalaha. $msg = $('<table>').append( $('<tr>').append( $('<td>').css({'vertical-align':'center'}).append( $('<img>').attr({'src': '//thumb.wikimedia.org/wikipedia/commons/thumb/f/f7/Nuvola_apps_important.svg/60px-Nuvola_apps_important.svg.png'}).css({width: '48px'}) ) ).append( '<td>' + mw.message('sysop-sensitive-ip-block-warning').parse() + '</td>' ) ); // Dir ogeysiiska. mw.notify($msg, { autoHide: false, type: 'warn' }); }); }); } }); // </nowiki> 74t4obufokgqr9p2ixt1f9w19b2p8fe Template:Editnotices/Page/MediaWiki:Group-sysop.js 10 54129 311646 2026-11-02T20:00:10Z Isma4l 41797 /* */ 311646 wikitext text/x-wiki {{JSfile|admins only}} 2vmnltnuzd68xgvo1hh635rgpifqrhc MediaWiki:Group-user.js 8 54130 311648 2026-11-02T20:12:50Z Isma4l 41797 Abuuray 311648 javascript text/javascript /* JavaScript kasta oo halkan ku jira waxaa loo soo gelin doonaa isticmaalayaasha diiwaangashan oo keliya */ mw.loader.using( [ 'mediawiki.util' ] ).done( function () { /** * U wareeji User:Name/skin.js iyo skin.css bogagga muuqaalka hadda la isticmaalayo * (haddii aanu bogga 'skin' si dhab ah u jirin mooyee). * * Waxyaabaha uu ku tiirsan yahay: mediawiki.util * * @source https://www.mediawiki.org/wiki/Snippets/Redirect_skin.js * @revision 2016-04-13 */ if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) === 2 ) { var titleParts = mw.config.get( 'wgPageName' ).split( '/' ); // Hubi in ay jirto qayb ka hor iyo qayb ka dib calaamadda jiitin-dambe // Iyo in qaybta dambe ay tahay 'skin.js' ama 'skin.css' if ( titleParts.length === 2 ) { var userSkinPage = titleParts[0] + '/' + mw.config.get( 'skin' ); if ( titleParts[1] === 'skin.js' ) { window.location.href = mw.util.getUrl( userSkinPage + '.js' ); } else if ( titleParts[1] === 'skin.css' ) { window.location.href = mw.util.getUrl( userSkinPage + '.css' ); } } } /* Ficillada u gaarka ah bogga wax-ka-beddelka */ if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' ) { /** * Sax farriinta weydiinta soo-koobidda wax-ka-beddelka marka dib loo celinayo * * Waxay saxaysaa dhibaatada ka dhalata marka shaqada dib-u-celinta lagu daro * qalabka aan weydiin soo-koobidda wax-ka-beddelka, kaas oo ka cabanaya maqnaanshaha soo-koobidda wax-ka-beddelka * haddii soo-koobidda wax-ka-beddelka aan waxba laga beddelin. * Waxaa ku daray [[User:Deskana]], koodhkana waxaa qoray [[User:Tra]]. * Sidoo kale eeg [[phab:T10912]]. */ $( function () { if ( document.location.search.indexOf( 'undo=' ) !== -1 && document.getElementsByName( 'wpAutoSummary' )[ 0 ] ) { document.getElementsByName( 'wpAutoSummary' )[ 0 ].value = '1'; } } ); } }); 8u944n25buiwn6wjt2mz7ms0c31tuw4