From 9178cdf3ce316d90614ba952c1878e317b810369 Mon Sep 17 00:00:00 2001 From: Taka Date: Wed, 13 Feb 2019 12:30:33 +0000 Subject: [PATCH] Updated the Chapter H placeholder files. --- chapter-h/chapter-h-placeholders.zip | Bin 144204 -> 160792 bytes .../tools/make_chapter_h_placeholders.py | 138 ++++++++-- .../tests/fixtures/chapter-h-placeholders.txt | 248 +++++++++++++----- 3 files changed, 301 insertions(+), 85 deletions(-) diff --git a/chapter-h/chapter-h-placeholders.zip b/chapter-h/chapter-h-placeholders.zip index c4b5034c6f307239d3523cc38aad335c45091f67..9fc92b9ed901f3ac030c377e43c16b0212677f24 100644 GIT binary patch literal 160792 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" ), - re.compile( r"^([A-Za-z])$" ), -] - -def load_vo_data( fname ): +def load_vo_data( fname, nat ): """Load a vehicle/ordnance data file.""" # initialize @@ -110,19 +125,94 @@ def load_vo_data( fname ): # load the file vo_data = json.load( open( fname, "r" ) ) for vo_entry in vo_data: + if "note_number" in vo_entry: + notes.add( + _extract_note_number( vo_entry["note_number"] ) + ) + if "notes" in vo_entry and not _ignore_ma_notes(nat): + ma_notes.update( + _extract_ma_note_ids( vo_entry["notes"] ) + ) - # load the vehicle/ordnance's note number - mo = re.search( r"^\d+", vo_entry["note_number"] ) - notes.add( int( mo.group() ) ) + return sorted(notes), sorted(ma_notes) - # load the multi-applicable note ID's - for ma_note in vo_entry.get("notes",[]): - matches = [ regex.search(ma_note) for regex in MA_NOTE_REGEXES ] - matches = [ mo.group(1) for mo in matches if mo ] - assert len(matches) == 1 - ma_notes.add( matches[0] ) +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return sorted(notes), sorted(ma_notes) +def load_vo_data_from_extension( fname ): + """Load a vehicle/ordnance extension data file.""" + + # initialize + results = {} + + # get the extension ID + data = json.load( open( fname, "r" ) ) + extn_id = data["extensionId"] + + # load the file + for nat in data: + + if not isinstance( data[nat], dict ): + continue + + results[nat] = {} + for vo_type in ("vehicles","ordnance"): + notes, ma_notes = set(), set() + for vo_entry in data[nat].get(vo_type,[]): + # load the vehicle/ordnance's note number + if "note_number" in vo_entry: + notes.add( + _extract_note_number( vo_entry["note_number"] ) + ) + if "notes" in vo_entry and not _ignore_ma_notes(nat,extn_id): + ma_notes.update( + _extract_ma_note_ids( vo_entry["notes"] ) + ) + results[ nat ][ vo_type ] = { + "notes": [ "{}:{}".format( extn_id, n ) for n in sorted(notes) ], + "ma_notes": [ "{}:{}".format( extn_id, n ) for n in sorted(ma_notes) ] + } + + return results + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +MA_NOTE_REGEXES = [ + re.compile( r"^([A-Z]{1,2})$" ), + re.compile( r"^([A-Z]{1,2})\u2020" ), + re.compile( r"^([a-z])$" ), + re.compile( r"^([a-z])\u2020" ), + re.compile( r"^([A-Z][a-z])$" ), + re.compile( r"^([A-Za-z])" ), + re.compile( r"^([A-Za-z])$" ), +] + +REDIRECTED_MA_NOTE_REGEX = re.compile( + r"^((Ge|Ru|US|Br|Fr|Jp|Ch|Gr|AllM|AxM) ([A-Z]{1,2}|[0-9]{1,2}|Note \d+|P))\u2020?(\d)?$" +) + +def _extract_note_number( val ): + """Extract a vehicle/ordnance's note number.""" + mo = re.search( r"^\d+", val ) + return int( mo.group() ) + +def _extract_ma_note_ids( val ): + """Extract a vehicle/ordnance's multi-applicable note ID's.""" + ma_note_ids = [] + for ma_note in val: + if REDIRECTED_MA_NOTE_REGEX.search( ma_note ): + continue + matches = [ regex.search(ma_note) for regex in MA_NOTE_REGEXES ] + matches = [ mo.group(1) for mo in matches if mo ] + assert len(matches) == 1 + ma_note_ids.append( matches[0] ) + return ma_note_ids + +def _ignore_ma_notes( nat, extn_id=None ): + if extn_id == "adf" and nat == "american": + return True + if extn_id is None and nationalities.get( nat, {} ).get( "type" ) in ("allied-minor","axis-minor"): + return True + return False # --------------------------------------------------------------------- diff --git a/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt b/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt index 7ef6611..db73a66 100644 --- a/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt +++ b/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt @@ -63,6 +63,7 @@ american/ordnance/7.png american/ordnance/8.png american/ordnance/9.png american/ordnance/a.html +american/ordnance/adf/1.png american/ordnance/b.html american/ordnance/c.html american/ordnance/d.html @@ -130,10 +131,34 @@ american/vehicles/8.png american/vehicles/9.png american/vehicles/a.html american/vehicles/aa.html +american/vehicles/adf/1.png +american/vehicles/adf/10.png +american/vehicles/adf/11.png +american/vehicles/adf/2.png +american/vehicles/adf/3.png +american/vehicles/adf/4.png +american/vehicles/adf/5.png +american/vehicles/adf/6.png +american/vehicles/adf/7.png +american/vehicles/adf/8.png +american/vehicles/adf/9.png american/vehicles/b.html american/vehicles/bb.html american/vehicles/c.html american/vehicles/cc.html +american/vehicles/cobra/12.png +american/vehicles/cobra/13.png +american/vehicles/cobra/15.png +american/vehicles/cobra/16.png +american/vehicles/cobra/17.png +american/vehicles/cobra/23.png +american/vehicles/cobra/43.png +american/vehicles/cobra/5.png +american/vehicles/cobra/8.png +american/vehicles/cobra/9.png +american/vehicles/cobra/a.html +american/vehicles/cobra/b.html +american/vehicles/cobra/c.html american/vehicles/d.html american/vehicles/e.html american/vehicles/f.html @@ -156,6 +181,10 @@ american/vehicles/w.html american/vehicles/x.html american/vehicles/y.html american/vehicles/z.html +anzac/vehicles/adf/1.png +anzac/vehicles/adf/2.png +anzac/vehicles/adf/3.png +anzac/vehicles/adf/4.png axis-minor/ordnance/44.png axis-minor/ordnance/45.png axis-minor/ordnance/46.png @@ -246,16 +275,11 @@ belgian/ordnance/6.png belgian/ordnance/7.png belgian/ordnance/8.png belgian/ordnance/9.png -belgian/ordnance/a.html -belgian/ordnance/b.html -belgian/ordnance/d.html belgian/vehicles/14.png belgian/vehicles/15.png belgian/vehicles/16.png belgian/vehicles/17.png belgian/vehicles/18.png -belgian/vehicles/a.html -belgian/vehicles/q.html british/ordnance/1.png british/ordnance/10.png british/ordnance/11.png @@ -407,9 +431,6 @@ bulgarian/ordnance/40.png bulgarian/ordnance/41.png bulgarian/ordnance/42.png bulgarian/ordnance/43.png -bulgarian/ordnance/a.html -bulgarian/ordnance/g.html -bulgarian/ordnance/t.html bulgarian/vehicles/28.png chinese/ordnance/1.png chinese/ordnance/10.png @@ -452,6 +473,19 @@ chinese/vehicles/7.png chinese/vehicles/8.png chinese/vehicles/9.png chinese/vehicles/a.html +chinese/vehicles/adf/1.png +chinese/vehicles/adf/2.png +chinese/vehicles/adf/3.png +chinese/vehicles/adf/4.png +chinese/vehicles/adf/5.png +chinese/vehicles/adf/6.png +chinese/vehicles/adf/7.png +chinese/vehicles/adf/8.png +chinese/vehicles/adf/9.png +chinese/vehicles/adf/a.html +chinese/vehicles/adf/b.html +chinese/vehicles/adf/c.html +chinese/vehicles/adf/d.html chinese/vehicles/b.html chinese/vehicles/c.html chinese/vehicles/d.html @@ -461,28 +495,31 @@ chinese/vehicles/g.html chinese/vehicles/h.html croatian/ordnance/35.png croatian/ordnance/36.png -croatian/ordnance/a.html croatian/vehicles/24.png croatian/vehicles/25.png croatian/vehicles/26.png croatian/vehicles/27.png -croatian/vehicles/f.html -croatian/vehicles/o.html danish/ordnance/19.png -danish/ordnance/de.html -danish/ordnance/t.html danish/vehicles/24.png dutch/ordnance/15.png -dutch/ordnance/a.html -dutch/ordnance/ne.html +dutch/ordnance/adf/1.png +dutch/ordnance/adf/2.png +dutch/ordnance/adf/3.png +dutch/ordnance/adf/4.png +dutch/ordnance/adf/6.png dutch/vehicles/25.png dutch/vehicles/26.png dutch/vehicles/27.png dutch/vehicles/28.png dutch/vehicles/29.png dutch/vehicles/30.png -dutch/vehicles/a.html -dutch/vehicles/v.html +dutch/vehicles/adf/1.png +dutch/vehicles/adf/2.png +dutch/vehicles/adf/3.png +dutch/vehicles/adf/4.png +dutch/vehicles/adf/5.png +dutch/vehicles/adf/6.png +dutch/vehicles/adf/a.html finnish/ordnance/1.png finnish/ordnance/10.png finnish/ordnance/11.png @@ -680,6 +717,10 @@ german/ordnance/c.html german/ordnance/n.html german/ordnance/o.html german/ordnance/p.html +german/ordnance/pif/1.png +german/ordnance/pif/2.png +german/ordnance/pif/3.png +german/ordnance/pif/4.png german/vehicles/1.png german/vehicles/10.png german/vehicles/11.png @@ -801,20 +842,26 @@ german/vehicles/m.html german/vehicles/n.html german/vehicles/o.html german/vehicles/p.html +german/vehicles/pif/1.png +german/vehicles/pif/2.png +german/vehicles/pif/3.png +german/vehicles/pif/4.png +german/vehicles/pif/5.png +german/vehicles/pif/6.png +german/vehicles/pif/7.png +german/vehicles/pif/a.html +german/vehicles/pif/b.html german/vehicles/q.html german/vehicles/r.html german/vehicles/s.html greek/ordnance/16.png greek/ordnance/17.png greek/ordnance/18.png -greek/ordnance/gr.html hungarian/ordnance/23.png hungarian/ordnance/24.png hungarian/ordnance/25.png hungarian/ordnance/26.png hungarian/ordnance/27.png -hungarian/ordnance/a.html -hungarian/ordnance/g.html hungarian/vehicles/10.png hungarian/vehicles/11.png hungarian/vehicles/12.png @@ -825,11 +872,29 @@ hungarian/vehicles/16.png hungarian/vehicles/7.png hungarian/vehicles/8.png hungarian/vehicles/9.png -hungarian/vehicles/a.html -hungarian/vehicles/e.html -hungarian/vehicles/n.html -hungarian/vehicles/p.html -hungarian/vehicles/q.html +indonesian/ordnance/adf/1.png +indonesian/ordnance/adf/2.png +indonesian/ordnance/adf/3.png +indonesian/ordnance/adf/4.png +indonesian/ordnance/adf/5.png +indonesian/ordnance/adf/6.png +indonesian/vehicles/adf/1.png +indonesian/vehicles/adf/10.png +indonesian/vehicles/adf/11.png +indonesian/vehicles/adf/12.png +indonesian/vehicles/adf/13.png +indonesian/vehicles/adf/2.png +indonesian/vehicles/adf/3.png +indonesian/vehicles/adf/4.png +indonesian/vehicles/adf/5.png +indonesian/vehicles/adf/6.png +indonesian/vehicles/adf/7.png +indonesian/vehicles/adf/8.png +indonesian/vehicles/adf/9.png +indonesian/vehicles/adf/b.html +indonesian/vehicles/adf/c.html +indonesian/vehicles/adf/d.html +indonesian/vehicles/adf/e.html italian/ordnance/1.png italian/ordnance/10.png italian/ordnance/11.png @@ -926,6 +991,10 @@ japanese/ordnance/7.png japanese/ordnance/8.png japanese/ordnance/9.png japanese/ordnance/a.html +japanese/ordnance/adf/1.png +japanese/ordnance/adf/2.png +japanese/ordnance/adf/3.png +japanese/ordnance/adf/4.png japanese/ordnance/b.html japanese/ordnance/c.html japanese/ordnance/d.html @@ -950,6 +1019,34 @@ japanese/vehicles/7.png japanese/vehicles/8.png japanese/vehicles/9.png japanese/vehicles/a.html +japanese/vehicles/adf/1.png +japanese/vehicles/adf/10.png +japanese/vehicles/adf/11.png +japanese/vehicles/adf/12.png +japanese/vehicles/adf/13.png +japanese/vehicles/adf/14.png +japanese/vehicles/adf/15.png +japanese/vehicles/adf/16.png +japanese/vehicles/adf/17.png +japanese/vehicles/adf/18.png +japanese/vehicles/adf/19.png +japanese/vehicles/adf/2.png +japanese/vehicles/adf/20.png +japanese/vehicles/adf/21.png +japanese/vehicles/adf/22.png +japanese/vehicles/adf/23.png +japanese/vehicles/adf/24.png +japanese/vehicles/adf/25.png +japanese/vehicles/adf/3.png +japanese/vehicles/adf/4.png +japanese/vehicles/adf/5.png +japanese/vehicles/adf/6.png +japanese/vehicles/adf/7.png +japanese/vehicles/adf/8.png +japanese/vehicles/adf/9.png +japanese/vehicles/adf/a.html +japanese/vehicles/adf/b.html +japanese/vehicles/adf/c.html japanese/vehicles/b.html japanese/vehicles/c.html landing-craft/1.png @@ -972,8 +1069,18 @@ polish/ordnance/2.png polish/ordnance/3.png polish/ordnance/4.png polish/ordnance/5.png -polish/ordnance/a.html -polish/ordnance/p.html +polish/ordnance/pif/1.png +polish/ordnance/pif/10.png +polish/ordnance/pif/2.png +polish/ordnance/pif/3.png +polish/ordnance/pif/4.png +polish/ordnance/pif/5.png +polish/ordnance/pif/6.png +polish/ordnance/pif/7.png +polish/ordnance/pif/8.png +polish/ordnance/pif/9.png +polish/ordnance/pif/a.html +polish/ordnance/pif/b.html polish/vehicles/1.png polish/vehicles/10.png polish/vehicles/11.png @@ -987,14 +1094,22 @@ polish/vehicles/6.png polish/vehicles/7.png polish/vehicles/8.png polish/vehicles/9.png -polish/vehicles/a.html -polish/vehicles/aa.html -polish/vehicles/d.html -polish/vehicles/e.html -polish/vehicles/f.html -polish/vehicles/g.html -polish/vehicles/k.html -polish/vehicles/q.html +polish/vehicles/pif/1.png +polish/vehicles/pif/10.png +polish/vehicles/pif/11.png +polish/vehicles/pif/12.png +polish/vehicles/pif/2.png +polish/vehicles/pif/3.png +polish/vehicles/pif/4.png +polish/vehicles/pif/5.png +polish/vehicles/pif/6.png +polish/vehicles/pif/7.png +polish/vehicles/pif/8.png +polish/vehicles/pif/9.png +polish/vehicles/pif/a.html +polish/vehicles/pif/b.html +polish/vehicles/pif/c.html +polish/vehicles/pif/d.html romanian/ordnance/1.png romanian/ordnance/10.png romanian/ordnance/11.png @@ -1017,21 +1132,12 @@ romanian/ordnance/6.png romanian/ordnance/7.png romanian/ordnance/8.png romanian/ordnance/9.png -romanian/ordnance/a.html -romanian/ordnance/e.html -romanian/ordnance/k.html romanian/vehicles/1.png romanian/vehicles/2.png romanian/vehicles/3.png romanian/vehicles/4.png romanian/vehicles/5.png romanian/vehicles/6.png -romanian/vehicles/d.html -romanian/vehicles/e.html -romanian/vehicles/f.html -romanian/vehicles/i.html -romanian/vehicles/j.html -romanian/vehicles/n.html russian/ordnance/1.png russian/ordnance/10.png russian/ordnance/11.png @@ -1060,6 +1166,11 @@ russian/ordnance/7.png russian/ordnance/8.png russian/ordnance/9.png russian/ordnance/a.html +russian/ordnance/pif/1.png +russian/ordnance/pif/2.png +russian/ordnance/pif/3.png +russian/ordnance/pif/a.html +russian/ordnance/pif/b.html russian/vehicles/1.png russian/vehicles/10.png russian/vehicles/11.png @@ -1132,6 +1243,26 @@ russian/vehicles/m.html russian/vehicles/n.html russian/vehicles/o.html russian/vehicles/p.html +russian/vehicles/pif/1.png +russian/vehicles/pif/10.png +russian/vehicles/pif/11.png +russian/vehicles/pif/12.png +russian/vehicles/pif/13.png +russian/vehicles/pif/14.png +russian/vehicles/pif/15.png +russian/vehicles/pif/16.png +russian/vehicles/pif/17.png +russian/vehicles/pif/18.png +russian/vehicles/pif/2.png +russian/vehicles/pif/3.png +russian/vehicles/pif/4.png +russian/vehicles/pif/5.png +russian/vehicles/pif/6.png +russian/vehicles/pif/7.png +russian/vehicles/pif/8.png +russian/vehicles/pif/9.png +russian/vehicles/pif/b.html +russian/vehicles/pif/c.html russian/vehicles/q.html russian/vehicles/r.html russian/vehicles/s.html @@ -1143,8 +1274,6 @@ slovakian/ordnance/31.png slovakian/ordnance/32.png slovakian/ordnance/33.png slovakian/ordnance/34.png -slovakian/ordnance/a.html -slovakian/ordnance/e.html slovakian/vehicles/17.png slovakian/vehicles/18.png slovakian/vehicles/19.png @@ -1152,26 +1281,23 @@ slovakian/vehicles/20.png slovakian/vehicles/21.png slovakian/vehicles/22.png slovakian/vehicles/23.png -slovakian/vehicles/e.html -slovakian/vehicles/f.html -slovakian/vehicles/g.html -slovakian/vehicles/i.html -slovakian/vehicles/k.html -slovakian/vehicles/l.html +thai/ordnance/adf/4.png +thai/ordnance/adf/5.png +thai/ordnance/adf/8.png +thai/ordnance/adf/9.png +thai/vehicles/adf/1.png +thai/vehicles/adf/2.png +thai/vehicles/adf/3.png +thai/vehicles/adf/4.png +thai/vehicles/adf/5.png +thai/vehicles/adf/6.png +thai/vehicles/adf/a.html +thai/vehicles/adf/e.html yugoslavian/ordnance/20.png yugoslavian/ordnance/21.png yugoslavian/ordnance/22.png -yugoslavian/ordnance/y.html yugoslavian/vehicles/19.png yugoslavian/vehicles/20.png yugoslavian/vehicles/21.png yugoslavian/vehicles/22.png yugoslavian/vehicles/23.png -yugoslavian/vehicles/a.html -yugoslavian/vehicles/aa.html -yugoslavian/vehicles/b.html -yugoslavian/vehicles/c.html -yugoslavian/vehicles/d.html -yugoslavian/vehicles/g.html -yugoslavian/vehicles/h.html -yugoslavian/vehicles/l.html