diff --git a/vasl_templates/webapp/data/ordnance/american.json b/vasl_templates/webapp/data/ordnance/american.json
new file mode 100644
index 0000000..0859ddc
--- /dev/null
+++ b/vasl_templates/webapp/data/ordnance/american.json
@@ -0,0 +1,159 @@
+[
+
+{ "name": "M2 60mm Mortar",
+ "capabilities": [ "IR" ],
+ "capabilities2": { "WP": [ [7,5] ] },
+ "capabilities_other": [ "5PP", "OBA\u2020" ],
+ "note_number": "1\u2020",
+ "notes": [ "F", "N" ]
+},
+{ "name": "M19 60mm Mortar",
+ "capabilities": [ "IR" ],
+ "capabilities2": { "WP": [ [6,5] ] },
+ "capabilities_other": [ "4PP" ],
+ "note_number": "2",
+ "notes": [ "F" ]
+},
+{ "name": "M1 81mm Mortar",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "WP": 8 },
+ "note_number": "3",
+ "notes": [ "F", "N" ]
+},
+{ "name": "M2 4.2-in. Mortar",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "WP": 10 },
+ "note_number": "4\u2020"
+},
+{ "name": "T25 155mm Mortar",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "WP": 8 },
+ "note_number": "5\u2020",
+ "notes": [ "P" ]
+},
+{ "name": "M3A1 37mm AT Gun",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "C": [ [7,"A2+"], "\u20201" ] },
+ "note_number": "6\u2020",
+ "notes": [ "C\u20201", "N" ]
+},
+{ "name": "M1 57mm AT Gun",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "HE": [ [7,"J4E"], [7,5], "\u2020" ], "D": [ [4,"J4+E"], "\u2020" ] },
+ "note_number": "7\u2020"
+},
+{ "name": "M5 3-in. AT Gun",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "A": [ [4,4], [5,5], "\u2020" ], "s": [ [6,5] ] },
+ "note_number": "8\u2020",
+ "notes": [ "P" ]
+},
+{ "name": "T32 37mm Manpack Gun",
+ "capabilities": [ "5PP (3PP dm)\u2020", "C5\u20201", "crewed\u20202" ],
+ "note_number": "9\u2020",
+ "notes": [ "C\u20201", "D\u20202", "F" ]
+},
+{ "name": "M18 57mm Recoilless Rifle",
+ "capabilities": [ "3PP", "crewed\u20201" ],
+ "capabilities2": { "H": 7, "WP": 6 },
+ "note_number": "10",
+ "notes": [ "D\u20201", "E\u2020" ]
+},
+{ "name": "M20 75mm Recoilless Rifle",
+ "capabilities": [ "5PP", "crewed\u20201" ],
+ "capabilities2": { "H": 7, "WP": 7 },
+ "note_number": "11",
+ "notes": [ "D\u20201", "E\u2020" ]
+},
+{ "name": "M1A1 75mm Pack Howitzer",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "H": 7, "WP": 8, "C": [ [4,"4+"], "\u20201" ] },
+ "note_number": "12\u2020",
+ "notes": [ "C\u20201", "F" ]
+},
+{ "name": "M1897A2 75mm Gun",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "WP": 8 },
+ "note_number": "13",
+ "notes": [ "P" ]
+},
+{ "name": "M2A1 105mm Howitzer",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "H": 6, "s": 7, "WP": 8, "C": [ [7,"4+P"], "\u20201" ] },
+ "note_number": "14\u2020",
+ "notes": [ "C\u20201", "N" ]
+},
+{ "name": "M3 105mm Howitzer",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "H": 7, "s": 7, "WP": 8, "C": [ [7,"P"], "\u20201" ] },
+ "note_number": "15\u2020",
+ "notes": [ "C\u20201" ]
+},
+{ "name": "M1 4.5-in. Gun",
+ "capabilities": [ "NT" ],
+ "note_number": "16\u2020",
+ "notes": [ "P" ]
+},
+{ "name": "M1918 155mm Howitzer",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "s": [ [7,"3+"] ], "WP": 8 },
+ "note_number": "17\u2020",
+ "notes": [ "N" ]
+},
+{ "name": "M1 155mm Howitzer",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "s": 7, "WP": 8 },
+ "note_number": "18\u2020",
+ "notes": [ "N" ]
+},
+{ "name": "M1918M1 155mm Gun",
+ "capabilities": [ "NT", "RFNM", "AP4\u20201", "no IF" ],
+ "capabilities2": { "WP": 8 },
+ "note_number": "19\u2020",
+ "notes": [ "A\u20201", "N" ]
+},
+{ "name": "M1A1 155mm Gun",
+ "capabilities": [ "NT", "RFNM", "AP4\u20201", "no IF" ],
+ "capabilities2": { "s": [ [7,5] ], "WP": 8 },
+ "note_number": "20\u2020",
+ "notes": [ "A\u20201" ]
+},
+{ "name": "M1 8-in. Howitzer",
+ "capabilities": [ "NT", "RFNM", "no IF" ],
+ "note_number": "21\u2020"
+},
+{ "name": "M51 Multiple .50-cal MG Carriage",
+ "capabilities": [ "T" ],
+ "capabilities2": { "LF": [ "2 ROF", "20 IFE", "B11" ] },
+ "capabilities_other": [ "4 TK DR\u2020" ],
+ "note_number": "22\u2020"
+},
+{ "name": "M1A2 37mm AA Gun",
+ "capabilities": [ "T" ],
+ "note_number": "23\u2020",
+ "notes": [ "N" ]
+},
+{ "name": "M1 40mm AA Gun",
+ "capabilities": [ "T" ],
+ "capabilities2": { "LF": [ "40\u20201", "2 ROF" ] },
+ "note_number": "24\u2020",
+ "notes": [ "B\u20201" ]
+},
+{ "name": "M3 3-in. AA Gun",
+ "capabilities": [ "T", "NM" ],
+ "note_number": "25",
+ "notes": [ "P" ]
+},
+{ "name": "M1A1 90mm AA Gun",
+ "capabilities": [ "T", "NM" ],
+ "note_number": "26\u2020",
+ "notes": [ "N" ]
+},
+{ "name": "M2 90mm AA Gun",
+ "capabilities": [ "T" ],
+ "capabilities2": { "LF": [ "90\u2020", "1 ROF", "B11" ] },
+ "note_number": "27\u20201",
+ "notes": [ "B\u2020" ]
+}
+
+]
diff --git a/vasl_templates/webapp/data/vehicles/american.json b/vasl_templates/webapp/data/vehicles/american.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/vasl_templates/webapp/data/vehicles/american.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/vasl_templates/webapp/static/snippets.js b/vasl_templates/webapp/static/snippets.js
index 8dcb97d..25f0ab4 100644
--- a/vasl_templates/webapp/static/snippets.js
+++ b/vasl_templates/webapp/static/snippets.js
@@ -277,7 +277,7 @@ function make_capabilities( entry, scenario_year, scenario_month, check_date_cap
capabilities.push( "LF [" + entry.capabilities2[key].join(", ") + "]" ) ;
continue ;
}
- if ( $.inArray( key, ["HE","A","D","sD","sN","WP"] ) === -1 ) {
+ if ( $.inArray( key, ["HE","AP","A","D","C","s","sD","sN","WP"] ) === -1 ) {
unexpected_caps.push( key ) ;
continue ;
}
@@ -337,25 +337,38 @@ function make_raw_capability( name, capability )
// generate the raw capability string
var buf = [ name ] ;
for ( var i=0 ; i < capability.length ; ++i ) {
- buf.push( escapeHTML( capability[i][0] ) ) ;
- if ( capability[i][1] )
- buf.push( "", escapeHTML( capability[i][1] ), "" ) ;
+ if ( typeof(capability[i]) === "string" )
+ buf.push( capability[i] ) ;
+ else {
+ buf.push( escapeHTML( capability[i][0] ) ) ;
+ if ( capability[i][1] )
+ buf.push( "", escapeHTML( capability[i][1] ), "" ) ;
+ }
}
return buf.join( "" ) ;
}
function select_capability_by_date( capabilities, scenario_year, scenario_month )
{
- var MONTH_NAMES = { F: 2, J: 6, } ;
+ var MONTH_NAMES = { F:2, J:6, A:8 } ;
var val = null ;
+ var ref = has_ref( capabilities ) ;
for ( var i=0 ; i < capabilities.length ; ++i ) {
- if ( capabilities[i] == "\u2020" )
- continue ;
- // remove any trailing "+" (why is it even there?)
+
+ // check for a ETO/PTO-only flag
var cap = capabilities[i][1].toString() ;
+ if ( cap.substring( cap.length-1 ) === "E" )
+ cap = cap.substring( 0, cap.length-1 ) ; // FIXME! handle this properly
+ if ( cap.substring( cap.length-1 ) === "P" )
+ cap = cap.substring( 0, cap.length-1 ) ; // FIXME! handle this properly
+ // remove any trailing "+" (FIXME! What does it even mean? Doesn't make sense :-/)
if ( cap.substring( cap.length-1 ) == "+" )
cap = cap.substring( 0, cap.length-1 ) ;
+ if ( ! cap ) {
+ val = capabilities[i][0] ; // nb: the capability is always available
+ break ;
+ }
// parse the month/year the capability becomes available
var month = MONTH_NAMES[ cap.substring(0,1) ] ;
if ( month )
@@ -371,7 +384,19 @@ function select_capability_by_date( capabilities, scenario_year, scenario_month
val = capabilities[i][0] ;
}
}
- return val ;
+ if ( ! val )
+ return val ;
+ return ref ? val+ref : val ;
+}
+
+function has_ref( val )
+{
+ var last = val[ val.length-1 ] ;
+ if ( typeof(last) === "string" && last.match( /^\u2020(\d<\/sup>)?$/ ) ) {
+ val.pop() ;
+ return last ;
+ }
+ return null ;
}
function make_crew_survival( entry )
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1940.txt
new file mode 100644
index 0000000..1262bb3
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1940.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1940 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt
new file mode 100644
index 0000000..91f0bf0
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1941 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt
new file mode 100644
index 0000000..20b9809
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1942 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt
new file mode 100644
index 0000000..2339ad4
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1943 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt
new file mode 100644
index 0000000..1a1c778
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1944 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU A4† 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU C4†[1] H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT C7†[1] H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt
new file mode 100644
index 0000000..e55a5e0
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt
@@ -0,0 +1,31 @@
+=== ordnance/american/1945 ===
+
+Name Capabilities (effective) # Notes
+-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
+M2 60mm Mortar IR WP7[5] 5PP OBA† IR WP7 5PP OBA† 1† F N
+M19 60mm Mortar IR WP6[5] 4PP IR WP6 4PP 2 F
+M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
+M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
+T25 155mm Mortar NT WP8 NT WP8 5† P
+M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†1 N
+M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU D4† HE7† 7† n/a
+M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU A5† s6 8† P
+T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†1 D†2 F
+M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†1 E†
+M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†1 E†
+M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU C4†[1] H7 WP8 12† C†1 F
+M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
+M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT C7†[1] H6 WP8 s7 14† C†1 N
+M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT C7†[1] H7 WP8 s7 15† C†1
+M1 4.5-in. Gun NT NT 16† P
+M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
+M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
+M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†1 N
+M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 s7 20† A†1
+M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
+M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
+M1A2 37mm AA Gun T T 23† N
+M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†1
+M3 3-in. AA Gun T NM T NM 25 P
+M1A1 90mm AA Gun T NM T NM 26† N
+M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt
new file mode 100644
index 0000000..690401e
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1940 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt
new file mode 100644
index 0000000..6ca2d18
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1941 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt
new file mode 100644
index 0000000..d1a72d9
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1942 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt
new file mode 100644
index 0000000..72b3de7
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1943 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt
new file mode 100644
index 0000000..debcef1
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1944 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt
new file mode 100644
index 0000000..037f64e
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt
@@ -0,0 +1,4 @@
+=== vehicles/american/1945 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------ ------- ---- --------------- -------------- ------------- --- -------
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
index 8002a72..1945211 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1944.txt
@@ -83,7 +83,7 @@ Sherman III(L)(a) n/a yes CS 6 (brew up) WP7 s5 s
Matilda II(b) n/a yes CS 5 sD6 sD6 51† M†1 N LL
Valentine V(b) n/a yes CS 4 sM8 sM8 52.1 N LL
Valentine VIII(b) n/a yes CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a yes CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† HE8 sD6 sM8† 53† N LL
+Churchill III(b) n/a yes CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† HE8† sD6 sM8† 53† N LL
M3A1 Scout Car(a) n/a yes CS 4 n/a n/a 54† N LL
Jeep GPA(a) n/a yes cs 2 n/a n/a 59 H† L†1
DUKW(a) n/a yes cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
index 95b2f4a..b55abf9 100644
--- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/russian/1945.txt
@@ -1,89 +1,89 @@
=== vehicles/russian/1945 ===
-Name Radio IF Crew survival Capabilities (effective) # Notes
------------------ ------- ---- ------------------------------------ -------------------------------------- --------------- ----- ---------------------
-T-37 ® yes CS 2 n/a n/a 1 H† M
-T-27 ® yes CS 2 n/a n/a 1.1† M Q
-T-40 ® yes CS 2 n/a n/a 2† H†
-T-50 ® yes CS 4 A4[2] A4 3 n/a
-T-60 M40 ® yes CS 2 n/a n/a 4 n/a
-T-60 M42 ®† yes CS 2 n/a n/a 4 C†
-T-70 ®† yes CS 2 A4[2] A4 5 C†
-T-26 M33 ® yes CS 3 n/a n/a 6 D I† M P
-T-26 M37/39 ® yes CS 3 n/a n/a 6 D M P
-T-26 M31 ® yes CS 3 n/a n/a 6.1† M P
-T-26 M32 ® yes CS 3 n/a n/a 6.2† M P
-OT-26 ® yes CS 3 (brew up) n/a n/a 6.3† M P
-ST-26 Bridgelayer n/a yes CS 3 n/a n/a 6.4† M
-OT-133 ® yes CS 3 n/a n/a 7† M P
-BT-2A ® yes CS 3 n/a n/a 7.1† M
-BT-5 M34 ® yes CS 3 n/a n/a 8† M P
-BT-7 M37 ® yes CS 3 n/a n/a 9 D I† M P
-BT-7A n/a yes CS 3 AP7 s9 AP7 s9 10 M P
-T-28 M34 ® yes CS 5 s8 s8 11† M
-T-28 M34(L) ® yes CS 5 s8 s8 11.1† M
-T-28E M40 ® yes CS 6 s8 s8 12† M
-T-28E M40(L) ® yes CS 6 s8 s8 12.1† M
-T-34 M40 ® yes CS 5 n/a n/a 13 M
-T-34 M41 ®† yes CS 5 A4[2] A4 14† C† M
-OT-34 ®† n/a CS 4 A2[2] AP7 A2 AP7 15† C† M
-T-34 M43 n/a yes CS 5 A4[2] A4 16† n/a
-T-43 ®† yes CS 5 A4[2] A4 17 C† M
-T-34/85 n/a yes CS 6 A5[4] sD6† A5 sD6† 18† J†
-M4/76(a) n/a yes CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
-T-44 n/a yes CS 5 A6[5] A6 20 B† M
-T-35 ® yes CS 8 s9 s9 21† M
-SMK n/a yes CS 7 n/a n/a 21.1 M T†
-T-100 n/a yes CS 7 n/a n/a 22.1 M T†
-KV-1 M39/40 n/a yes CS 6 n/a n/a 22† M
-KV-1E n/a yes CS 6 n/a n/a 23 D M
-KV-1 M41 n/a yes CS 6 A4[2] A4 23 D M
-KV-1 M42 n/a yes CS 6 A4[2] A4 23 D M
-KV-2 n/a n/a CS 7 AP9 AP9 24† M
-KV-8 n/a yes CS 6 A4[2] AP7 A4 AP7 15† D M
-KV-1S n/a yes CS 6 A4[2] A4 25† n/a
-KV-85 n/a yes CS 5 A4[3]5[4] A5 26 B†
-IS-2 n/a n/a CS 6 n/a n/a 27 B†
-IS-2m n/a n/a CS 6 n/a n/a 28 B† G†
-IS-3 n/a n/a CS 6 sD6† sD6† 29 G† J†
-SU-76M n/a yes CS 4 (brew up) A5[3] A5 30† n/a
-SU-76i(g) n/a yes CS 5 A5[3] A5 31 K
-SU-122 n/a n/a CS 5 H9 s8 H9 s8 32 n/a
-SU-152 n/a n/a CS 6 n/a n/a 33† n/a
-ISU-122 n/a n/a CS 6 s8 s8 34 G†
-ISU-152 n/a n/a CS 6 n/a n/a 34 G†
-SU-85 n/a yes CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
-SU-100 n/a yes CS 5 HE7 HE7 36 n/a
-SU-57(a) n/a yes CS 4 A5[3] HE7 A5 HE7 37 K
-BA-20 ® yes CS 3 n/a n/a 38 n/a
-BA-6 ® yes CS 4 A4[2] A4 39 n/a
-BA-64B n/a yes CS 2 n/a n/a 40† A†
-ZSU-37 n/a yes CS 4 n/a n/a 41† A†
-SU-12 n/a yes CS 4 AP7 s8 AP7 s8 42 F†
-GAZ-4M-AA n/a yes CS 4 n/a n/a 43† A†
-ZIS-42-AA n/a yes CS 4 n/a n/a 44 A† F†
-LANO AT ® yes CS 5 A4[2+] A4 44.1 n/a
-LANO AA ® yes CS 5 n/a n/a 44.2† A†1
-IAG-10-AA n/a yes CS 4 AP7 AP7 45 A† F†
-GAZ-67B n/a yes CS 2 n/a n/a 46 L†
-Komsomolet n/a yes CS 2† n/a n/a 46.1† n/a
-STZ-3 n/a yes cs 4 n/a n/a 46.2 n/a
-STZ-5 n/a yes cs 7 n/a n/a 46.3 n/a
-GAZ-MM n/a yes cs 6 n/a n/a 47 n/a
-ZIS-5 n/a yes cs 7 n/a n/a 47 n/a
-IAG-6 n/a yes cs 7 n/a n/a 47 n/a
-NKL-6 n/a yes CS 2† n/a n/a 47.1† S†1
-NKL-16 n/a yes cs 2 n/a n/a 47.1† S†1
-NKL-26 n/a yes CS 2 n/a n/a 47.2† Q S†1
-RF-8-GAZ-98 n/a yes CS 3 n/a n/a 47.3† S†1
-Stuart III(a) n/a yes CS 4 C6 C6 48 N O LL
-Lee(a) n/a yes CS 7 C4† s8† C4† s8† 49† B†1 N O LL
-Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]† s8 WP6 s8 50† N O R†1 LL
-Sherman III(L)(a) n/a yes CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
-Matilda II(b) n/a yes CS 5 sD6 sD6 51† M†1 N LL
-Valentine V(b) n/a yes CS 4 sM8 sM8 52.1 N LL
-Valentine VIII(b) n/a yes CS 4 HE7 sD6 HE7 sD6 52.2 N LL
-Churchill III(b) n/a yes CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† D7 HE8 sD6 sM8† 53† N LL
-M3A1 Scout Car(a) n/a yes CS 4 n/a n/a 54† N LL
-Jeep GPA(a) n/a yes cs 2 n/a n/a 59 H† L†1
-DUKW(a) n/a yes cs 7 n/a n/a 60† n/a
+Name Radio IF Crew survival Capabilities (effective) # Notes
+----------------- ------- ---- ------------------------------------ -------------------------------------- ----------------- ----- ---------------------
+T-37 ® yes CS 2 n/a n/a 1 H† M
+T-27 ® yes CS 2 n/a n/a 1.1† M Q
+T-40 ® yes CS 2 n/a n/a 2† H†
+T-50 ® yes CS 4 A4[2] A4 3 n/a
+T-60 M40 ® yes CS 2 n/a n/a 4 n/a
+T-60 M42 ®† yes CS 2 n/a n/a 4 C†
+T-70 ®† yes CS 2 A4[2] A4 5 C†
+T-26 M33 ® yes CS 3 n/a n/a 6 D I† M P
+T-26 M37/39 ® yes CS 3 n/a n/a 6 D M P
+T-26 M31 ® yes CS 3 n/a n/a 6.1† M P
+T-26 M32 ® yes CS 3 n/a n/a 6.2† M P
+OT-26 ® yes CS 3 (brew up) n/a n/a 6.3† M P
+ST-26 Bridgelayer n/a yes CS 3 n/a n/a 6.4† M
+OT-133 ® yes CS 3 n/a n/a 7† M P
+BT-2A ® yes CS 3 n/a n/a 7.1† M
+BT-5 M34 ® yes CS 3 n/a n/a 8† M P
+BT-7 M37 ® yes CS 3 n/a n/a 9 D I† M P
+BT-7A n/a yes CS 3 AP7 s9 AP7 s9 10 M P
+T-28 M34 ® yes CS 5 s8 s8 11† M
+T-28 M34(L) ® yes CS 5 s8 s8 11.1† M
+T-28E M40 ® yes CS 6 s8 s8 12† M
+T-28E M40(L) ® yes CS 6 s8 s8 12.1† M
+T-34 M40 ® yes CS 5 n/a n/a 13 M
+T-34 M41 ®† yes CS 5 A4[2] A4 14† C† M
+OT-34 ®† n/a CS 4 A2[2] AP7 A2 AP7 15† C† M
+T-34 M43 n/a yes CS 5 A4[2] A4 16† n/a
+T-43 ®† yes CS 5 A4[2] A4 17 C† M
+T-34/85 n/a yes CS 6 A5[4] sD6† A5 sD6† 18† J†
+M4/76(a) n/a yes CS 6 A3[4] s8 sM8 A3 s8 sM8 19† N
+T-44 n/a yes CS 5 A6[5] A6 20 B† M
+T-35 ® yes CS 8 s9 s9 21† M
+SMK n/a yes CS 7 n/a n/a 21.1 M T†
+T-100 n/a yes CS 7 n/a n/a 22.1 M T†
+KV-1 M39/40 n/a yes CS 6 n/a n/a 22† M
+KV-1E n/a yes CS 6 n/a n/a 23 D M
+KV-1 M41 n/a yes CS 6 A4[2] A4 23 D M
+KV-1 M42 n/a yes CS 6 A4[2] A4 23 D M
+KV-2 n/a n/a CS 7 AP9 AP9 24† M
+KV-8 n/a yes CS 6 A4[2] AP7 A4 AP7 15† D M
+KV-1S n/a yes CS 6 A4[2] A4 25† n/a
+KV-85 n/a yes CS 5 A4[3]5[4] A5 26 B†
+IS-2 n/a n/a CS 6 n/a n/a 27 B†
+IS-2m n/a n/a CS 6 n/a n/a 28 B† G†
+IS-3 n/a n/a CS 6 sD6† sD6† 29 G† J†
+SU-76M n/a yes CS 4 (brew up) A5[3] A5 30† n/a
+SU-76i(g) n/a yes CS 5 A5[3] A5 31 K
+SU-122 n/a n/a CS 5 H9 s8 H9 s8 32 n/a
+SU-152 n/a n/a CS 6 n/a n/a 33† n/a
+ISU-122 n/a n/a CS 6 s8 s8 34 G†
+ISU-152 n/a n/a CS 6 n/a n/a 34 G†
+SU-85 n/a yes CS 5 A5[3] HE7 s7 A5 HE7 s7 35 n/a
+SU-100 n/a yes CS 5 HE7 HE7 36 n/a
+SU-57(a) n/a yes CS 4 A5[3] HE7 A5 HE7 37 K
+BA-20 ® yes CS 3 n/a n/a 38 n/a
+BA-6 ® yes CS 4 A4[2] A4 39 n/a
+BA-64B n/a yes CS 2 n/a n/a 40† A†
+ZSU-37 n/a yes CS 4 n/a n/a 41† A†
+SU-12 n/a yes CS 4 AP7 s8 AP7 s8 42 F†
+GAZ-4M-AA n/a yes CS 4 n/a n/a 43† A†
+ZIS-42-AA n/a yes CS 4 n/a n/a 44 A† F†
+LANO AT ® yes CS 5 A4[2+] A4 44.1 n/a
+LANO AA ® yes CS 5 n/a n/a 44.2† A†1
+IAG-10-AA n/a yes CS 4 AP7 AP7 45 A† F†
+GAZ-67B n/a yes CS 2 n/a n/a 46 L†
+Komsomolet n/a yes CS 2† n/a n/a 46.1† n/a
+STZ-3 n/a yes cs 4 n/a n/a 46.2 n/a
+STZ-5 n/a yes cs 7 n/a n/a 46.3 n/a
+GAZ-MM n/a yes cs 6 n/a n/a 47 n/a
+ZIS-5 n/a yes cs 7 n/a n/a 47 n/a
+IAG-6 n/a yes cs 7 n/a n/a 47 n/a
+NKL-6 n/a yes CS 2† n/a n/a 47.1† S†1
+NKL-16 n/a yes cs 2 n/a n/a 47.1† S†1
+NKL-26 n/a yes CS 2 n/a n/a 47.2† Q S†1
+RF-8-GAZ-98 n/a yes CS 3 n/a n/a 47.3† S†1
+Stuart III(a) n/a yes CS 4 C6 C6 48 N O LL
+Lee(a) n/a yes CS 7 C4† s8† C4† s8† 49† B†1 N O LL
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]† s8 WP6† s8 50† N O R†1 LL
+Sherman III(L)(a) n/a yes CS 6 (brew up) WP7 s5 sM8 WP7 s5 sM8 50.1 N O R† LL
+Matilda II(b) n/a yes CS 5 sD6 sD6 51† M†1 N LL
+Valentine V(b) n/a yes CS 4 sM8 sM8 52.1 N LL
+Valentine VIII(b) n/a yes CS 4 HE7 sD6 HE7 sD6 52.2 N LL
+Churchill III(b) n/a yes CS 7 D6[J4]7[5]† HE7[F3]8[4+]† sD6[4+] sM8† D7† HE8† sD6 sM8† 53† N LL
+M3A1 Scout Car(a) n/a yes CS 4 n/a n/a 54† N LL
+Jeep GPA(a) n/a yes cs 2 n/a n/a 59 H† L†1
+DUKW(a) n/a yes cs 7 n/a n/a 60† n/a
diff --git a/vasl_templates/webapp/tests/test_vo_reports.py b/vasl_templates/webapp/tests/test_vo_reports.py
index ffeba74..0e0ccda 100644
--- a/vasl_templates/webapp/tests/test_vo_reports.py
+++ b/vasl_templates/webapp/tests/test_vo_reports.py
@@ -26,8 +26,18 @@ def test_vo_reports( webapp, webdriver ):
if save_dir and os.path.isdir(save_dir):
shutil.rmtree( save_dir )
+ def fixup_capabilities( col, caption ):
+ """Convert capability HTML to something a bit more readable."""
+ assert results[0][col] == caption
+ for i in range(1,len(results)):
+ results[i][col] = re.sub(
+ r"(.*?)",
+ lambda mo: "[{}]".format( mo.group(1) ),
+ results[i][col]
+ )
+
# check each vehicle/ordnance report
- for nat in ["german","russian"]:
+ for nat in ["german","russian","american"]:
for vo_type in ["vehicles","ordnance"]:
for year in range(1940,1945+1):
@@ -43,13 +53,9 @@ def test_vo_reports( webapp, webdriver ):
results[0].insert( len(results[0])-2, "(effective)" )
# fix up date-based capabilities
- assert results[0][-4] == "Capabilities"
- for i in range(1,len(results)):
- results[i][-4] = re.sub(
- r"(.*?)",
- lambda mo: "[{}]".format( mo.group(1) ),
- results[i][-4]
- )
+ fixup_capabilities( -4, "Capabilities" )
+ fixup_capabilities( -3, "(effective)" )
+ fixup_capabilities( -2, "#" )
# output the report
print( "=== {}/{}/{} ===".format( vo_type, nat, year ), file=buf )