De situatie
Ik heb een HTML document met een inhoudsopgave en een aantal items. Kort voorbeeld:HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <html> <body> <h1>Inhoudsopgave</h1> <ul> <li><a href="#item1">Titel 1</a></li> <li><a href="#item2">Titel 2</a></li> ... </ul> ... <a name="item1"></a> <h2>Titel 1<h2> <p>Content 1</p> ... <a name="item2"></a> <h2>Titel 2<h2> <p>Content 2</p> ... </body> </html> |
De links in de inhoudsopgave zijn interne anchor links, waar je op kunt klikken om naar het gewenste item te gaan. Dit werkt.
Nu is het zo dat de content van de items van een externe site komt, en soms relatieve links bevat. Gelukkig weet ik het adres van de site waar de content vandaag komt, dus dacht ik dit probleem op te kunnen lossen door simpelweg een <base href=".."> tag toe te voegen, zodat links geïnterpreteerd worden relatief aan de oorspronkelijke URL. De HTML code ziet er dan bijvoorbeeld zo uit:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <html> <head><base href="http://example.com/"></head> <body> <h1>Inhoudsopgave</h1> <ul> <li><a href="#item1">Titel 1</a> ... </ul> ... <a name="item1"></a> <h2>Titel 1<h2> <img src="foo/bar.png"> ... </body> </html> |
Op deze manier wordt het plaatje onder Titel 1 geladen van http://example.com/foo/bar.png, zoals de bedoeling is. Ook dit werkt.
Het probleem
Probleem opgelost, zou je denken, behalve dat de anchor links uit de inhoudsopgave nu niet meer werken! Dat komt natuurlijk omdat een link naar #item1 dankzij de base link wordt geïnterpreteerd als http://example.com/#item1 en die URL verwijst niet naar de huidige pagina.Nu zou je denken: maak dan de links in de inhoudsopgave absoluut. Dat kan in dit geval echter niet, want het document is de HTML-content van een e-mailbericht, en heeft dus geen zelfstandige URL. Om dezelfde reden is het probleem ook niet met Javascript op te lossen (wat trouwens ook niet bijzonder elegant zou zijn), aangezien e-mail clients geen Javascript code in e-mailberichten uitvoeren.
De enige optie die ik nog kan verzinnen is het volledig parsen en herschrijven van de item content, waarbij relatieve naar absolute links omgeschreven worden, zodat ik de base-tag achterwege kan laten. Hier zie ik tegenop, omdat het lastig is om HTML correct te parsen.