User:Ferri Leberl/c roboterseiten.R

From railML 2 Wiki
Jump to: navigation, search
Note.png This page is mirrored from page User:Documentation/c roboterseiten.R in The railML® 3 wiki.
# R-Skript zur Erstellung einer Dummyseite zum Import in Mediawiki
#Starten unter Linux: In der Konsole: R CMD BATCH c_roboterseiten.R
#kennt zwei Modi:
#Modus hand: Die Seiten werden für die Vorlage "docBase" im normalen Namensraum vorbereitet
#Modus dump: Die Seiten werden für die Vorlage "Schemaexport" im Benutzernamensraum von "Rotbot" vorbereitet#Kennt zwei Modi:
modus<-0#Für Handmodus — Braucht nie auskommentiert zu werden, da man es überschreiben kann
#modus<-1#Für Dumpmodus

#Name der Importdatei
import<-"../exportmatrix/beispiel3d"#Für Dummytabelle
#import<-"../exportmatrix/vorlage_echt"#Für echte Beispiele
import<-"../exportmatrix/output"#für xsd-output
import<-"liste_rml23"

#Name der Ergebnisdatei
datei<-"../wikiimporte/dump2wiki.xml"
datei<-"dump2wiki.xml"
#if(modus==0){datei<-"../wikiimporte/fürs_wiki.xml"}

#Bibliotheken
library(stringr)
library(tidyr)

#Umbrüche für die Importdatei
bruch<-"&lt;br&gt;"

#Funktion, die leere Vektorenden abschneidet
rip<-function(ripper){
rap<-c("")
dim(rap)<-1
for(i in 1:dim(ripper)[2]){if(ripper[i]!=""){
rap[i]<-ripper[i]
dim(rap)<-i
}}
dime<-dim(rap)
rap<-unlist(rap)
dim(rap)<-dime
rap
}

#Funktion, die den Kinderbaustein vorbereitet
#Wird auch erzeugt, wenn es keine Kinder gibt
#Listet die Einträge als [[Wikilinks]] und trennt sie mit Beistrich
#Eltern durchlaufen gleiche Funktion
kids<-function(kinput){
kinput<-array(unlist(kinput))
dimk<-dim(kinput)
kiba<-c("")
if(kinput[1]==""){kiba<-"None"}else{kiba<-paste0("[[",kinput[1],"]]")}
if(dimk>1){
for(i in 2:dimk){if(kinput[i]!=""){kiba<-paste0(kiba,", [[",kinput[i],"]]")}}
}
kiba
}

#Funktion, die Bausteine aus Attributen und ihren Kommentaren erzeugt
azeile<-function(at,ak,ap){
at<-array(unlist(at))
ak<-array(unlist(ak))
ap<-array(unlist(ap))
dima<-dim(at)
dimk<-dim(ak)
dimp<-dim(ap)
aba<-c("")
if(at[1]==""){aba<-"None"}else{
komm<-""
if(1<=dimk){if(ak[1]!=""){komm<-paste0(" (",ak[1],")")}}
aba<-paste0(at[1],komm)
}
if(dima>1){
for(i in 2:dima){
if(at[i]!=""){
komm<-""
if(i<=dimk){if(ak[i]!=""){komm<-paste0(" (",ak[i],")")}}
aba<-paste0(aba,bruch,at[i],komm)
}#if at nicht ""
}#for
}#if dima>1
aba
}#function

#Funktion, die Listenzeilen in Wikiseiten wandelt
#Modusabhängig
seite<-function(lijn){
#Modusabhängige Variablen für den Namensraum und Vorlage
raum<-""
vorlage<-"docBase"
if(modus==1){
raum<-"user:Robot/"
vorlage<-"Schemaexport"
}

zeile<-c(1:7)

zeile[1]<-"<page>\n"
zeile[2]<-paste0("<title>",raum,lijn[1,1],"</title>\n")
zeile[3]<-"<revision>\n"
zeile[4]<-"<contributor><username>Robot</username></contributor>\n"
zeile[5]<-"<text>\n"
zeile[6]<-paste0("&lt;noinclude&gt;Automatic Schemaexport for Element '''",lijn[1,1],"'''&lt;/noinclude&gt;\n")
zeile[7]<-paste0("{{",vorlage,"\n")
zeile[8]<-paste0("|element=",lijn[1,1],"\n")
zeile[9]<-paste0("|comment=",lijn[1,2],"\n")
zeile[10]<-paste0("|subschema=",lijn[1,3],"\n")
zeile[11]<-paste0("|parent=",lijn[1,4],"\n")
zeile[12]<-paste0("|children=",lijn[1,5],"\n")
zeile[13]<-paste0("|attributes=",lijn[1,6],"\n")
zeile[14]<-paste0("|obligatory=",lijn[1,8],"}}\n")
#if(as.character(lijn[1,8])=="1"){zeile[14]<-paste0("|pflichtelement=Das Element ist verpflichtend}}\n")}else{zeile[14]<-paste0("|pflichtelement=Das Element ist nicht verpflichtend}}\n")}
zeile[15]<-paste0("</text>\n")
zeile[16]<-"</revision>\n"
zeile[17]<-"</page>\n"
#Bereinigung für den Handmodus: Entfernung des Vorlagenkommentars; Hinweis zum Substituieren
if(modus==0){zeile[6]<-paste0("&lt;!-- \nThis page has been created automatically, employing a template. Please, expand the template before editing the page: replace “",vorlage,"” by “subst:",vorlage,"”.!\nAfter expanding template ",vorlage,", please delete this comment. --&gt;")}

seite<-paste(zeile,collapse="")
seite
}

