Utente:Alex brollo/xml2text.js
Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.
- Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
- Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
- Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
- Opera: premi Ctrl-F5.
/* This reads _djvu.xml posted into page code and converts it into plain text.
The script is called by postOCR tool, that automatize small edits of OCR; the signal for need to run testoXml()
is the text "<OBJECT"
When text page begins with the word "reorder" followed by "<OBJECT", the alternative reorder() script is run
before text conversion.
*/
function caricaXml(){
xmlData={};
xmlData.PageName=mw.config.get("wgPageName");
xmlData.xml=find_stringa(leggiBox(),"<OBJECT","</OBJECT>",1);
if (xmlData.xml===""){
var oggetto;
oggetto=JSON.parse($.ajax({
url:"/w/api.php?action=query&prop=revisions&titles="+mw.config.get("wgPageName")+"rvprop=content&rvlimit=1&rvdir=newer",
async: false}).responseText);
$.each(oggetto.query.pages, function(index,value) {xmlData.xml=splitPagina(value.revisions[0]["*"])[1];});
}
}
function xmlGo(tipo) {
var testo="";
var linee="";
var oggetto="";
inizializza();
// verifica e inizializza xmlData
// inizializza xml, ipotesi: può essere caricato come prima versione della pagina o essere la versione attuale
function inizializza () {
// caso di xmlData non definito
if (typeof(xmlData) === "undefined") {
xmlData={};
cercaXml();
/*xmlData.PageName=mw.config.get("wgPageName");
xmlData.xml=find_stringa(leggiBox(),"<OBJECT","</OBJECT>",1);
if (xmlData.xml===""){
oggetto=JSON.parse($.ajax({
url:"/w/api.php?action=query&prop=revisions&titles="+mw.config.get("wgPageName")+
"&rvprop=content&rvlimit=1&rvdir=newer&format=json",
async: false}).responseText);
$.each(oggetto.query.pages, function(index,value) {xmlData.xml=splitPagina(value.revisions[0]["*"])[1];});
} */
} else { // caso di xml definito
if (xmlData.PageName !== mw.config.get("wgPageName")) { // caso xml relativo a pagina diversa
cercaXml();
/*xmlData.PageName=mw.config.get("wgPageName");
xmlData.xml=find_stringa(leggiBox(),"<OBJECT","</OBJECT>",1);
if (xmlData.xml===""){
oggetto=JSON.parse($.ajax({
url:"/w/api.php?action=query&prop=revisions&titles="+mw.config.get("wgPageName")+
"&rvprop=content&rvlimit=1&rvdir=newer&format=json",
async: false}).responseText);
$.each(oggetto.query.pages, function(index,value) {xmlData.xml=splitPagina(value.revisions[0]["*"])[1];});
}*/
}
}
}
function cercaXml() {
xmlData.PageName=mw.config.get("wgPageName");
xmlData.xml=find_stringa(leggiBox(),"<OBJECT","</OBJECT>",1);
if (xmlData.xml===""){
oggetto=JSON.parse($.ajax({
url:"/w/api.php?action=query&prop=revisions&titles="+mw.config.get("wgPageName")+
"&rvprop=content&rvlimit=1&rvdir=newer&format=json",
async: false}).responseText);
$.each(oggetto.query.pages, function(index,value) {xmlData.xml=splitPagina(value.revisions[0]["*"])[1];});
}
}
// a questo punto xmlData esiste e xmlData.xml contiene "" o il testo xml corrente
if (xmlData.xml==="") {
console.log("Nessun xml disponibile");
return;
}
if (tipo===1) {
$(xmlData.xml).find("PARAGRAPH").each(function() {
$(this).find("LINE").each(function() {
linee="";
$(this).find("WORD").each(function() {
// a space is added after each word
linee+=$(this).text()+" ";
});
// final space of line is removed
testo+=$.trim(linee)+"\n";
});
testo+="\n";
});
scriviBox(testo);
}
if (tipo===2) {
linee="";
reorder(xmlData.xml).find("LINE").each(function() {
linee="";
$(this).find("WORD").each(function() {
// a space is added after each word
linee+=$(this).text()+" ";
});
// final space of line is removed
testo+=$.trim(linee)+"\n";
});
scriviBox("<poem>\n"+testo+"\n</poem>");
}
}
function testoXml() {
if (leggiBox().indexOf("<OBJECT")>-1) { // nella pagina c'è codice xml
if (typeof(xmlData)==="undefined" || xmlData.PageName!=mw.config.get("wgPageName")) {
caricaXml();
}
var testo="";
var parola="";
var linee="";
var teatro=false;
var xml=$(xmlData.xml);
// this to schift to reorder() routine
if (leggiBox().indexOf("reorder")===0) {
teatro=true;
//scriviBox(xml.replace("reorder",""));
xml.find("hiddentext").children().remove();
xml.find("hiddentext").append(reorder(xmlData.xml));
}
// only PARAGRAPH, LINE and WORD are presently used
xml.find("PARAGRAPH").each(function() {
$(this).find("LINE").each(function() {
linee="";
$(this).find("WORD").each(function() {
// a space is added after each word
linee+=$(this).text()+" ";
});
// final space of line is removed
testo+=$.trim(linee)+"\n";
});
testo+="\n";
});
if ( ! teatro) scriviBox(testo);
else scriviBox('<poem>\n'+testo+'\n</poem>');
} else {
if (typeof(xmlData)==="object" && xmlData.PageName!==mw.config.get("wgPageName")) delete xmlData;
}
}
/* deifenatore di parole singole */
function dehyphen(parola) {
parola=parola.replace(/[-¬]$/,"");
return parola;
}
// restituisce top, left, width, height di qualsiasi elemento calcolandolo sulle coordinate di WORD
function rect(elemento) {
var words=$("WORD",elemento);
if (elemento[0].nodeName==="WORD") words=elemento;
var rectRes=words.eq(0).attr("coords").split(",");
for (i=1; i<words.length; i+=1) {rectWord=words.eq(i).attr("coords").split(",");
rectRes[0]=Math.min(rectRes[0],rectWord[0]);
rectRes[1]=Math.max(rectRes[1],rectWord[1]);
rectRes[2]=Math.max(rectRes[2],rectWord[2]);
rectRes[3]=Math.min(rectRes[3],rectWord[3]);
}
return [rectRes[0]*1,rectRes[3]*1, rectRes[2]-rectRes[0],rectRes[1]-rectRes[3]];
}
/*
Sometimes FineReader wrongly parses text columns and regions while analyzing page layout,
and it almos always occurs into theater works where characters' names seem into a "left column".
reorder() destroys automatic page structure and rebuilds it as a list of simple lines into one
paragraph only. */
function reorder(textXml) {
// utility, reads coordinates and converts them into a list of integers
function coords(el) {
var c=el.attr("coords").split(",");
for (var i=0;i<c.length;i+=1) {c[i]=c[i]*1;}
return c;
}
// utility, returns true if vertical coordinates of two elements overly
function isInLine(a,b) {
if ((coords(a)[1]>=coords(b)[3] && coords(a)[1]<=coords(b)[1]) || (coords(a)[3]>=coords(b)[3] && coords(a)[3]<=coords(b)[1])) return true;
return false;
}
if (typeof(xmlData)==="undefined" || xmlData.PageName!=mw.config.get("wgPageName")) {
caricaXml();
}
if (textXml===undefined) textXml=xmlData.xml;
// all WORD elements are extracted
var words=$(textXml).find("word");
// word elements are sorted for baseline value
words.sort(function(a,b) {return $(a).attr("coords").split(",")[4]*1 - $(b).attr("coords").split(",")[4]*1;});
// new elements paragraph and lines are inizialized
var p=$("<paragraph>");
var linea=$("<line>");
var wo={};
linea.append(words.eq(0));
// word list is splitted into lines and appended to paragraph element
for (i=1;i<words.length;i+=1) {
if (isInLine(words.eq(i-1),words.eq(i)) || isInLine(words.eq(i),words.eq(i-1)) ) linea.append(words.eq(i));
else {
wo=linea.children().remove();
wo.sort(function(a,b) {return $(a).attr("coords").split(",")[0]*1 - $(b).attr("coords").split(",")[0]*1;});
linea.append(wo);
p.append(linea.clone());
linea=$("<line>");
linea.append(words.eq(i));
}
}
wo=linea.children().remove();
wo.sort(function(a,b) {return $(a).attr("coords").split(",")[0]*1 - $(b).attr("coords").split(",")[0]*1;});
linea.append(wo);
p.append(linea.clone());
return p;
}
/*
function traccia(el) {
$(".prp-page-image").css("position","relative");
selettore=$("<div>");
var coordXml=rect(el);
var fattore=$(".prp-page-image").width()/xml[0].width;
var coordImg=convCoord(coordXml,fattore);
selettore.css({"position":"absolute",
"z-index":100,
"left":coordImg[0],
"top":coordImg[1],
"width":coordImg[2],
"height":coordImg[3],
"border":"1px dotted red"
})
return selettore;
}
function convCoord (coord, fattore) {
for (var i=0; i<coord.length;i+=1) {coord[i]=Math.ceil(coord[i]*fattore);}
return coord;
}
*/