RXML2-migrering
RXML används än idag på Lysators webbserver (-- hugo, 2020), men informationen om hur man konverterar är desstå mindre relevant då förhoppningsvis alla redan gjort det.
Konvertera RXML1 till RXML2
Bli XML-kompatibel
Om dokumentet
Här kladdas lösningar ner på problem som tagits upp i KOM-mötet "Infosystem(@) Lysator". Det är inte avsett att vara en komplett guide utan ett ställa att teckna ner lösningar på problem som någon behövt hjälp med.
Detta dokument är författat av zino, och konverterades till wiki av ceder.
Därför vill du uppgradera
Den största skillnaden mellan Roxen 1.x och Roxen 2.x+ är att RXML också fick ändrade majorversion från RXML1 till RXML2. De stora ändringar som gjordes gör att RXML1 på många sätt är inkompatibel med RXML2. Det finns många anledningar till det, men de kan i slutändan destilleras till: Förbättrad säkerhet och XML-kompatibilitet. Det finns också ett kompatibilitetsmode, men slår man på det tappar man många av de fördelar som RXML2 ger.
Specifika Problem
RXML parse error: This tag doesn't handle content.
Exempel på RXML1 som kommer att generera det om det stoppas i en RXML2-miljö:
<insert file=template>
I XML måste alla taggar avslutas med "/>" för att indikera att de inte är början på en container. Korrekt RXML2:
<insert file="template" />
<insert> with replace
I RXML1 kunde man ersätta strängar i det man satte in genom att sätta in attribut med vilka namn som helst i <insert>. Det är inte så XML-vänligt, så den möjligheten finns inte längre. Den absolut vanligaste användningen är att göra sid-templates av olika slag.
Exempel i RXML1:
foo.html:
<insert file="header" _title="Foo"> Lorem gazonkium <insert file="footer" _email="zino">
header:
<head> <title>_title</title> </head> <body>
footer
Maintainer: <a href="_email@test.com">_email@test.com</a> </body>
Förslag på RXML2-lösning:
foo.html (container style):
<use file="template" /> <my-template title="Foo" email="zino"> Lorem gazonkium </my-template>
template (container style):
<define container="my-template"> <head> <title>&_.title;</title> </head> <body> <contents/> Maintainer: <a href="&_.email;@test.com">&_.email;@test.com</a> </body> </define>
<insert>-attributet name fungerar inte
Det är korrekt uppfattat. Använd variabler.
RXML1:
<define name=foo>Hej</define> <insert name=foo>
RXML2:
<set variable=var.foo>Hej</set> &var.foo;
Tagar, containers och attribut som skrivs med stora bokstäver fungerar inte
XML har lyckligtvis tightat upp det. Skriv allt med små bokstäver så fungerar det.
RXML1:
<MODIFIED>
RXML2:
<modified/>
<modified lang="se" /> ger inte svensk text
Koden "se" är upptagen av ett annat språk och svenska måste anges med standardkoden sv.
RXML1:
<modified lang="se">
RXML2:
<modified lang="sv"/>
Sidan blir inte RXML-parsad alls
För att din sida ska RXML-parsas så måste filen ha execute-bitten
satt. Dvs, du måste göra operationen chmod +x
filnamn.html
. Detta är ett val som gjorts av Lysators
webansvarige i den nya servern för att låta användaren ha större
kontroll över hur resultat retuneras från servern.
(Det här är inte ett RXML2-specifikt problem, utan en skillnad i inställning av servrarna på Lysator.)
Tips och trick
Under den här rubriken samlar vi tips från våra medlemmar om hur man kan underlätta migreringen.
Konvertera <insert>-taggar
Fabian Norlin tipsar om att man kan konvertera <insert>-taggar så att de följer XML samt RXML2 med detta lilla behändiga perl-script:
perl -pi -e 's/<insert file="([^>]*)>/<insert file="$1\/>/g' *.html
Tänk på att det här gör ändringar i filerna! Spara gärna en kopia först, om något skulle gå fel. Tipset kan lätt modifieras för att fixa till andra taggar.
(En dårsateprodukt)