#Prozedur, die die mehrelementigen Spalten aufbricht
teilung<-function(spalte){
spalte<-t(t(unlist(spalte)))
colnames(spalte)<-"kopf"
spalte<-separate(as.data.frame(spalte),kopf,into=as.character(c(1:(1+(max(str_count(spalte,";")))))),sep=";",fill="right")
#<NA> rausputzen:
spalte[is.na(spalte)]<-""
spalte
}

# Hauptprogramm

# Import
liste <- read.table(import, sep="\t", header=TRUE, dec=",")
#liste<-as.data.frame(liste)
#kinder<-read.table("../zwischenergebnisse/kinder", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F)
#attribut<-read.table("../zwischenergebnisse/attribute", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F)
#akomment<-read.table("../zwischenergebnisse/attributkomment", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F)

#Elemente kritischer Spalten zu Character erklärt
liste[is.na(liste)]<-""
#for(i in 1..dim(liste)[1]){if(is.na(liste$Pflichtelemente[i])=TRUE){liste$Pflichtelemente[i]=0}}
#liste$Pflichtelemente[is.na(liste$Pflichtelemente)]<-0
liste$Parent<-as.character(liste$Parent)
liste$Children<-as.character(liste$Children)
liste$Attribute<-as.character(liste$Attribute)
liste$Attributkommentare<-as.character(liste$Attributkommentare)
liste$Subschema<-as.character(liste$Subschema)
liste$Pflichtattribute<-as.character(liste$Pflichtattribute)

#Die Spalten werden in die vorgesehene Reihenfolge gebracht
#tasche<-liste
#colnames(feld)<-c("Name","Kommentar","Subschema","Parent","Children","Attribute","Attributkommentare","Pflichtelement","Pflichtattribute")
#liste[,1]<-tasche$Name
#liste[,2]<-tasche$Kommentar
#liste[,3]<-tasche$Subschema
#liste[,4]<-tasche$Parent
#liste[,5]<-tasche$Children
#liste[,6]<-tasche$Attribute
#liste[,7]<-tasche$Attributkommentare
#liste[,8]<-tasche$Pflichtelement
#liste[,9]<-tasche$Pflichtattribute

#Die Spalten werden herausgehoben und bekommen formhalber einen benannten Kopf
eltern<-teilung(liste$Parent)
kinder<-teilung(liste$Children)
attribut<-teilung(liste$Attribute)
akomment<-teilung(liste$Attributkommentare)
schema<-teilung(liste$Subschema)
apflicht<-teilung(liste$Pflichtattribute)

#Reinigung der Pflichtelementspalte
#for(i in 1:dim(liste)[1]){if(liste$Pflichtelement[i]!=1){liste$Pflichtelement[i]<-0}

#Hier werden die Subschemata, Eltern, Kinder, Attribute und Attributkommentare wieder mit der Liste konsolidiert — die Liste wird dreidimensional
#for(i in 1:dim(kinder)[1]){liste[i,5]<-kids(kinder[i,],dim(kinder)[2])}
#Subschemata:
kik<-t(t(1:dim(liste)[1]))
for(i in 1:dim(schema)[2]){schema[,i]<-as.character(schema[,i])}
for(i in 1:dim(schema)[1]){kik[i,1]<-kids(schema[i,])}
liste[,3]<-kik
#Eltern:
kik<-t(t(1:dim(liste)[1]))
for(i in 1:dim(eltern)[2]){eltern[,i]<-as.character(eltern[,i])}
for(i in 1:dim(eltern)[1]){kik[i,1]<-kids(eltern[i,])}
liste[,4]<-kik
#Kinder:
kik<-t(t(1:dim(liste)[1]))
for(i in 1:dim(kinder)[2]){kinder[,i]<-as.character(kinder[,i])}
for(i in 1:dim(kinder)[1]){kik[i,1]<-kids(kinder[i,])}
liste[,5]<-kik
#Attribute:
kik<-t(t(1:dim(liste)[1]))
for(i in 1:dim(attribut)[2]){attribut[,i]<-as.character(attribut[,i])}
for(i in 1:dim(akomment)[2]){akomment[,i]<-as.character(akomment[,i])}
for(i in 1:dim(attribut)[1]){kik[i,1]<-azeile(attribut[i,],akomment[i,],apflicht[i,])}
liste[,6]<-kik


#Hier werden die Zeilen der Importtabelle abgearbeitet
lang<-dim(liste)[1]
stran<-c(1:lang)
for(i in 1:lang){

stran[i]<-seite(liste[i,1:8])
}
stran<-paste(stran,collapse="")


#Letzten Vektor vorbereiten
fertig<-c("<mediawiki>\n",stran,"</mediawiki>")
fertig<-paste(fertig,collapse="")
# speichern
fileConn<-file(datei)
writeLines(fertig,fileConn)
close(fileConn)