Utente:Alex brollo/xml2text.js

Da Wikisource.

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;
}
*/