stringtranslate.com

Módulo:Wikidata

-- vim: set noexpandtab ft=lua ts=4 sw=4: require ( 'strict' ) local p = {} local debug = false ------------------------------------------------------------------------------ -- módulo variables locales y funciones local wiki = { langcode = mw . language . getContentLanguage (). code } -- internacionalización local i18n = { [ "errors" ] = { [ "property-not-found" ] = "Propiedad no encontrada." , [ "entity-not-found" ] = "Entidad Wikidata no encontrada." , [ "unknown-claim-type" ] = "Tipo de reclamo desconocido." , [ "unknown-entity-type" ] = "Tipo de entidad desconocido." , [ "qualifier-not-found" ] = "Calificador no encontrado." , [ "site-not-found" ] = "Proyecto Wikimedia no encontrado." , [ "unknown-datetime-format" ] = "Formato de fecha y hora desconocido." , [ "local-article-not-found" ] = "El artículo aún no está disponible en esta wiki." }, [ "datetime" ] = { -- $1 es un marcador de posición para el número real [ 0 ] = "$1 billón de años" , -- precision: mil millones de años [ 1 ] = "$100 millones de años" , -- precision: cien millones de años [ 2 ] = "$10 millones de años" , -- precision: diez millones de años [ 3 ] = "$1 millón de años" , -- precision: millones de años [ 4 ] = "$100,000 años" , -- precision: cien mil años [ 5 ] = "$10,000 años" , -- precision:diez mil años [ 6 ] = "$1 milenio" , -- precisión: milenio                                            [ 7 ]  =  "$1 siglo" , -- precisión: siglo [ 8 ] = "$1s" , -- precisión: década -- lo siguiente usa el formato de la función del analizador #time [ 9 ] = "Y" , -- precisión: año, [ 10 ] = "F Y" , -- precisión: mes [ 11 ] = "F j, Y" , -- precisión: día [ ​​12 ] = "F j, Y ga" , -- precisión: hora [ 13 ] = "F j, Y g:ia" , -- precisión: minuto [ 14 ] = "F j, Y g:i:sa" , -- precisión: segundo [ "beforenow" ] = "$1 BCE" , -- cómo formatear números negativos para precisiones de 0 a 5 [ "afternow" ] = "$1 CE" , -- cómo formatear números positivos para precisiones de 0 a 5 [ "bc" ] = '$1 "BCE"' , -- cómo imprimir años negativos [ "ad" ] = "$1" , -- cómo imprimir años positivos -- los siguientes son para las funciones getDateValue() y getQualifierDateValue() [ "default-format" ] = "dmy" , -- valor predeterminado del argumento #3 (getDateValue) o -- #4 (getQualifierDateValue) [ "default-addon" ] = "BC" , -- valor predeterminado del argumento #4 (getDateValue) o -- #5 (getQualifierDateValue) [ "prefix-addon" ] = false , -- establecido en verdadero para idiomas ponga "BC" delante de la -- cadena de fecha y hora; o el complemento tendrá sufijo [ "addon-sep" ] = " " , -- separador entre la cadena de fecha y hora y el complemento (o inverso) [ "format" ] = -- opciones del tercer argumento { [ "mdy" ] = "F j, Y" ,[ "mi" ] = "F Y" , [ "y" ] = "Y" , [                                      "dmy" ]  =  "j F Y" , [ "ymd" ] = "Ymd" , [ "ym" ] = "Ym" } }, [ "monolingualtext" ] = '<span lang="%language">%text</span>' , [ "warnDump" ] = "[[Categoría:Función llamada 'Dump' desde el módulo Wikidata]]" , [ "ordinal" ] = { [ 1 ] = "st" , [ 2 ] = "nd" , [ 3 ] = "rd" , [ "default" ] = "th" } } if wiki . langcode ~= "en" then --require("Module:i18n").loadI18n("Module:Wikidata/i18n", i18n) -- obtuve la idea de [[:w:Module:Wd]] local module_title ; if ... == nil then module_title = mw . getCurrentFrame (): getTitle () else module_title = ... end require ( 'Module:i18n' ). loadI18n ( module_title .. '/i18n' , i18n ) end -- esta función necesita ser internacionalizada junto con las anteriores: -- toma el número cardinal como un numérico y devuelve el ordinal como una cadena -- necesitamos tres excepciones en inglés para 1º, 2º, 3º, 21º, .. 31º, etc. local function makeOrdinal ( cardinal ) local ordsuffix = i18n . ordinal . predeterminado si cardinal % 10 == 1 entonces ordsuffix = i18n . ordinal [ 1 ] de lo contrario si cardinal % 10 == 2 entonces ordsuffix = i18n .ordinal [ 2 ] de lo contrario si cardinal % 10 == 3 entonces sufijo_ordinal =                                                              i18n . ordinal [ 3 ] fin -- En inglés, 1, 21, 31, etc. usan 'st', pero 11, 111, etc. usan 'th' -- de manera similar para 12 y 13, etc. si ( cardinal % 100 == 11 ) o ( cardinal % 100 == 12 ) o ( cardinal % 100 == 13 ) entonces ordsuffix = i18n . ordinal . predeterminado fin retorno tostring ( cardinal ) .. ordsuffix fin función local printError ( código ) retorno '<span class="error">' .. ( i18n . errors [ código ] o código ) .. '</span>' fin función local parseDateFormat ( f , timestamp , addon , prefix_addon , addon_sep ) sufijo_año local tstr local = "" objeto_idioma local = mw . idioma . nuevo ( wiki . código_idioma ) partes_f locales = mw . texto . split ( f , 'Y' , true ) para idx , f_part en pares ( f_parts ) hacer year_suffix = '' si string.match ( f_part , "x[mijkot]$" ) entonces -- para año no gregoriano f_part = f_part .. 'Y' de lo contrario si idx < # f_parts entonces -- suprimir ceros iniciales en el año year_suffix = lang_obj : formatDate ( 'Y' , timestamp ) year_suffix = string.gsub ( year_suffix                                                                          ,  '^0+' ,  '' ,  1 ) fin tstr = tstr .. lang_obj : formatDate ( f_part , timestamp ) .. year_suffix fin si addon ~= "" y prefix_addon entonces devuelve addon .. addon_sep .. tstr de lo contrario si addon ~= "" entonces devuelve tstr .. addon_sep .. addon de lo contrario devuelve tstr fin fin función local parseDateValue ( timestamp , date_format , date_addon ) prefix_addon local = i18n [ "datetime" ][ "prefix-addon" ] addon_sep local = i18n [ "datetime" ][ "addon-sep" ] addon local = "" -- comprobar fecha negativa si string.sub ( timestamp , 1 , 1 ) == '-' entonces timestamp = '+' .. string.sub ( timestamp , 2 ) addon = date_addon end local _date_format = i18n [ "datetime" ][ "format" ][ date_format ] if _date_format ~= nil then return parseDateFormat ( _date_format , timestamp , addon , prefix_addon , addon_sep ) else return printError ( "unknown-datetime-format" ) end end -- Esta función local combina el manejo de año/mes/día/AC/AEC de parseDateValue{} -- con el manejo de milenio/siglo/década de formatDate() función local parseDateFull ( timestamp , precision ,formato_de_fecha ,                                                                        date_addon ) local prefix_addon = i18n [ "datetime" ][ "prefix-addon" ] local addon_sep = i18n [ " datetime" ][ "addon-sep" ] local addon = "" -- comprobar fecha negativa if string.sub ( timestamp , 1 , 1 ) == '-' then timestamp = '+' .. string.sub ( timestamp , 2 ) addon = date_addon end -- obtener los siguientes cuatro caracteres después del + (ahora debería ser el año en todos los casos) -- ok, esto es sucio, pero hagámoslo funcionar primero local intyear = tonumber ( string.sub ( timestamp , 2 , 5 )) if intyear == 0 and precision <= 9 then return "" end -- la precisión es de 10000 años o más if precision <= 5 then local factor = 10 ^ (( 5 - precision ) + 4 ) local y2 = math.ceil ( math.abs ( intyear ) / factor ) local relativo = mw.ustring.gsub ( i18n.datetime [ precisión ] , " $ 1 " , tostring ( y2 ) ) si addon ~ = " " entonces -- fecha negativa relativo = mw.ustring.gsub ( i18n.datetime.beforenow , " $ 1 " , relativo ) de lo contrario relativo = mw.ustring.gsub ( i18n.datetime.afternow                                                                     ,  "$1" ,  relativo ) fin devuelve relativo fin -- la precisión es décadas (8), siglos (7) y milenios (6) era local , tarjeta si precisión == 6 entonces tarjeta = math.floor (( intyear - 1 ) / 1000 ) + 1 era = mw . ustring . gsub ( i18n . datetime [ 6 ], "$1" , makeOrdinal ( tarjeta )) fin si precisión == 7 entonces tarjeta = math.floor (( intyear - 1 ) / 100 ) + 1 era = mw . ustring . gsub ( i18n . datetime [ 7 ], "$1" , makeOrdinal ( tarjeta )) fin si precisión == 8 entonces era = mw . ustring . gsub ( i18n.datetime [ 8 ] , " $ 1 " , tostring ( math.floor ( math.abs ( intyear ) / 10 ) * 10 ) ) fin si era entonces si addon ~ = " " entonces era = mw.ustring.gsub ( mw.ustring.gsub ( i18n.datetime.bc , ' " ' , " " ) , " $ 1 " , era ) de lo contrario era = mw.ustring.gsub ( mw.ustring.gsub ( i18n.datetime.ad                                                             ,  '"' ,  "" ),  "$1" ,  era ) end return era end local _date_format = i18n [ "datetime" ][ "format" ][ date_format ] if _date_format ~= nil then -- verifica que la precisión sea año y anula el date_format suministrado if precision == 9 then _date_format = i18n [ "datetime" ][ 9 ] end return parseDateFormat ( _date_format , timestamp , addon , prefix_addon , addon_sep ) else return printError ( "unknown-datetime-format" ) end end -- los campos "qualifiers" y "snaks" tienen un campo "qualifiers-order" y "snaks-order" respectivos -- usa estos como el segundo parámetro y esta función en lugar de la función "pairs" incorporada -- para iterar sobre todos los calificadores y snaks en el orden deseado. función local orderedpairs ( matriz , orden ) si no es orden entonces devuelve pairs ( matriz ) fin -- devuelve iterador función local i = 0 devuelve función () i = i + 1 si orden [ i ] entonces devuelve orden [ i ], matriz [ orden [ i ]] fin fin fin -- precisión: 0 - mil millones de años, 1 - cien millones de años, ..., 6 - milenios, 7 - siglo, 8 - década, 9 - año, 10 - mes, 11 - día, 12 - hora, 13 - minuto, 14 - segundo función local normalizeDate ( fecha ) fecha = mw.text.trim ( fecha , " + " ) -- extrae año local yearstr = mw.ustring .fósforo (                                                 fecha ,  "^ \ - ? % d +" ) año local = tonumber ( yearstr ) -- elimina los ceros iniciales del año return year .. mw.ustring.sub ( date , # yearsstr + 1 ) , año end función local formatDate ( date , precision , timezone ) precision = precision o 11 fecha local , año = normalizeDate ( date ) si año == 0 y precisión <= 9 entonces return "" end -- la precisión es 10000 años o más si precisión <= 5 entonces factor local = 10 ^ (( 5 - precisión ) + 4 ) y2 local = math.ceil ( math.abs ( year ) / factor ) relativo local = mw.ustring.gsub ( i18n.datetime [ precisión ] , " $ 1 " , tostring ( y2 ) ) si año < 0 entonces relativo = mw.ustring . gsub ( i18n . datetime . beforenow , "$1" , relative ) else relative = mw . ustring . gsub ( i18n . datetime . afternow , "$1" , relative ) end return relative end -- la precisión es décadas, siglos y milenios era local si precisión == 6 entonces era =                                                                             mw . ustring . gsub ( i18n . datetime [ 6 ],  "$1" ,  tostring ( math. floor (( math. abs ( año )  -  1 )  /  1000 )  +  1 ))  fin si precisión == 7 entonces era = mw . ustring . gsub ( i18n . datetime [ 7 ], "$1" , tostring ( math. floor (( math. abs ( año ) - 1 ) / 100 ) + 1 )) fin si precisión == 8 entonces era = mw . ustring . gsub ( i18n . datetime [ 8 ], "$1" , tostring ( math. floor ( math. abs ( año ) / 10 ) * 10 )) fin si era entonces si año < 0 entonces era = mw . ustring . gsub ( mw . ustring . gsub ( i18n . datetime . bc , '"' , "" ), "$1" , era ) de lo contrario si año > 0 entonces era = mw . ustring . gsub ( mw . ustring . gsub ( i18n . datetime . ad , '"' , "" ), "$1" , era ) fin devolver era fin -- la precisión es año si precisión == 9 entonces devolver año                                                             fin -- la precisión es menor que años si precisión > 9 entonces --[[ el siguiente código reemplaza el sufijo UTC con la zona horaria negada dada para convertir la hora global a la hora local dada timezone = tonumber(timezone) if timezone and timezone ~= 0 then timezone = -timezone timezone = string.format("%.2d%.2d", timezone / 60, timezone % 60) if timezone[1] ~= '-' then timezone = "+" .. timezone end date = mw.text.trim( date , "Z") .. " " .. timezone end ] ] -- local formatstr = i18n .datetime [ precisión ] if year == 0 then formatstr = mw .ustring .gsub ( formatstr , i18n .datetime [ 9 ] , " " ) elseif year < 0 then -- Mediawiki formatDate no admite años negativos date = mw . ustring . sub ( fecha , 2 ) formatstr = mw . ustring . gsub ( formatstr , i18n . datetime [ 9 ], mw . ustring . gsub ( i18n . datetime . bc , "$1" , i18n . datetime [ 9 ])) de lo contrario si año > 0 y i18n . datetime . ad ~= "$1" entonces formatstr = mw . ustring . gsub ( formatstr , i18n . datetime [ 9 ], mw . ustring . gsub ( i18n . datetime . ad , "$1" , i18n . datetime [ 9 ])) fin devolver mw . idioma                                            . new ( wiki . langcode ): formatDate ( formatstr ,  fecha ) end end local function printDatavalueEntity ( datos , parámetro ) -- campos de datos: tipo-entidad [string], id-numérico [int, id Wikidata] id local if datos [ "tipo-entidad" ] == "ítem" then id = "Q" .. datos [ "id-numérico" ] elseif datos [ "tipo-entidad" ] == "propiedad" then id = "P" .. datos [ "id-numérico" ] else return printError ( "tipo-entidad-desconocido" ) end if parámetro then if parámetro == "link" then local linkTarget = mw . wikibase . getSitelink ( id ) local linkName = mw . wikibase . getLabel ( id ) if linkTarget then -- si hay un artículo de Wikipedia local que enlaza a él usando la etiqueta o el título del artículo return "[[" .. linkTarget .. "|" .. ( linkName o linkTarget ) .. "]]" else -- si no hay ningún artículo de Wikipedia local muestra la etiqueta o el enlace al objeto Wikidata para permitir al usuario introducir una etiqueta adecuada if linkName then return linkName else return "[[:d:" .. id .. "|" .. id .. "]]" end end else return data [ parameter ] end else return mw . wikibase .getLabel ( id ) o id fin fin función local printDatavalueTime (                                                                       datos ,  parámetro ) -- campos de datos: hora [hora ISO 8601], zona horaria [int en minutos], antes [int], después [int], precisión [int], calendarmodel [URI de wikidata] -- precisión: 0 - mil millones de años, 1 - cien millones de años, ..., 6 - milenios, 7 - siglo, 8 - década, 9 - año, 10 - mes, 11 - día, 12 - hora, 13 - minuto, 14 - segundo -- calendarmodel: p. ej. http://www.wikidata.org/entity/Q1985727 para el calendario gregoriano proléptico o http://www.wikidata.org/wiki/Module:Wikidata/Q11184 para el calendario juliano ] si parámetro entonces si parámetro == " calendarmodel " entonces datos.calendarmodel = mw.ustring . match ( data.calendarmodel , " Q%d+" ) - extrae el id de la entidad del URI del modelo de calendario elseif parameter == " time " then data.time = normalizeDate ( data.time ) end return data [ parámetro ] else return formatDate ( data.time , data.precision , data.timezone ) end end local function printDatavalueMonolingualText ( data , parameter ) - campos de datos : language [ string ], text [ string] if parameter then return data [ parámetro ] else local result = mw.ustring.gsub ( mw.ustring.gsub ( i18n.monolingualtext , "%%language" , data [ " language " ] ), " %% text " , data [ " text " ] ) return result end end local function findClaims ( entity , property ) if not property or not entity or not entity                                                . claims  entonces  devuelve  fin si mw . ustring . match ( propiedad , "^P%d+$" ) entonces -- si la propiedad es dada por un id (P..) accede a la lista de reclamaciones por este id devuelve entidad . claims [ propiedad ] de lo contrario propiedad = mw . wikibase . resolvePropertyId ( propiedad ) si no propiedad entonces devuelve fin devuelve entidad . claims [ propiedad ] fin fin función local getSnakValue ( snak , parámetro ) si snak . snaktype == "valor" entonces -- llama al analizador snak respectivo si snak . datavalue . type == "string" entonces devuelve snak . datavalue . value de lo contrario si snak . datavalue . type == "globecoordinate" entonces devuelve printDatavalueCoordinate ( snak . datavalue . value , parámetro ) de lo contrario si snak . datavalue . escriba == "cantidad" y luego devuelva printDatavalueQuantity ( snak . datavalue . valor , parámetro ) elseif snak . valor de datos . escriba == "hora" y luego devuelva printDatavalueTime ( snak . datavalue . valor , parámetro ) elseif snak . valor de datos . escriba == "wikibase-entityid" y luego devuelva printDatavalueEntity ( snak . datavalue . valor , parámetro ) elseif snak                                                      . datavalue . type  ==  "monolingualtext"  then  return  printDatavalueMonolingualText ( snak . datavalue . value ,  parameter ) end end return mw . wikibase . renderSnak ( snak ) end local function getQualifierSnak ( claim , qualifierId ) -- un "snak" es la terminología de Wikidata para un par clave/valor tipificado -- un claim consiste en un snak principal que contiene la información principal de este claim, -- así como una lista de atributos snaks y una lista de referencias snaks if qualifierId then -- busca el atributo snak con el calificador dado como clave if claim . qualifiers then local qualifier = claim . calificadores [ qualifierId ] si calificador entonces devuelve calificador [ 1 ] fin fin devuelve nil , printError ( "calificador-no-encontrado" ) de lo contrario -- de lo contrario devuelve el snak principal devuelve claim . mainsnak fin fin función local getValueOfClaim ( claim , qualifierId , parámetro ) error local snak local snak , error = getQualifierSnak ( claim , qualifierId ) si snak entonces devuelve getSnakValue ( snak , parámetro ) de lo contrario devuelve nil , error fin fin función local getReferences ( frame , claim ) resultado local = "" -- recorre todas las referencias para ref en pares ( claim . references o {}) hacer refparts locales                                                -- recorre todas las partes de la referencia actual para snakkey, snakval en pares ordenados (claim.references[ref].snaks o {}, claim.references[ref ] [ " snaks - order " ] ) do if refparts then refparts = refparts .. " , " else refparts = " " end -- genera la etiqueta de la propiedad de la parte de referencia, por ejemplo, "importado desde" para P143 refparts = refparts .. tostring ( mw.wikibase.getLabel ( snakkey ) ) .. " : " -- genera todos los valores de esta parte de referencia, por ejemplo , "Wikipedia en alemán" y "Wikipedia en inglés" si el claim referenciado se importó desde ambos sitios para snakidx = 1 , # snakval do if snakidx > 1 then refparts = refparts .. ", " end refparts = refparts .. getSnakValue ( snakval [ snakidx ] ) fin fin si refparts entonces resultado = resultado..marco : extensionTag ( " ref " , refparts ) fin fin devolver resultado fin función local parseInput ( marco ) qid local = marco.args.qid si qid y ( # qid == 0 ) entonces qid = nil fin local propertyID = mw.text.trim ( marco.args [ 1 ] o " " ) parámetro_entrada local = mw.text.trim (                                                                              frame . args [ 2 ]  o  "" ) si input_parm ~= "FETCH_WIKIDATA" entonces devuelve false , input_parm , nil , nil fin entidad local = mw . wikibase . getEntity ( qid ) reclamos locales si entidad y entidad . reclamos entonces reclamos = entidad . reclamos [ propertyID ] si no reclamos entonces devuelve false , "" , nil , nil fin de lo contrario devuelve false , "" , nil , nil fin devuelve true , entidad , reclamos , propertyID fin función local isType ( reclamos , tipo ) devuelve reclamos [ 1 ] y reclamos [ 1 ]. mainsnak . snaktype == "valor" y reclamos [ 1 ]. mainsnak . datavalue . tipo == tipo fin función local obtenerValor ( entidad , reclamaciones , propertyID , delim , labelHook ) si labelHook == nulo entonces labelHook = función ( qnumber ) devuelve nulo ; fin fin si esTipo ( reclamaciones , "wikibase-entityid" ) entonces local salida = {} para k , v en pares ( reclamaciones ) hacer local qnumber = "Q" .. v . mainsnak                                                                            . datavalue . value [ "numeric-id" ] enlace de sitio local = mw . wikibase . getSitelink ( qnumber ) etiqueta local = labelHook ( qnumber ) o mw . wikibase . getLabel ( qnumber ) o qnumber si enlace de sitio entonces out [ # out + 1 ] = "[[" .. enlace de sitio .. "|" .. etiqueta .. "]]" de lo contrario out [ # out + 1 ] = "[[:d:" .. qnumber .. "|" .. etiqueta .. "]]<abbr title='" .. i18n [ "errores" ][ "artículo-local-no-encontrado" ] .. "'>[*]</abbr>" fin fin return table. concat ( out , delim ) de lo contrario -- solo devuelve los mejores valores return entity : formatPropertyValues ​​( propertyID ). valor fin fin ------------------------------------------------------------------------------ -- módulo funciones globales si depurar entonces función p . inspeccionarI18n ( marco ) local val = i18n para _ , clave en pares ( marco . argumentos ) hacer clave = mw . texto . trim ( clave ) val = val [ clave ] fin devolver val fin fin función p . descripciónIn ( marco ) local código de idioma = marco . argumentos [ 1 ] local id =                                                                  marco . args [ 2 ] - devuelve la descripción de una entidad Wikidata en el idioma dado o el idioma predeterminado de este sitio de Wikipedia devuelve mw . wikibase . getEntity ( id ): getDescription ( langcode o wiki . langcode ) función final p . labelIn ( marco ) código de idioma local = marco . args [ 1 ] identificación local = marco . args [ 2 ] - etiqueta de retorno de una entidad Wikidata en el idioma dado o el idioma predeterminado de este sitio de Wikipedia devuelve mw . wikibase . getEntity ( id ): getLabel ( langcode o wiki . langcode ) end : esto se usa para obtener un valor, o una lista de ellos separados por comas si existen varios valores p . getValue = función ( marco ) local delimdefault = "," - **internacionalizar más tarde** local delim = marco . argumentos . delimitador o "" delim = string.gsub ( delim , '"' , '' ) si # delim == 0 entonces delim = delimdefault fin local go , errorOrentity , claims , propertyID = parseInput ( frame ) si no go entonces devuelve errorOrentity fin return getValue ( errorOrentity , claims , propertyID , delim ) end -- Igual que el anterior, pero utiliza la propiedad de nombre corto para la etiqueta si está disponible. p . getValueShortName = function ( frame ) local                                                   go ,  errorOrentity ,  claims ,  propertyID  =  parseInput ( frame ) si no go entonces devuelve errorOrentity fin entidad local = errorOrentity -- si el valor está vinculado a una wiki se genera como un enlace si es posible función local labelHook ( qnumber ) etiqueta local claimEntity local = mw . wikibase . getEntity ( qnumber ) si claimEntity ~= nil entonces si claimEntity . claims . P1813 entonces para k2 , v2 en pares ( claimEntity . claims . P1813 ) hacer si v2 . mainsnak . datavalue . value . language == "en" entonces etiqueta = v2 . mainsnak . datavalue . value . text fin fin fin fin si etiqueta == nil o etiqueta == " " entonces devuelve nil fin devuelve etiqueta fin devuelve getValue ( errorOrentity , claims , propertyID , ", " , labelHook ); fin -- Esto se usa para obtener un valor, o una lista de ellos separados por comas si existen múltiples valores -- de una entrada arbitraria usando su QID. -- Uso: {{#invoke:Wikidata|getValueFromID|<ID>|<Propiedad>|FETCH_WIKIDATA}} -- Por ejemplo: {{#invoke:Wikidata|getValueFromID|Q151973|P26|FETCH_WIKIDATA}} - para obtener el valor de 'cónyuge' (P26) de 'Richard Burton' (Q151973) -- Úselo con moderación - esta es una *llamada costosa*. p . getValueFromID = function ( frame ) local itemID = mw . text . trim ( frame . args                                                     [ 1 ]  o  "" ) local propertyID = mw . text . trim ( frame . args [ 2 ] o "" ) local input_parm = mw . text . trim ( frame . args [ 3 ] o "" ) si input_parm == "FETCH_WIKIDATA" entonces local entity = mw . wikibase . getEntity ( itemID ) local claims si entity y entity . claims entonces claims = entity . claims [ propertyID ] fin si claims entonces return getValue ( entity , claims , propertyID , ", " ) de lo contrario return "" fin de lo contrario return input_parm fin fin función local getQualifier ( frame , outputHook ) local propertyID = mw . text . trim ( frame . args [ 1 ] o "" ) local qualifierID = mw . text . trim ( frame.args [ 2 ] o " " ) parámetro_de_entrada local = mw.text.trim ( frame.args [ 3 ] o " " ) si parámetro_de_entrada == " FETCH_WIKIDATA " entonces entidad local = mw.wikibase.getEntity ( ) si entidad.reclamos [ propiedadID ]                                                            ~=   nil entonces local out = { } para k , v en pares ( entidad.reclamos [ propiedadID ] ) hacer para k2 , v2 en pares ( v.calificadores [ calificadorID ] ) hacer si v2.snaktype == 'valor' entonces out [ #out + 1 ] = outputHook ( v2 ) ; fin fin fin devolver table.concat ( salida , ", " ), verdadero de lo contrario devolver " " , falso fin de lo contrario devolver input_parm , falso fin fin p.getQualifierValue = función ( marco ) función local outputValue ( valor ) local qnumber = " Q " .. valor.valordatos.valor [ " id - numérico " ] si ( mw.wikibase.getSitelink ( qnumber ) ) entonces devolver " [ [ " .. mw.wikibase . getSitelink ( qnumber ) .. "]]" else return "[[:d:" .. qnumber .. "|" .. qnumber .. "]]<abbr title='" .. i18n [ "errors" ][ "local-article-not-found" ] .. "'>[*]</abbr>" end end return ( getQualifier ( frame , outputValue )) end -- Esto se usa para obtener un valor como 'male' (para la propiedad p21) que no se vinculará y números sin los separadores de miles p .getRawValue = función ( marco ) local                                                             go ,  errorOrentity ,  claims ,  propertyID  =  parseInput ( frame ) if not go then return errorOrentity end local entity = errorOrentity local result = entity : formatPropertyValues ​​( propertyID , mw . wikibase . entity . claimRanks ). value -- if number type: elimina separadores de miles, límites y unidades if isType ( claims , "quantity" ) then result = mw . ustring . gsub ( result , "(%d),(%d)" , "%1%2" ) result = mw . ustring . gsub ( result , "(%d)±.*" , "%1" ) end return result end -- Esto se utiliza para obtener el nombre de la unidad para el valor numérico devuelto por getRawValue p . getUnits = function ( frame ) local go , errorOrentity , claims , propertyID = parseInput ( frame ) si no go entonces devuelve errorOrentity fin entidad local = errorOrentity resultado local = entidad : formatPropertyValues ​​( propertyID , mw . wikibase . entity . claimRanks ). value si isType ( claims , "quantity" ) entonces resultado = mw . ustring . sub ( resultado , mw . ustring . find ( resultado , " " ) + 1 , - 1 ) fin                                                  return  result end -- Esto se usa para obtener el QID de la unidad para usar con el valor numérico devuelto por getRawValue p . getUnitID = function ( frame ) local go , errorOrentity , claims = parseInput ( frame ) if not go then return errorOrentity end local entity = errorOrentity local result if isType ( claims , "quantity" ) then -- obtiene la URL de la entrada de la unidad en Wikidata: result = claims [ 1 ]. mainsnak . datavalue . value . unit -- y solo devuelve el último bit desde "Q" hasta el final (que es el QID): result = mw . ustring . sub ( result , mw . ustring . find ( result , "Q" ), - 1 ) end return result end p . getRawQualifierValue = function ( frame ) local function outputHook ( value ) if value . datavalue . valor [ "numeric-id" ] entonces devuelve mw . wikibase . getLabel ( "Q" .. valor . valordatos . valor [ "numeric-id" ]) de lo contrario devuelve valor . valordatos . valor fin fin local ret , gotData = getQualifier ( frame , outputHook ) si gotData entonces ret = string.upper ( string.sub ( ret , 1 , 1 )) .. string.sub (                                                 ret ,  2 ) fin devuelve ret fin - Esto se utiliza para obtener un valor de fecha para date_of_birth (P569), etc. que no se vinculará - Las fechas y horas se almacenan en formato ISO 8601 (más o menos). - En la actualidad, la función local formatDate(date, precision, timezone) no maneja la zona horaria - Por lo tanto, solo proporcionaré "Z" en la llamada a formatDate a continuación: p . getDateValue = function ( frame ) local date_format = mw . text . trim ( frame . args [ 3 ] o i18n [ "datetime" ][ "default-format" ]) local date_addon = mw . text . trim ( frame.args [ 4 ] o i18n [ "datetime" ][ "default-addon" ]) local go , errorOrentity , claims = parseInput ( frame ) si no go entonces devuelve errorOrentity fin local entidad = errorOrentity local out = { } para k , v en pares ( claims ) hacer si v.mainsnak.datavalue.type == 'time' entonces local timestamp = v.mainsnak.datavalue.value.time local dateprecision = v.mainsnak.datavalue.value.precision -- Un año se puede almacenar así: "+1872-00-00T00:00:00Z", -- que se procesa aquí como si fuera el día anterior a "+1872-01-01T00:00:00Z", -- y ese es el último día de 1871, por lo que el año está mal. -- Por lo tanto, arregle la marca de tiempo del mes 0, día 0 para que sea el 1 de enero: timestamp = timestamp : gsub ( "%-00%-00T" ,                                              "-01-01T" ) out [ # out + 1 ] = parseDateFull ( timestamp , dateprecision , date_format , date_addon ) end end return table.concat ( out , ", " ) end p . getQualifierDateValue = function ( frame ) local date_format = mw . text . trim ( frame . args [ 4 ] o i18n [ "datetime" ][ "default-format" ]) local date_addon = mw . text . trim ( frame . args [ 5 ] o i18n [ "datetime" ][ "default-addon" ]) local function outputHook ( value ) local timestamp = value . datavalue . value . tiempo retorno parseDateValue ( timestamp , date_format , date_addon ) fin retorno ( getQualifier ( frame , outputHook )) fin - Esto se utiliza para obtener todas las imágenes con una propiedad particular, por ejemplo imagen (P18), imagen de Gene Atlas (P692), etc. - Los parámetros son | propertyID | valor / FETCH_WIKIDATA / nulo | separador (predeterminado=espacio) | tamaño (predeterminado=sin marco) - Devolverá un marcado wiki estándar [[Archivo:Nombre de archivo | tamaño]] para cada imagen con un tamaño seleccionable y un separador (que puede ser html) -- p.ej. {{#invoke:Wikidata|getImages|P18|FETCH_WIKIDATA}} -- p.ej. {{#invoke:Wikidata|getImages|P18|FETCH_WIKIDATA|<br>|250px}} -- Si se elige una propiedad que no es del tipo "commonsMedia", devolverá texto vacío. p . getImages = function ( frame ) local sep = mw . text . trim ( frame . args                                    [ 3 ]  o  " " ) imgsize local = mw . text . trim ( frame . args [ 4 ] o "frameless" ) go local , errorOrentity , claims = parseInput ( frame ) si no go entonces devuelve errorOrentity fin entidad local = errorOrentity si ( claims [ 1 ] y claims [ 1 ]. mainsnak . datatype == "commonsMedia" ) entonces salida local = {} para k , v en pares ( claims ) hacer nombre_archivo local = v . mainsnak . datavalue . value salida [ # salida + 1 ] = "[[Archivo:" .. nombre_archivo .. "|" .. imgsize .. "]]" end return table.concat ( out , sep ) else return "" end end -- Esto se usa para obtener los valores TA98 (Terminologia Anatomica primera edición 1998) como 'A01.1.00.005' (propiedad P1323) -- que luego se vinculan a https://ifaa.unifr.ch/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/01.1.00.005%20Entity%20TA98%20EN.htm -- usa las llamadas más nuevas de mw.wikibase en lugar de usar directamente los snaks -- formatPropertyValues ​​devuelve una tabla con los valores P1323 concatenados con "," por lo que tenemos que dividirlos en una tabla para construir la cadena de retorno p . getTAValue = función ( marco ) local ent = mw . wikibase . getEntity () accesorios locales = ent : formatPropertyValues ​​( 'P1323' ) salida local = {}                                                            local  t  =  { } para k , v en pares ( props ) hacer si k == ' valor' entonces t = mw.texto . split ( v , ", " ) para k2 , v2 en pares ( t ) hacer out [ # out + 1 ] = "[https://ifaa.unifr.ch/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/" .. string.sub ( v2 , 2 ) .. "%20Entity%20TA98%20EN.htm " .. v2 .. "]" end end end local ret = table.concat ( out , "<br> " ) if # ret == 0 then ret = "TA no válida" end return ret end --[[ Esto se usa para devolver una leyenda de imagen de Wikidata la imagen es propiedad P18 la leyenda de imagen es propiedad P2096 Llamar como {{#invoke:Wikidata |getImageLegend | <PARAMETER> | lang=<código ISO-639> |id=<QID>}} Devuelve PARÁMETRO, a menos que sea igual a "FETCH_WIKIDATA", del QID del artículo (llamada costosa) Si se omite QID o está en blanco, se usa el artículo actual (no es una llamada costosa) Si se omite lang, usa el idioma wiki local; de lo contrario, usa el código de idioma ISO-639 proporcionado ISO-639: https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html#wp1252447 Los rangos son: 'preferido' > 'normal' Esto devuelve la etiqueta de la primera imagen con rango 'preferido' O la etiqueta de la primera imagen con rango 'normal' si se prefiere no devuelve nada Rangos: https://www.mediawiki.org/wiki/Module:Wikidata/Extension:Wikibase_Client/Lua ]] p . getImageLegend = function ( frame ) -- busca el parámetro nombrado id; si está en blanco, conviértalo en nulo id local = frame . args .id si id y ( # id == 0 ) entonces id = nulo fin                                                       -- busca el parámetro nombrado lang -- debe contener un código de idioma ISO-639 de dos caracteres -- si está en blanco, busca el idioma del wiki local local lang = frame . args . lang if ( not lang ) or ( # lang < 2 ) then lang = mw . language . getContentLanguage (). code end -- el primer parámetro sin nombre es el parámetro local, si se proporciona local input_parm = mw . text . trim ( frame . args [ 1 ] or "" ) if input_parm == "FETCH_WIKIDATA" then local ent = mw . wikibase . getEntity ( id ) local imgs if ent and ent . claims then imgs = ent . claims . P18 fin local imglbl si imgs entonces -- busca una imagen con rango ' preferido ' para k1 , v1 en pares ( imgs ) hacer si v1.rank == " preferido " y v1.calificadores y v1.calificadores . P2096 entonces local imglbls = v1.calificadores . P2096 para k2 , v2 en pares ( imglbls ) hacer si v2.datavalue.value.language == lang entonces imglbl = v2.datavalue.value.text break fin fin fin fin -- si no encontramos una , buscamos una imagen con rango ' normal ' si ( no                                                               immlbl )  entonces para k1 , v1 en pares ( imgs ) hacer si v1 . rank == "normal" y v1 . calificadores y v1 . calificadores . P2096 entonces local immlbls = v1 . calificadores . P2096 para k2 , v2 en pares ( imglbls ) hacer si v2 . datavalue . value . language == lang entonces immlbl = v2 . datavalue . value . salto de texto fin fin fin fin fin fin fin devolver imglbl else devolver input_parm fin fin -- Esto se utiliza para obtener los QID de todos los valores de una propiedad, como una lista separada por comas si existen múltiples valores -- Uso: {{#invoke:Wikidata |getPropertyIDs |<PropertyID> |FETCH_WIKIDATA}} -- Uso: {{#invoke:Wikidata |getPropertyIDs |<PropertyID> |<InputParameter> |qid=<QID>}} p . getPropertyIDs = function ( frame ) local go , errorOrentity , propclaims = parseInput ( frame ) si no go entonces devuelve errorOrentity fin local entity = errorOrentity -- si está vinculado a wiki value recopila el QID en una tabla if ( propclaims [ 1 ] y propclaims [ 1 ]. mainsnak . snaktype == "value" y propclaims [ 1 ]. mainsnak . datavalue . type == "wikibase-entityid" ) entonces local out = {} para k , v en pares ( propclaims ) hacer                                                             salida [ # salida  +  1 ]  =  "Q"  ..  v . serpiente principal . valor de datos . value [ "numeric-id" ] end return table.concat ( out , ", " ) else - no es un wikibase-entityid, por lo que devuelve vacío return "" end end - devuelve la identificación de la página (Q...) de la página actual o nada de la página no está conectado a la función Wikidata p . pageId ( marco ) devuelve mw . wikibase . getEntityIdForCurrentPage () función final p . reclamo ( marco ) propiedad local = marco . args [ 1 ] o "" id local = marco . args [ "id" ] calificadorId local = marco . args [ "calificador" ] parámetro local = marco . args [ "parámetro" ] lista local = marco . args [ "lista" ] referencias locales = marco . args [ "referencias" ] local showerrors = frame . args [ "showerrors" ] local predeterminado = frame . args [ "predeterminado" ] si predeterminado entonces showerrors = nil fin -- obtener la entidad wikidata entidad local = mw . wikibase . getEntity ( id ) si no es una entidad , entonces si muestra errores , entonces devuelve printError ( "entidad no encontrada" ), de lo contrario, devuelve predeterminado fin fin                                                    -- obtener la primera reclamación que satisface la propiedad dada local claims = findClaims ( entidad , propiedad ) si no claims o no claims [ 1 ] entonces si showerrors entonces devolver printError ( "propiedad-no-encontrada" ) de lo contrario devolver predeterminado fin fin -- obtener los índices de ordenamiento iniciales local sortindices = {} para idx en pares ( reclamos ) hacer sortindices [ # sortindices + 1 ] = idx fin -- ordenar por rango de reclamación local comparador = función ( a , b ) local rankmap = { obsoleto = 2 , normal = 1 , preferido = 0 } local ranka = rankmap [ reclamos [ a ]. rango o "normal" ] .. cadena.formato ( "%08d" , a ) local rankb = rankmap [ reclamos [ b ]. rango o "normal" ] .. string.format ( "%08d" , b ) return ranka < rankb end table.sort ( sortindices , comparator ) resultado local error local si lista entonces valor local -- itera sobre todos los elementos y devuelve su valor (si existe) resultado = {} para idx en pares ( claims ) hacer reclamo local = claims [ sortindices [ idx ]] valor , error = getValueOfClaim (                                                                                   reclamo ,  qualifierId ,  parámetro ) si no valor y showerrors entonces valor = error fin si valor y referencias entonces valor = valor .. getReferences ( marco , reclamo ) fin resultado [ # resultado + 1 ] = valor fin resultado = tabla.concat ( resultado , lista ) de lo contrario -- devuelve el primer elemento reclamo local = reclamos [ sortindices [ 1 ]] resultado , error = getValueOfClaim ( reclamo , qualifierId , parámetro ) si resultado y referencias entonces resultado = resultado .. getReferences ( marco , reclamo ) fin fin si resultado entonces devuelve resultado de lo contrario si showerrors entonces devuelve error de lo contrario devuelve predeterminado fin fin fin -- mira dentro de la entidad objeto función p.ViewSomething ( marco ) local f = ( marco.args [ 1 ] o marco.args.id ) y marco o marco : getParent ( ) local id = f.args . id si id y ( # id == 0 ) entonces id = nil fin datos locales = mw . wikibase . getEntity ( id ) si no datos entonces devuelve nil                                                                                       fin local i = 1 mientras es verdadero hacer local índice = f . args [ i ] si no índice entonces si tipo ( datos ) == "tabla" entonces devuelve mw . text . jsonEncode ( datos , mw . text . JSON_PRESERVE_KEYS + mw . text . JSON_PRETTY ) de lo contrario devuelve tostring ( datos ) fin fin datos = datos [ índice ] o datos [ tonumber ( índice )] si no datos entonces devuelve fin i = i + 1 fin fin -- obtener el enlace del sitio de una wiki dada -- obtener el enlace del sitio del elemento actual si no se proporciona qid función p . getSiteLink ( marco ) local qid = marco . args . qid si qid == "" entonces qid = nil fin local f = mw . text . trim ( marco . args [ 1 ] o "" ) entidad local = mw . wikibase . getEntity ( qid ) si no es entidad entonces retorna fin local link = entidad : getSitelink ( f ) si no es enlace entonces retorna fin retorna enlace fin función p.dump ( frame ) local f = ( frame.args [ 1 ] o                                                                      frame.args.id ) y frame o frame : getParent     ( ) local data = mw.wikibase.getEntity ( f.args.id ) si no data entonces devuelve i18n.warnDump end local i = 1 mientras que es verdadero do local index = f.args [ i ] si no index entonces devuelve " <pre> " ..mw.dumpObject ( data ) .. " </pre> " ..i18n.warnDump end data = data [ index ] o data [ tonumber ( index ) ] si no data entonces devuelve i18n.warnDump end i = i + 1 end end devuelve p