chiark / gitweb /
WIP chart parser
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 Aug 2009 14:46:58 +0000 (15:46 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Thu, 20 Aug 2009 14:46:58 +0000 (15:46 +0100)
yarrg/test-yppedia-chart [new file with mode: 0644]
yarrg/yppedia-chart-parser [new file with mode: 0755]

diff --git a/yarrg/test-yppedia-chart b/yarrg/test-yppedia-chart
new file mode 100644 (file)
index 0000000..08c3fbf
--- /dev/null
@@ -0,0 +1,579 @@
+<div style="{{Chart style|65|65}}">
+{{Chart head}}
+<!--Ruby-->
+{{Chart label|23|6|[[Image:Ruby.png]]'''''[[Ruby Archipelago (Midnight)|Ruby Archipelago]]'''''}}
+ <!-- Islands -->
+{{Chart island icon|18|1|Olivia Isle|Midnight|out|sincosite, tellurium, sugar cane, lily of the valley}}
+{{Chart island icon|25|4|Cranberry Island|Midnight|lg_col|hemp, wood}}
+{{Chart island icon|23|2|Midsummer|Midnight|med_col|nettle, hemp}}
+{{Chart island icon|25|4|Cranberry Island|Midnight|lg_col|hemp, wood}}
+{{Chart island icon|22|7|Eta Island|Midnight|lg_col|wood}}
+{{Chart island icon|17|6|Lynx Island|Midnight|med|chalcocite, papagoite, stone}}
+{{Chart island icon|18|11|Islay of Luthien|Midnight|lg_col|sugar cane, iron, elderberries, serandite}}
+{{Chart island icon|27|12|Jorvik Island|Midnight|lg_col|wood, stone, cowslip}}
+ <!--Olivia-Midsummer-->
+{{Chart league|18|1|-|indianred}}
+{{Chart league|20|1|\|indianred}}
+{{Chart league|21|2|-|indianred}}
+ <!--Midsummer-Cranberry-->
+{{Chart league solid|24|3|\|indianred}}
+{{Chart league solid|23|2|\|indianred}}
+ <!--Cranberry-Eta-->
+{{Chart league solid|24|4|/|indianred}}
+{{Chart league solid|23|5|/|indianred}}
+{{Chart league solid|22|6|/|indianred}}
+ <!--Lynx-Eta-->
+{{Chart league solid|17|6|-|firebrick}}
+{{Chart league solid|19|6|\|firebrick}}
+{{Chart league solid|20|7|-|firebrick}}
+ <!--Olivia-Lynx-->
+{{Chart league|17|1|/|firebrick}}
+{{Chart league|17|2|\|firebrick}}
+{{Chart league|17|3|/|firebrick}}
+{{Chart league|17|4|\|firebrick}}
+{{Chart league|17|5|/|firebrick}}
+ <!--Lynx-Luthien-->
+{{Chart league|16|6|/|firebrick}}
+{{Chart league|16|7|\|firebrick}}
+{{Chart league|16|8|/|firebrick}}
+{{Chart league|16|9|\|firebrick}}
+{{Chart league|17|10|\|firebrick}}
+ <!--Luthien-Eta-->
+{{Chart league solid|18|10|/|indianred}}
+{{Chart league solid|19|9|/|indianred}}
+{{Chart league solid|20|8|/|indianred}}
+{{Chart league solid|21|7|/|indianred}}
+ <!--Luthien-Jorvik-->
+{{Chart league solid|18|11|-|firebrick}}
+{{Chart league solid|20|11|-|firebrick}}
+{{Chart league solid|22|11|-|firebrick}}
+{{Chart league solid|24|11|\|firebrick}}
+{{Chart league solid|25|12|-|firebrick}}
+ <!--Eta-Jorvik-->
+{{chart league solid|22|7|\|indianred}}
+{{chart league solid|23|8|\|indianred}}
+{{chart league solid|24|9|\|indianred}}
+{{chart league solid|25|10|\|indianred}}
+{{chart league solid|26|11|\|indianred}}
+ <!--Jorvik training route-->
+{{Chart league|29|12|o|gray}}
+{{chart league|26|13|o|gray}}
+{{Chart league|28|11|o|gray}}
+ <!--Interarches-->
+<!--Jorvik-Turtle-->
+{{Chart league|27|12|\|gold}}
+{{Chart league|28|13|\|gold}}
+{{Chart league|29|14|\|gold}}
+{{Chart league|30|15|\|gold}}
+{{Chart league|31|16|\|gold}}
+{{Chart league|32|17|\|gold}}
+<!--Luthien-Nuptial-->
+{{Chart league|17|11|/|gold}}
+{{Chart league|17|12|\|gold}}
+{{Chart league|17|13|/|gold}}
+{{Chart league|17|14|\|gold}}
+{{Chart league|17|15|/|gold}}
+{{Chart league|16|16|/|gold}}
+{{Chart league|15|17|/|gold}}
+{{Chart league|14|18|/|gold}}
+{{Chart league|13|19|/|gold}}
+{{Chart league|12|20|/|gold}}
+
+<!-- Pearl -->
+{{Chart label|0|17|[[Image:Pearl.png]]'''''[[Pearl Archipelago (Midnight)|Pearl Archipelago]]'''''}}
+<!--Islands of Pearl-->
+{{Chart island icon|6|23|Zeta Island|Midnight|lg_col|wood, old man's beard, weld, tellurium}}
+{{Chart island icon|1|26|Tadpole Isle|Midnight|out|hemp, pokeweed berries}}
+{{Chart island icon|2|19|Cleopatra's Pearls|Midnight|med_col|sugar cane, elderberries, cowslip, chalcocite}}
+{{Chart island icon|10|25|Ostreum Island|Midnight|med_col|iron, iris root}}
+{{Chart island icon|7|18|O'Reilly Island|Midnight|out|butterfly weed, stone, and masuyite}}
+{{Chart island icon|6|29|Frond Island|Midnight|out_col|hemp, pokeweed berries, butterfly weed, leushite}}
+{{Chart island icon|12|21|Nuptial Island|Midnight|out|lily of the valley}}
+<!--Nuptial-Zeta-->
+{{Chart league solid|11|21|/|blue}}
+{{Chart league solid|9|22|-|blue}}
+{{Chart league solid|8|22|/|blue}}
+{{Chart league solid|6|23|-|blue}}
+<!--Zeta-Tadpole-->
+{{Chart league solid|1|25|/|blue}}
+{{Chart league solid|2|24|/|blue}}
+{{Chart league solid|3|24|-|blue}}
+{{Chart league solid|5|23|/|blue}}
+<!--Zeta-Cleo-->
+{{Chart league solid|5|22|\|turquoise}}
+{{Chart league solid|4|21|\|turquoise}}
+{{Chart league solid|3|20|\|turquoise}}
+{{Chart league solid|2|19|\|turquoise}}
+<!--Zeta-Ostreum-->
+{{Chart league solid|6|23|\|turquoise}}
+{{Chart league solid|7|24|\|turquoise}}
+{{Chart league solid|8|25|-|turquoise}}
+<!--Tadpole-Frond-->
+{{Chart league|1|26|\|green}}
+{{Chart league|2|27|\|green}}
+{{Chart league|3|28|\|green}}
+{{Chart league|4|29|-|green}}
+<!--Frond-Ostreum-->
+{{Chart league solid|6|28|/|green}}
+{{Chart league solid|7|27|/|green}}
+{{Chart league solid|8|26|/|green}}
+{{Chart league solid|9|25|/|green}}
+<!--Cleo-O'Reilly-->
+{{Chart league|2|19|-|orange}}
+{{Chart league|4|19|-|orange}}
+{{Chart league|6|18|/|orange}}
+<!--O'Reilly-Nuptial-->
+{{Chart league|7|18|\|green}}
+{{Chart league|8|19|\|green}}
+{{Chart league|9|20|\|green}}
+{{Chart league|10|21|-|green}}
+
+<!--Ostreum-Wrasse-->
+{{Chart league|10|25|\|gold}}
+{{Chart league|11|26|\|gold}}
+{{Chart league|12|27|\|gold}}
+{{Chart league|13|28|\|gold}}
+{{Chart league|14|29|\|gold}}
+{{Chart league|15|30|-|gold}}
+
+<!--Emerald-->
+{{Chart label|14|38|[[Image:Emerald.png|Emerald gem]]'''''[[Emerald Archipelago (Midnight)|Emerald Archipelago]]'''''}}
+<!--Islands-->
+{{Chart island icon|17|30|Wrasse Island|Midnight|lg_col|iron, chalcocite, pokeweed berries, lobelia}}
+{{Chart island icon|18|35|Gaea Island|Midnight|lg_col|hemp, iron, sugar cane}}
+{{Chart island icon|23|38|Epsilon Island|Midnight|lg_col|hemp, sugar cane, sincosite}}
+{{Chart island icon|18|43|Tinga Island|Midnight|lg_col|hemp, indigo, madder, sugar cane}}
+{{Chart island icon|25|44|Spring Island|Midnight|lg_col|iron, wood, tellurium}}
+{{Chart island icon|27|40|Emperor Island|Midnight|med_col|stone, serandite, sugar cane}}
+{{Chart island icon|26|31|Guava Island|Midnight|lg_col|weld, wood, stone}}
+
+<!--Wrasse-Gaea-->
+{{chart league solid|16|30|/|orange}}
+{{chart league solid|16|31|\|orange}}
+{{chart league solid|16|32|/|orange}}
+{{chart league solid|16|33|\|orange}}
+{{chart league solid|17|34|\|orange}}
+<!--Wrasse-Guava-->
+{{chart league solid|17|30|-|orange}}
+{{chart league solid|19|30|-|orange}}
+{{chart league solid|21|30|-|orange}}
+{{chart league solid|23|30|\|orange}}
+{{chart league solid|24|31|-|orange}}
+<!--Guava training points-->
+{{chart league|25|30|o|gray}}
+{{chart league|28|31|o|gray}}
+{{chart league|27|32|o|gray}}
+<!--Gaea-Eps-->
+{{chart league solid|18|35|\|green}}
+{{chart league solid|19|36|\|green}}
+{{chart league solid|20|37|\|green}}
+{{chart league solid|21|38|-|green}}
+<!--Eps-Tinga-->
+{{chart league solid|22|38|/|green}}
+{{chart league solid|21|39|/|green}}
+{{chart league solid|20|40|/|green}}
+{{chart league solid|19|41|/|green}}
+{{chart league solid|18|42|/|green}}
+<!--Tinga-Spring-->
+{{chart league solid|18|43|-|gold}}
+{{chart league solid|20|43|-|gold}}
+{{chart league solid|22|43|\|gold}}
+{{chart league solid|23|44|-|gold}}
+<!--Spring training route-->
+{{chart league|24|43|o|gray}}
+{{chart league|27|44|o|gray}}
+{{chart league|26|45|o|gray}}
+<!--Spring-Emperor-->
+{{chart league solid|25|43|/|green}}
+{{chart league solid|26|42|/|green}}
+{{chart league solid|26|41|\|green}}
+{{chart league solid|26|40|/|green}}
+<!--Emperor-Epsilon-->
+{{chart league solid|23|38|\|green}}
+{{chart league solid|24|39|\|green}}
+{{chart league solid|25|40|-|green}}
+<!--Epsilon-Guava-->
+{{chart league solid|23|37|/|green}}
+{{chart league solid|24|36|/|green}}
+{{chart league solid|25|35|/|green}}
+{{chart league solid|25|34|\|green}}
+{{chart league solid|25|33|/|green}}
+{{chart league solid|25|32|\|green}}
+{{chart league solid|25|31|/|green}}
+
+<!--Guava-Cnossos-->
+{{chart league|26|30|/|gold}}
+{{chart league|27|29|/|gold}}
+{{chart league|28|28|/|gold}}
+{{chart league|29|27|/|gold}}
+{{chart league|30|27|-|gold}}
+{{chart league|32|26|/|gold}}
+
+<!--Diamond-->
+{{Chart label|41|23|[[Image:Diamond.png]]'''''[[Diamond Archipelago (Midnight)|Diamond Archipelago]]'''''}}
+<!--Islands-->
+{{Chart island icon|33|18|Turtle Island|Midnight|lg_col|iron, wood, stone}}
+{{Chart island icon|38|19|Papaya Island|Midnight|lg_col|hemp, wood, cowslip, lily of the valley, cubanite}}
+{{Chart island icon|42|21|Byrne Island|Midnight|lg_col|sugar cane, iron, sincosite}}
+{{Chart island icon|38|25|Alpha Island|Midnight|lg_col|no commodities}}
+{{Chart island icon|43|26|Oyster Island|Midnight|lg_col|hemp, elderberries}}
+{{Chart island icon|33|26|Cnossos Island|Midnight|lg_col|stone, tellurium, serandite}}
+{{Chart island icon|37|30|Winter Solstice|Midnight|lg_col|sugar cane, hemp, stone, madder}}
+<!--Cnossos Training-->
+{{chart league|31|26|o|gray}}
+{{chart league|34|25|o|gray}}
+<!--Cnossos-Winter-->
+{{chart league solid|33|26|\|turquoise}}
+{{chart league solid|34|27|\|turquoise}}
+{{chart league solid|35|28|\|turquoise}}
+{{chart league solid|36|29|\|turquoise}}
+<!--Cnossos-Alpha-->
+{{chart league solid|33|26|-|turquoise}}
+{{chart league solid|35|26|-|turquoise}}
+{{chart league solid|37|25|/|turquoise}}
+<!--Alpha-Winter-->
+{{chart league|38|27|o|gray}}
+{{chart league|37|28|o|gray}}
+<!--Cnossos-Turtle-->
+{{chart league solid|32|25|\|blue}}
+{{chart league solid|32|24|/|blue}}
+{{chart league solid|32|23|\|blue}}
+{{chart league solid|32|22|/|blue}}
+{{chart league solid|32|21|\|blue}}
+{{chart league solid|32|20|/|blue}}
+{{chart league solid|32|19|\|blue}}
+{{chart league solid|32|18|/|blue}}
+<!--Turtle Training-->
+{{chart league|31|18|o|gray}}
+{{chart league|34|17|o|gray}}
+{{chart league|34|19|o|gray}}
+<!--Turtle-Papaya-->
+{{chart league solid|33|18|-|gold}}
+{{chart league solid|35|18|\|gold}}
+{{chart league solid|36|19|-|gold}}
+<!--Papaya-Byrne-->
+{{chart league solid|38|19|\|gold}}
+{{chart league solid|39|20|\|gold}}
+{{chart league solid|40|21|-|gold}}
+<!--Byrne Training-->
+{{chart league|41|20|o|gray}}
+{{chart league|44|21|o|gray}}
+{{chart league|43|22|o|gray}}
+<!--Alpha-Turtle-->
+{{chart league solid|37|24|\|blue}}
+{{chart league solid|36|23|\|blue}}
+{{chart league solid|35|22|\|blue}}
+{{chart league solid|34|21|\|blue}}
+{{chart league solid|33|20|\|blue}}
+<!--Alpha-Byrne-->
+{{chart league solid|38|24|/|orange}}
+{{chart league solid|39|23|/|orange}}
+{{chart league solid|40|22|/|orange}}
+{{chart league solid|41|21|/|orange}}
+<!--Winter-Oyster-->
+{{chart league solid|37|29|/|turquoise}}
+{{chart league solid|38|28|/|turquoise}}
+{{chart league solid|39|27|/|turquoise}}
+{{chart league solid|40|27|-|turquoise}}
+{{chart league solid|42|26|/|turquoise}}
+<!--Oyster Training-->
+{{chart league|42|25|o|gray}}
+{{chart league|44|25|o|gray}}
+{{chart league|45|26|o|gray}}
+<!--Alpha-Oyster-->
+{{chart league solid|38|25|-|turquoise}}
+{{chart league solid|40|25|\|turquoise}}
+{{chart league solid|41|26|-|turquoise}}
+<!--Papaya-Remora-->
+{{chart league|38|18|/|gold}}
+{{chart league|39|17|/|gold}}
+{{chart league|40|16|/|gold}}
+{{chart league|41|15|/|gold}}
+{{chart league|42|14|/|gold}}
+{{chart league|43|13|/|gold}}
+{{chart league|43|12|\|gold}}
+{{chart league|43|11|/|gold}}
+<!--Byrne-Remora-->
+{{chart league|42|20|/|gold}}
+{{chart league|43|19|/|gold}}
+{{chart league|43|18|\|gold}}
+{{chart league|43|17|/|gold}}
+{{chart league|43|16|\|gold}}
+{{chart league|43|15|/|gold}}
+{{chart league|43|14|\|gold}}
+
+ <!--Sapphire-->
+{{chart label|45|14|[[Image:Sapphire.png]]'''''[[Sapphire Archipelago (Midnight)|Sapphire Archipelago]]'''''}}
+ <!--Islands-->
+{{Chart island icon|49|12|Beta Island|Midnight|lg_col|yarrow, sugar cane, wood}}
+{{Chart island icon|47|8|The Horseshoe Crabs|Midnight|out|leushite, papagoite, butterfly weed}}
+{{Chart island icon|55|14|Iris Island|Midnight|out_col|lorandite, papagoite, iron}}
+{{Chart island icon|44|11|Remora Island|Midnight|out_col|pokeweed berries, iris root}}
+{{Chart island icon|57|10|Uxmal Island|Midnight|lg|sugar cane, tellurium, nettle, cowslip, stone}}
+{{Chart island icon|52|9|Verdant Atoll|Midnight|out|old man's beard, madder, nettle}}
+{{Chart island icon|59|16|Vernal Equinox|Midnight|med_col|sincosite, thorianite, sugar cane, hemp, broom flower}}
+<!--Remora-Horseshoe Crabs-->
+{{chart league|44|10|/|gold}}
+{{chart league|45|9|/|gold}}
+{{chart league|46|8|/|gold}}
+<!--Remora-Beta-->
+{{chart league solid|44|11|-|gold}}
+{{chart league solid|46|11|\|gold}}
+{{chart league solid|47|12|-|gold}}
+<!--Beta-Verdant-->
+{{chart league solid|49|11|/|gold}}
+{{chart league solid|50|10|/|gold}}
+{{chart league solid|51|9|/|gold}}
+<!--Horseshoe Crabs-Verdant-->
+{{chart league|47|8|-|green}}
+{{chart league|49|8|\|green}}
+{{chart league|50|9|-|green}}
+<!--Extinct Points-->
+{{chart league|48|9|o|gray}}
+{{chart league|47|10|o|gray}}
+{{chart league|49|10|o|gray}}
+{{chart league|48|11|o|gray}}
+{{chart league|51|8|o|gray}}
+{{chart league|53|10|o|gray}}
+{{chart league|54|11|o|gray}}
+{{chart league|55|12|o|gray}}
+{{chart league|57|14|o|gray}}
+{{chart league|58|15|o|gray}}
+{{chart league|51|12|o|gray}}
+<!--Beta-Iris-->
+{{chart league solid|49|12|\|indianred}}
+{{chart league solid|50|13|-|indianred}}
+{{chart league solid|52|13|\|indianred}}
+{{chart league solid|53|14|-|indianred}}
+<!--Iris-Vernal-->
+{{chart league|55|14|\|firebrick}}
+{{chart league|56|15|\|firebrick}}
+{{chart league|57|16|-|firebrick}}
+<!--Verdant-Uxmal-->
+{{chart league|52|9|-|firebrick}}
+{{chart league|54|9|\|firebrick}}
+{{chart league|55|10|-|firebrick}}
+<!--Iris-Uxmal-->
+{{chart league|56|10|/|firebrick}}
+{{chart league|56|11|\|firebrick}}
+{{chart league|56|12|/|firebrick}}
+{{chart league|55|13|/|firebrick}}
+
+<!--Spring-Heph-->
+{{chart league|24|44|/|gold}}
+{{chart league|24|45|\|gold}}
+{{chart league|25|46|\|gold}}
+{{chart league|26|47|\|gold}}
+{{chart league|27|48|\|gold}}
+{{chart league|28|49|\|gold}}
+{{chart league|29|50|\|gold}}
+{{chart league|30|51|\|gold}}
+
+<!--Jet-->
+{{Chart label|34|50|[[Image:Jet.png]] <b>''[[Jet Archipelago (Midnight)|Jet Archipelago]]''</b>}}
+<!--Islands-->
+{{Chart island icon|31|52|Hephaestus' Forge|Midnight|lg_col|iron, tellurium}}
+{{Chart island icon|31|58|Namath Island|Midnight|lg_col|sugar cane, wood, madder}}
+{{Chart island icon|35|60|Rhinoceros Ridge|Midnight|out|lily of the valley, hemp, stone, lorandite}}
+{{Chart island icon|37|58|Lagniappe Island|Midnight|lg_col|market: sugar cane, butterfly weed, sincosite}}
+{{Chart island icon|38|53|Xi Island|Midnight|lg_col|sugar cane, stone, elderberries}}
+{{Chart island icon|44|51|Chaparral Island|Midnight|out_col|wood, old man's beard, broom flower}}
+{{Chart island icon|42|55|Eclipse Island|Midnight|out_col|cowslip, hemp}}
+{{Chart island icon|43|58|Dugong Island|Midnight|out|pokeweed berries, iron, wood}}
+<!--Heph-Namath-->
+{{chart league solid|30|52|/|blue}}
+{{chart league solid|30|53|\|blue}}
+{{chart league solid|30|54|/|blue}}
+{{chart league solid|30|55|\|blue}}
+{{chart league solid|30|56|/|blue}}
+{{chart league solid|30|57|\|blue}}
+<!--Namath-Rhino-->
+{{chart league solid|31|58|\|orange}}
+{{chart league solid|32|59|\|orange}}
+{{chart league solid|33|60|-|orange}}
+<!--Rhino-Lagniappe-->
+{{chart league solid|35|59|/|orange}}
+{{chart league solid|36|58|/|orange}}
+<!--Heph-Xi-->
+{{chart league solid|31|52|-|indianred}}
+{{chart league solid|33|52|-|indianred}}
+{{chart league solid|35|52|\|indianred}}
+{{chart league solid|36|53|-|indianred}}
+<!--Lagniappe-Xi-->
+{{chart league solid|37|57|/|green}}
+{{chart league solid|37|56|\|green}}
+{{chart league solid|37|55|/|green}}
+{{chart league solid|37|54|\|green}}
+{{chart league solid|37|53|/|green}}
+<!--Lagniappe-Dugong-->
+{{chart league solid|37|58|-|gold}}
+{{chart league solid|39|58|-|gold}}
+{{chart league solid|41|58|-|gold}}
+<!--Xi-Chap-->
+{{chart league solid|38|53|-|orange}}
+{{chart league solid|40|52|/|orange}}
+{{chart league solid|41|52|-|orange}}
+{{chart league solid|43|51|/|orange}}
+<!--Dugong-Eclipse-->
+{{chart league|42|57|\|gray}}
+{{chart league|41|56|\|gray}}
+{{chart league|41|55|/|gray}}
+<!--Eclipse-Chap-->
+{{chart league|43|52|\|gray}}
+{{chart league|42|54|/|gray}}
+{{chart league|43|53|/|gray}}
+
+<!--Chap-Monsoon-->
+{{chart league|44|50|/|gold}}
+{{chart league|45|49|/|gold}}
+{{chart league|46|48|/|gold}}
+{{chart league|47|47|/|gold}}
+{{chart league|47|46|\|gold}}
+{{chart league|47|45|/|gold}}
+
+ <!--Coral-->
+{{chart label|45|37|[[Image:Coral.png]]'''''[[Coral Archipelago (Midnight)|Coral Archipelago]]'''''}}
+ <!--Islands-->
+{{Chart island icon|51|32|Park Island|Midnight|lg_col|lobelia, stone, wood}}
+{{Chart island icon|62|33|Meke Island|Midnight|out_col|cubanite, iron, leushite, masuyite, sugar cane}}
+{{Chart island icon|57|36|Angelfish Island|Midnight|out_col|hemp, serandite, tellurium}}
+{{Chart island icon|53|38|Delta Island|Midnight|lg_col|sugar cane, weld}}
+{{Chart island icon|47|42|Macaw Island|Midnight|out|cowslip, hemp, sassafras}}
+{{Chart island icon|48|45|Monsoon Island|Midnight|med|butterfly weed, hemp, iron, papagoite}}
+{{Chart island icon|54|43|Turongo Island|Midnight|out|nettle, stone, sugar cane}}
+{{Chart island icon|58|45|Durian Island|Midnight|out|lorandite, old man's beard, pokeweed berries, sugar cane}}
+<!--Monsoon-Macaw-->
+{{chart league|47|44|\|gray}}
+{{chart league|46|43|\|gray}}
+{{chart league|46|42|/|gray}}
+<!--Monsoon-Turongo-->
+{{chart league|48|45|-|gray}}
+{{chart league|50|44|/|gray}}
+{{chart league|51|44|-|gray}}
+{{chart league|53|43|/|gray}}
+<!--Turongo-Durian-->
+{{chart league|54|43|\|gray}}
+{{chart league|55|44|\|gray}}
+{{chart league|56|45|-|gray}}
+<!--Extinct points-->
+{{chart league|52|45|o|gray}}
+{{chart league|54|45|o|gray}}
+{{chart league|56|43|o|gray}}
+{{chart league|57|42|o|gray}}
+{{chart league|57|44|o|gray}}
+<!--Macaw-Delta-->
+{{chart league solid|47|41|/|green}}
+{{chart league solid|48|40|/|green}}
+{{chart league solid|49|39|/|green}}
+{{chart league solid|50|39|-|green}}
+{{chart league solid|52|38|/|green}}
+<!--Delta-Angelfish-->
+{{chart league solid|53|37|/|gray}}
+{{chart league solid|54|37|-|gray}}
+{{chart league solid|56|36|/|gray}}
+<!--Angelfish-Meke-->
+{{chart league|57|35|/|orange}}
+{{chart league|58|34|/|orange}}
+{{chart league|59|34|-|orange}}
+{{chart league|61|33|/|orange}}
+<!--Angelfish-Turongo-->
+{{chart league|56|37|\|green}}
+{{chart league|56|38|/|green}}
+{{chart league|56|39|\|green}}
+{{chart league|56|40|/|green}}
+{{chart league|55|41|/|green}}
+{{chart league|54|42|/|green}}
+<!--Delta-Park-->
+{{chart league solid|52|37|\|gray}}
+{{chart league solid|51|36|\|gray}}
+{{chart league solid|50|35|\|gray}}
+{{chart league solid|50|34|/|gray}}
+{{chart league solid|50|33|\|gray}}
+{{chart league solid|50|32|/|gray}}
+<!--Park-Angelfish-->
+{{chart league solid|51|32|\|gray}}
+{{chart league solid|52|33|\|gray}}
+{{chart league solid|53|34|\|gray}}
+{{chart league solid|54|35|\|gray}}
+{{chart league solid|55|36|-|gray}}
+<!--Park-Oyster-->
+{{chart league|49|32|-|gold}}
+{{chart league|48|31|\|gold}}
+{{chart league|47|30|\|gold}}
+{{chart league|46|29|\|gold}}
+{{chart league|45|28|\|gold}}
+{{chart league|44|27|\|gold}}
+{{chart league|43|26|\|gold}}
+
+<!--Tinga-Orca-->
+{{chart league|17|43|/|gold}}
+{{chart league|15|44|-|gold}}
+{{chart league|14|44|/|gold}}
+{{chart league|13|45|/|gold}}
+{{chart league|12|46|/|gold}}
+{{chart league|11|47|/|gold}}
+{{chart league|10|48|/|gold}}
+{{chart league|9|49|/|gold}}
+
+ <!--Opal-->
+{{chart label|8|55|[[Image:Opal.png]]'''''[[Opal Archipelago (Midnight)|Opal Archipelago]]'''''}}
+
+ <!--Islands-->
+{{Chart island icon|2|53|Norse Island|Midnight|out|papagoite, serandite, stone}}
+{{Chart island icon|2|57|Waterberry|Midnight|out|elderberries, hemp, wood}}
+{{Chart island icon|3|60|Boyle Island|Midnight|out|cubanite, sugar cane}}
+{{Chart island icon|8|61|Flow|Midnight|out|cowslip, stone, thorianite, yarrow}}
+{{Chart island icon|9|58|Oseberg Island|Midnight|out|butterfly weed, iris root, leushite}}
+{{Chart island icon|7|54|Nu Island|Midnight|lg_col|hemp, nettle, sugar cane}}
+{{Chart island icon|9|50|Orca Island|Midnight|out_col|iron, tellurium}}
+{{Chart island icon|12|53|Endurance Island|Midnight|lg_col|none}}
+
+<!--Orca-Endurance-->
+{{chart league solid|9|50|\|green}}
+{{chart league solid|10|51|\|green}}
+{{chart league solid|11|52|\|green}}
+<!--Orca-Nu-->
+{{chart league solid|8|50|/|green}}
+{{chart league solid|8|51|\|green}}
+{{chart league solid|8|52|/|green}}
+{{chart league solid|7|53|/|green}}
+<!--Orca-Norse-->
+{{chart league|6|51|-|gray}}
+{{chart league|5|51|/|gray}}
+{{chart league|3|52|-|gray}}
+{{chart league|2|52|/|gray}}
+<!--Norse-Nu-->
+{{chart league solid|2|53|-|turquoise}}
+{{chart league solid|4|53|\|turquoise}}
+{{chart league solid|5|54|-|turquoise}}
+<!--Norse-Waterberry-->
+{{chart league|1|53|/|gold}}
+{{chart league|1|54|\|gold}}
+{{chart league|1|55|/|gold}}
+{{chart league|1|56|\|gold}}
+<!--Waterberry-Boyle-->
+{{chart league|1|57|/|gray}}
+{{chart league|1|58|\|gray}}
+{{chart league|2|59|\|gray}}
+<!--Boyle-Flow-->
+{{chart league|3|60|-|orange}}
+{{chart league|5|60|\|orange}}
+{{chart league|6|61|-|orange}}
+<!--Endurance-Nu-->
+{{chart league solid|7|54|-|green}}
+{{chart league solid|9|54|-|green}}
+{{chart league solid|11|53|/|green}}
+<!--Nu-Oseberg-->
+{{chart league solid|6|54|/|gray}}
+{{chart league solid|6|55|\|gray}}
+{{chart league solid|7|56|\|gray}}
+{{chart league solid|8|57|\|gray}}
+<!--Oseberg-Flow-->
+{{chart league|8|58|/|orange}}
+{{chart league|8|59|\|orange}}
+{{chart league|8|60|/|orange}}
+</div>
+<small>Standalone points mark extinct routes</small>
+
+[[Category:Maps|Midnight Ocean]]
+[[Category:Midnight Ocean maps|*]]
diff --git a/yarrg/yppedia-chart-parser b/yarrg/yppedia-chart-parser
new file mode 100755 (executable)
index 0000000..1a90e84
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+use strict (qw(vars));
+use warnings;
+
+use Graph::Undirected;
+
+my $dists= Graph::Undirected->new();
+my $archs= Graph::Undirected->new();
+my @arch_labels;
+my %islandname;
+
+open PO, ">/dev/null" or die $!;
+
+sub nn_xy ($$) { return "n$_[0]x$_[1]"; }
+
+sub parse_yppedia_map () {
+    # We don't even bother with tag soup; instead we do line-oriented parsing.
+
+    while (<>) {
+       s/\<--.*--\>//g;
+       s/^\s*//; chomp; s/\s+$//; s/\s+/ /g;
+       s/\<\/?(?:b|em)\>//g;
+       s/\{\{Chart\ style\|[^{}]*\}\}//g;
+       next unless m/\{\{/; # only interested in chart template stuff
+
+       my ($x,$y, $arch,$island,$solid,$dirn);
+       my $nn= sub { return nn_xy($x,$y) };
+    
+       if (($x,$y,$arch) =
+           m/^\{\{ chart\ label \|(\d+)\|(\d+)\| .*
+                   \'\[\[ [^][\']* \| (\S+)\ archipelago \]\]\'*\}\}$/xi) {
+           printf PO "%d,%d arch %s\n", $x,$y,$arch;
+           push @arch_labels, [ $x,$y,$arch ];
+       } elsif (($x,$y,$island) =
+           m/^\{\{ chart\ island\ icon \|(\d+)\|(\d+)\|
+                   (\S.*\S) \| .*\}\}$/xi) {
+           $islandname{$nn->()}= $island;
+           $dists->add_vertex($nn->());
+           $archs->add_vertex($nn->());
+           printf PO "%d,%d island %s\n", $x,$y,$island;
+       } elsif (($solid,$x,$y,$dirn) =
+           m/^\{\{ chart\ league((?:\ solid)?) \|(\d+)\|(\d+)\|
+                   ([-\/\\o]) \| .*\}\}$/xi) {
+           next if $dirn eq 'o';
+
+           my ($bx,$by) = ($x,$y);
+           if ($dirn eq '-') { $bx+=2; }
+           elsif ($dirn eq '\\') { $bx++; $by++; }
+           elsif ($dirn eq '/') { $bx--; $by++; }
+           else { die; }
+
+           $dists->add_edge($nn->(), nn_xy($bx,$by));
+           $archs->add_edge($nn->(), nn_xy($bx,$by)) if $solid;
+
+           printf PO "%d,%d league %s %s \n", $x,$y,
+               $solid?'solid':'dotted', $dirn;
+       } elsif (
+           m/^\{\{ chart\ head \}\}$/xi
+                ) {
+           next;
+       } else {
+           warn "line $.: ignoring incomprehensible: $_\n";
+       }
+    }
+}
+
+parse_yppedia_map();