From 7097d8792fbcc66cebffbd5574d0ce165964ed8a Mon Sep 17 00:00:00 2001 From: Yaco Date: Sat, 7 Sep 2019 03:15:23 -0300 Subject: Agrega scripts varios para modificar propiedades semanticas --- bin/wiki/ListarPaginas.php | 66 +++++++++++++++ bin/wiki/PropiedadActualizar.php | 119 ++++++++++++++++++++++++++++ bin/wiki/PropiedadObtener.php | 80 +++++++++++++++++++ bin/wiki/Scripts/CompletaDireccionPorGeo.sh | 35 ++++++++ 4 files changed, 300 insertions(+) create mode 100644 bin/wiki/ListarPaginas.php create mode 100644 bin/wiki/PropiedadActualizar.php create mode 100644 bin/wiki/PropiedadObtener.php create mode 100755 bin/wiki/Scripts/CompletaDireccionPorGeo.sh (limited to 'bin') diff --git a/bin/wiki/ListarPaginas.php b/bin/wiki/ListarPaginas.php new file mode 100644 index 00000000..1b231b89 --- /dev/null +++ b/bin/wiki/ListarPaginas.php @@ -0,0 +1,66 @@ +login( new \Mediawiki\Api\ApiUser( $REEVO_WIKI_API_USER, $REEVO_WIKI_API_PASS ) ); +$services = new \Mediawiki\Api\MediawikiFactory( $api ); + +// Obtengo el nombre del template como parámetro +if ($argv[1]) { + + $pageListGetter = $services->newPageListGetter(); + $tipo = explode(':',$argv[1]); + switch ($tipo[0]) { + case 'Plantilla'||'Template': + $examplePages = $pageListGetter->getPageListFromPageTransclusions( $argv[1] ); + break; + case 'Categoría'||'Category': + $examplePages = $pageListGetter->getPageListFromCategoryName( $argv[1] ); + break; + default: + echo "No reconozco el tipo de objeto que estas intentando listar (debe ser Categoría o Plantilla)\n\n"; + exit(); + break; + } + $array = accessProtected($examplePages,'pages'); + foreach ( $array as $exPage ) { + $pagename = $exPage->getTitle()->getText(); + echo "$pagename \n"; + } +} else { + echo "Hay que indicar una plantilla como parametro \n"; +} + +function accessProtected($obj, $prop) { + $reflection = new ReflectionClass($obj); + $property = $reflection->getProperty($prop); + $property->setAccessible(true); + return $property->getValue($obj); +} + + + + + +// print_r($examplePages); + +// $myArray = json_decode(json_encode($examplePages), true); +// print_r($examplePages->getPageList()); + + + + + + +?> diff --git a/bin/wiki/PropiedadActualizar.php b/bin/wiki/PropiedadActualizar.php new file mode 100644 index 00000000..7ed1e5cb --- /dev/null +++ b/bin/wiki/PropiedadActualizar.php @@ -0,0 +1,119 @@ +login( new \Mediawiki\Api\ApiUser( $REEVO_WIKI_API_USER, $REEVO_WIKI_API_PASS ) ); +$services = new \Mediawiki\Api\MediawikiFactory( $api ); + +$opciones = getopt('t:p:f:'); + +if ($opciones['t']) { + if ($opciones['p']) { + $title = $opciones['t']; + if (is_string($opciones['p'])) { + $prop[] = $opciones['p']; + } else { + $prop = $opciones['p']; + } + foreach ($prop as $key => $value) { + $p = explode('|', $value); + $propiedades[$p[0]] = $p[1]; + } + $result = ActualizarPropiedades($title, $propiedades, $opciones, $services); + echo "\nSe actualizó correctamente la página $result ($wgServer/$result)\n\n\n"; + } else { + echo "Es necesario que definas al menos una propiedad para agregar o modificar con -p='propiedad|valor'\n"; + } +} else { + echo "Es necesario que definas el nombe de la pagina a editar con -t='Pagina'\n"; +} + +// Obtengo el nombre de la página como parámetro + +function ActualizarPropiedades($title, $propiedades, $opciones, $services) { + + $page = $services->newPageGetter()->getFromTitle( $title ); + $pagecontent = $page->getRevisions()->getLatest(); + if (!$pagecontent) { + echo "\n**** ERROR: No existe una página con el nombre '$title'\n\n\n"; + exit(); + } else { + echo "\n**** PROCESANDO: '$title' ****\n"; + } + + $pagecontent = $page->getRevisions()->getLatest()->getContent()->getData(); + + $template = preg_grep('/^\{{(.*(? $value) { + $data = str_replace('|','',$value); + $data_limpia = explode('=', $data); + $propiedades_previas[$data_limpia[0]] = $data_limpia[1]; + } + + // Verifico que tengo que hacer + if ($opciones['f'] == 'true') { + echo "\nVoy a actulizar y/o agregar las siguientes propiedades: \n"; + $propiedades_actualizables = array_intersect_key($propiedades,$propiedades_previas); + print_r($propiedades_actualizables); + $propiedades_final = array_replace($propiedades_previas, $propiedades); + } else { + echo "\nNo se van a reemplazar los valores de propiedades existentes. Agrega '-f=true' para hacerlo. Propiedadedes existentes con sus valores actuales: \n"; + $propiedades_actualizables = array_intersect_key($propiedades, $propiedades_previas); + print_r($propiedades_actualizables); + + echo "\nPropiedades antes no definidas que voy a agregar: \n"; + $propiedades_nuevas = array_diff_key($propiedades,$propiedades_previas); + print_r($propiedades_nuevas); + $propiedades_final = array_replace($propiedades_previas, $propiedades_nuevas); + } + + // Construyo un array con el formato del template original + $propiedades_final_array[] = $template[$template_pos]; + foreach ($propiedades_final as $key => $value) { + $propiedades_final_array[] = '|'.$key.'='.$value; + } + $propiedades_final_array[] = $templatefin[$templatefin_pos]; + + // Hago un array con el contenido de toda la pagina y reemplazo el template viejo por el nuevo + $contenido_array = explode("\n", $pagecontent); + $templatefin_pos = $templatefin_pos + 1; + array_splice($contenido_array, $template_pos, $templatefin_pos,$propiedades_final_array); + + $contenido_final = implode("\n", $contenido_array); + + $newContent = new \Mediawiki\DataModel\Content( $contenido_final ); + $pagetitle = new \Mediawiki\DataModel\Title( $title ); + $identifier = new \Mediawiki\DataModel\PageIdentifier( $pagetitle ); + $revision = new \Mediawiki\DataModel\Revision( $newContent, $identifier ); + $services->newRevisionSaver()->save( $revision ); + + return $title; + +} + +function accessProtected($obj, $prop) { + $reflection = new ReflectionClass($obj); + $property = $reflection->getProperty($prop); + $property->setAccessible(true); + return $property->getValue($obj); +} + +?> diff --git a/bin/wiki/PropiedadObtener.php b/bin/wiki/PropiedadObtener.php new file mode 100644 index 00000000..05bb157b --- /dev/null +++ b/bin/wiki/PropiedadObtener.php @@ -0,0 +1,80 @@ +login( new \Mediawiki\Api\ApiUser( $REEVO_WIKI_API_USER, $REEVO_WIKI_API_PASS ) ); +$services = new \Mediawiki\Api\MediawikiFactory( $api ); + +$opciones = getopt('t:p:f:'); + +if ($opciones['t']) { + if ($opciones['p']) { + $title = $opciones['t']; + if (is_string($opciones['p'])) { + $prop[] = $opciones['p']; + } else { + $prop = $opciones['p']; + } + foreach ($prop as $key => $value) { + // $p = explode('|', $value); + $propiedades[$value] = ''; + } + $result = ObtenerPropiedades($title, $propiedades, $opciones, $services); + } else { + echo "Es necesario que definas al menos una propiedad para obtener con -p='propiedad|valor'\n"; + } +} else { + echo "Es necesario que definas el nombe de la pagina a revisar con -t='Pagina'\n"; +} + +// Obtengo el nombre de la página como parámetro + +function ObtenerPropiedades($title, $propiedades, $opciones, $services) { + + $page = $services->newPageGetter()->getFromTitle( $title ); + $pagecontent = $page->getRevisions()->getLatest(); + if (!$pagecontent) { + echo "\n**** ERROR: No existe una página con el nombre '$title'\n\n\n"; + exit(); + } else { + // echo "\n**** PROCESANDO: '$title' ****\n"; + } + + $pagecontent = $page->getRevisions()->getLatest()->getContent()->getData(); + + // armo un array con las propiedades de SMW + $extracto = preg_grep('/^\|/', explode("\n", $pagecontent)); + foreach ($extracto as $key => $value) { + $data = str_replace('|','',$value); + $data_limpia = explode('=', $data); + $propiedades_previas[$data_limpia[0]] = $data_limpia[1]; + } + + foreach ($propiedades as $key => $value) { + if (array_key_exists($key, $propiedades_previas)) { + echo "$propiedades_previas[$key]\n"; + } + } + +} + +function accessProtected($obj, $prop) { + $reflection = new ReflectionClass($obj); + $property = $reflection->getProperty($prop); + $property->setAccessible(true); + return $property->getValue($obj); +} + +?> diff --git a/bin/wiki/Scripts/CompletaDireccionPorGeo.sh b/bin/wiki/Scripts/CompletaDireccionPorGeo.sh new file mode 100755 index 00000000..c77e83f3 --- /dev/null +++ b/bin/wiki/Scripts/CompletaDireccionPorGeo.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Este script lo usamos para actualizar los datos de ubicacion de experiencia a partir del campo que tiene la geolocalizacion... algo asi como "reverse geocoding". Usamos OSM nominatim: https://nominatim.org/release-docs/develop/api/Search/ +# +# Se puede usar como: for i in `php ../ListarPaginas.php Plantilla:Experiencia`; do ./CompletaDireccionPorGeo.sh "$i"; done + +EXP="$1" + +curl -s "https://nominatim.openstreetmap.org/search.php?format=json&addressdetails=1&q=`php ../PropiedadObtener.php -t="$EXP" -p="experiencia:lugar" | sed 's/, /%2C+/g'`" > /tmp/json + +CALLE_ORIG=`php ../PropiedadObtener.php -t="$EXP" -p="experiencia:lugar-calle"` + +cat /tmp/json | jq . + +CALLE=`cat /tmp/json | jq '.[] | .address.road' && cat /tmp/json | jq '.[] | .address.house_number' && echo ", " && cat /tmp/json | jq '.[] | .address.neighbourhood' && echo ", " && cat /tmp/json | jq '.[] | .address.suburb'` +CIUDAD=`cat /tmp/json | jq '.[] | .address.city' && cat /tmp/json | jq '.[] | .address.town' && echo ", " && cat /tmp/json | jq '.[] | .address.state_district'` +PROVINCIA=`cat /tmp/json | jq '.[] | .address.state'` +PAIS=`cat /tmp/json | jq '.[] | .address.country_code'` + +# Correcciones finales de formato + +if [ -z "$CALLE_ORIG" ] +then + CALLE=`echo $CALLE | sed 's/"//g' | sed 's/ ,/,/g' | sed 's/null//g' | sed 's/ , //g' ` + # No hay calle +else + CALLE=`echo $CALLE | sed 's/"//g' | sed 's/ ,/,/g' | sed 's/null//g' | sed 's/ , //g' ` + CALLE="$CALLE_ORIG ($CALLE)" +fi + +CIUDAD=`echo $CIUDAD | sed 's/"//g' | sed 's/ ,/,/g' | sed 's/null//g' | sed 's/ , //g' ` +PROVINCIA=`echo $PROVINCIA | sed 's/"//g' | sed 's/ ,/,/g' | sed 's/null//g' | sed 's/ , //g' ` +PAIS=`echo ${PAIS^^} | sed 's/"//g' | sed 's/null//g'` + +php ../PropiedadActualizar.php -t="$EXP" -f="true" -p="experiencia:lugar-calle|$CALLE" -p="experiencia:lugar-ciudad|$CIUDAD" -p="experiencia:lugar-provincia|$PROVINCIA" -p="experiencia:lugar-pais|$PAIS" -- cgit v1.2.1