play-parser 1.2.1__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. {play_parser-1.2.1/src/play_parser.egg-info → play_parser-1.2.2}/PKG-INFO +1 -1
  2. {play_parser-1.2.1 → play_parser-1.2.2}/pyproject.toml +1 -1
  3. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/context.py +8 -7
  4. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/parser.py +3 -3
  5. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profile_detection.py +61 -4
  6. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/speech.py +7 -0
  7. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/stage.py +15 -0
  8. {play_parser-1.2.1 → play_parser-1.2.2/src/play_parser.egg-info}/PKG-INFO +1 -1
  9. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/SOURCES.txt +1 -17
  10. play_parser-1.2.2/tests/test_corpus_optimal_json.py +21 -0
  11. play_parser-1.2.1/tests/play_document_comparison.py +0 -41
  12. play_parser-1.2.1/tests/test_cli.py +0 -188
  13. play_parser-1.2.1/tests/test_corpus_inventory.py +0 -19
  14. play_parser-1.2.1/tests/test_corpus_optimal_json.py +0 -61
  15. play_parser-1.2.1/tests/test_document_roundtrip.py +0 -78
  16. play_parser-1.2.1/tests/test_domain.py +0 -109
  17. play_parser-1.2.1/tests/test_fsm_corpus_optimal_json.py +0 -61
  18. play_parser-1.2.1/tests/test_fsm_scoring.py +0 -45
  19. play_parser-1.2.1/tests/test_ingestor.py +0 -96
  20. play_parser-1.2.1/tests/test_json_schema.py +0 -53
  21. play_parser-1.2.1/tests/test_parser_core.py +0 -534
  22. play_parser-1.2.1/tests/test_parser_factory.py +0 -100
  23. play_parser-1.2.1/tests/test_profile_detection.py +0 -75
  24. play_parser-1.2.1/tests/test_profiles.py +0 -168
  25. play_parser-1.2.1/tests/test_public_api.py +0 -38
  26. play_parser-1.2.1/tests/test_validation_strict_types.py +0 -184
  27. play_parser-1.2.1/tests/test_viterbi_decoder.py +0 -49
  28. {play_parser-1.2.1 → play_parser-1.2.2}/CHANGELOG.md +0 -0
  29. {play_parser-1.2.1 → play_parser-1.2.2}/LICENSE +0 -0
  30. {play_parser-1.2.1 → play_parser-1.2.2}/MANIFEST.in +0 -0
  31. {play_parser-1.2.1 → play_parser-1.2.2}/README.md +0 -0
  32. {play_parser-1.2.1 → play_parser-1.2.2}/RELEASE.md +0 -0
  33. {play_parser-1.2.1 → play_parser-1.2.2}/SECURITY.md +0 -0
  34. {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/01_modern_two_hander_preamble_separator.txt +0 -0
  35. {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/hints.json +0 -0
  36. {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/optimal.json +0 -0
  37. {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/02_modern_three_characters_no_separator.txt +0 -0
  38. {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/hints.json +0 -0
  39. {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/optimal.json +0 -0
  40. {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/03_colon_format_one_scene.txt +0 -0
  41. {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/hints.json +0 -0
  42. {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/optimal.json +0 -0
  43. {play_parser-1.2.1 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/04_speaker_colon_multiscene.txt +0 -0
  44. {play_parser-1.2.1 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/optimal.json +0 -0
  45. {play_parser-1.2.1 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/05_shakespeare_line_speakers.txt +0 -0
  46. {play_parser-1.2.1 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/optimal.json +0 -0
  47. {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/06_inline_stage_directions.txt +0 -0
  48. {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/hints.json +0 -0
  49. {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/optimal.json +0 -0
  50. {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/07_long_preamble_cast_setting_notes.txt +0 -0
  51. {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/hints.json +0 -0
  52. {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/optimal.json +0 -0
  53. {play_parser-1.2.1 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/08_no_preamble_immediate_dialogue.txt +0 -0
  54. {play_parser-1.2.1 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/optimal.json +0 -0
  55. {play_parser-1.2.1 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/09_title_author_then_scene_no_act.txt +0 -0
  56. {play_parser-1.2.1 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/optimal.json +0 -0
  57. {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/100_formal_three_hander.txt +0 -0
  58. {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/hints.json +0 -0
  59. {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/optimal.json +0 -0
  60. {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/101_lift_lobby_sluglines.txt +0 -0
  61. {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/hints.json +0 -0
  62. {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/optimal.json +0 -0
  63. {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/102_weather_frequency.txt +0 -0
  64. {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/hints.json +0 -0
  65. {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/optimal.json +0 -0
  66. {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/103_the_spare_key_catalogue.txt +0 -0
  67. {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/hints.json +0 -0
  68. {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/optimal.json +0 -0
  69. {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/104_initials_at_tea.txt +0 -0
  70. {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/hints.json +0 -0
  71. {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/optimal.json +0 -0
  72. {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/105_a_door_answers.txt +0 -0
  73. {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/hints.json +0 -0
  74. {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/optimal.json +0 -0
  75. {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/106_small_applause.txt +0 -0
  76. {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/hints.json +0 -0
  77. {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/optimal.json +0 -0
  78. {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/107_chair_ballet.txt +0 -0
  79. {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/hints.json +0 -0
  80. {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/optimal.json +0 -0
  81. {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/108_scene_is_not_a_scene.txt +0 -0
  82. {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/hints.json +0 -0
  83. {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/optimal.json +0 -0
  84. {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/109_lower_roman.txt +0 -0
  85. {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/hints.json +0 -0
  86. {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/optimal.json +0 -0
  87. {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/10_simple_spare_key_scene.txt +0 -0
  88. {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/hints.json +0 -0
  89. {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/optimal.json +0 -0
  90. {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/110_inbox_play.txt +0 -0
  91. {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/hints.json +0 -0
  92. {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/optimal.json +0 -0
  93. {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/111_hyphenated_night.txt +0 -0
  94. {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/hints.json +0 -0
  95. {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/optimal.json +0 -0
  96. {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/113_numbered_witnesses.txt +0 -0
  97. {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/hints.json +0 -0
  98. {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/optimal.json +0 -0
  99. {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/114_the_group_chat.txt +0 -0
  100. {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/hints.json +0 -0
  101. {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/optimal.json +0 -0
  102. {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/115_four_line_oath.txt +0 -0
  103. {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/hints.json +0 -0
  104. {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/optimal.json +0 -0
  105. {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/116_after_the_bell.txt +0 -0
  106. {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/hints.json +0 -0
  107. {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/optimal.json +0 -0
  108. {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/117_italic_corridor.txt +0 -0
  109. {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/hints.json +0 -0
  110. {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/optimal.json +0 -0
  111. {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/118_third_act_weather.txt +0 -0
  112. {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/hints.json +0 -0
  113. {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/optimal.json +0 -0
  114. {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/119_pause_audit.txt +0 -0
  115. {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/hints.json +0 -0
  116. {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/optimal.json +0 -0
  117. {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/11_malformed_joined_speaker_pdf_artifact.txt +0 -0
  118. {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/hints.json +0 -0
  119. {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/optimal.json +0 -0
  120. {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/120_colon_trouble.txt +0 -0
  121. {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/hints.json +0 -0
  122. {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/optimal.json +0 -0
  123. {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/121_semicolon_cast.txt +0 -0
  124. {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/hints.json +0 -0
  125. {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/optimal.json +0 -0
  126. {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/122_square_cue.txt +0 -0
  127. {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/hints.json +0 -0
  128. {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/optimal.json +0 -0
  129. {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/123_page_header_fog.txt +0 -0
  130. {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/hints.json +0 -0
  131. {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/optimal.json +0 -0
  132. {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/124_lowercase_lobby.txt +0 -0
  133. {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/hints.json +0 -0
  134. {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/optimal.json +0 -0
  135. {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/125_parenthesis_room.txt +0 -0
  136. {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/hints.json +0 -0
  137. {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/optimal.json +0 -0
  138. {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/126_mixed_marks.txt +0 -0
  139. {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/hints.json +0 -0
  140. {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/optimal.json +0 -0
  141. {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/127_the_word_act.txt +0 -0
  142. {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/hints.json +0 -0
  143. {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/optimal.json +0 -0
  144. {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/128_broken_column.txt +0 -0
  145. {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/hints.json +0 -0
  146. {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/optimal.json +0 -0
  147. {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/129_prologue_with_receipts.txt +0 -0
  148. {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/hints.json +0 -0
  149. {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/optimal.json +0 -0
  150. {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/12_many_characters_short_lines.txt +0 -0
  151. {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/hints.json +0 -0
  152. {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/optimal.json +0 -0
  153. {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/131_screenplay_character_blocks_1.txt +0 -0
  154. {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/hints.json +0 -0
  155. {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/optimal.json +0 -0
  156. {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/132_screenplay_character_blocks_2.txt +0 -0
  157. {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/hints.json +0 -0
  158. {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/optimal.json +0 -0
  159. {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/133_screenplay_parenthetical_cues_1.txt +0 -0
  160. {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/hints.json +0 -0
  161. {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/optimal.json +0 -0
  162. {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/134_screenplay_parenthetical_cues_2.txt +0 -0
  163. {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/hints.json +0 -0
  164. {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/optimal.json +0 -0
  165. {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/135_fixed_width_dialogue_1.txt +0 -0
  166. {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/hints.json +0 -0
  167. {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/optimal.json +0 -0
  168. {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/136_fixed_width_dialogue_2.txt +0 -0
  169. {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/hints.json +0 -0
  170. {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/optimal.json +0 -0
  171. {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/137_tabular_dialogue_1.txt +0 -0
  172. {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/hints.json +0 -0
  173. {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/optimal.json +0 -0
  174. {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/138_tabular_dialogue_2.txt +0 -0
  175. {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/hints.json +0 -0
  176. {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/optimal.json +0 -0
  177. {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/139_hyphen_dialogue_1.txt +0 -0
  178. {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/hints.json +0 -0
  179. {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/optimal.json +0 -0
  180. {play_parser-1.2.1 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/13_character_names_with_spaces_colon.txt +0 -0
  181. {play_parser-1.2.1 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/optimal.json +0 -0
  182. {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/140_hyphen_dialogue_2.txt +0 -0
  183. {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/hints.json +0 -0
  184. {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/optimal.json +0 -0
  185. {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/141_emdash_dialogue_1.txt +0 -0
  186. {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/hints.json +0 -0
  187. {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/optimal.json +0 -0
  188. {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/142_emdash_dialogue_2.txt +0 -0
  189. {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/hints.json +0 -0
  190. {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/optimal.json +0 -0
  191. {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/143_abbreviated_dot_speakers_1.txt +0 -0
  192. {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/hints.json +0 -0
  193. {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/optimal.json +0 -0
  194. {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/144_abbreviated_dot_speakers_2.txt +0 -0
  195. {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/hints.json +0 -0
  196. {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/optimal.json +0 -0
  197. {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/149_alias_cast_dialogue_1.txt +0 -0
  198. {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/hints.json +0 -0
  199. {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/optimal.json +0 -0
  200. {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/14_character_block_with_colons_and_descriptions.txt +0 -0
  201. {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/hints.json +0 -0
  202. {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/optimal.json +0 -0
  203. {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/150_alias_cast_dialogue_2.txt +0 -0
  204. {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/hints.json +0 -0
  205. {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/optimal.json +0 -0
  206. {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/151_page_header_inside_speech_1.txt +0 -0
  207. {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/hints.json +0 -0
  208. {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/optimal.json +0 -0
  209. {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/152_page_header_inside_speech_2.txt +0 -0
  210. {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/hints.json +0 -0
  211. {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/optimal.json +0 -0
  212. {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/153_verse_indented_continuation_1.txt +0 -0
  213. {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/hints.json +0 -0
  214. {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/optimal.json +0 -0
  215. {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/154_verse_indented_continuation_2.txt +0 -0
  216. {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/hints.json +0 -0
  217. {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/optimal.json +0 -0
  218. {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/155_unbracketed_stage_prose_1.txt +0 -0
  219. {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/hints.json +0 -0
  220. {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/optimal.json +0 -0
  221. {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/156_unbracketed_stage_prose_2.txt +0 -0
  222. {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/hints.json +0 -0
  223. {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/optimal.json +0 -0
  224. {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/157_dual_dialogue_same_line_1.txt +0 -0
  225. {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/hints.json +0 -0
  226. {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/optimal.json +0 -0
  227. {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/158_dual_dialogue_same_line_2.txt +0 -0
  228. {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/hints.json +0 -0
  229. {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/optimal.json +0 -0
  230. {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/159_cue_before_colon_1.txt +0 -0
  231. {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/hints.json +0 -0
  232. {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/optimal.json +0 -0
  233. {play_parser-1.2.1 → play_parser-1.2.2}/data/15_multiple_acts_modern/15_multiple_acts_modern.txt +0 -0
  234. {play_parser-1.2.1 → play_parser-1.2.2}/data/15_multiple_acts_modern/optimal.json +0 -0
  235. {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/160_cue_before_colon_2.txt +0 -0
  236. {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/hints.json +0 -0
  237. {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/optimal.json +0 -0
  238. {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/161_scene_title_false_speaker_1.txt +0 -0
  239. {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/hints.json +0 -0
  240. {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/optimal.json +0 -0
  241. {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/162_scene_title_false_speaker_2.txt +0 -0
  242. {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/hints.json +0 -0
  243. {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/optimal.json +0 -0
  244. {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/163_chat_timestamp_dialogue_1.txt +0 -0
  245. {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/hints.json +0 -0
  246. {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/optimal.json +0 -0
  247. {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/164_chat_timestamp_dialogue_2.txt +0 -0
  248. {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/hints.json +0 -0
  249. {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/optimal.json +0 -0
  250. {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/165_line_numbered_dialogue_1.txt +0 -0
  251. {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/hints.json +0 -0
  252. {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/optimal.json +0 -0
  253. {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/166_line_numbered_dialogue_2.txt +0 -0
  254. {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/hints.json +0 -0
  255. {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/optimal.json +0 -0
  256. {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/167_pdf_hyphenated_wrap_1.txt +0 -0
  257. {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/hints.json +0 -0
  258. {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/optimal.json +0 -0
  259. {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/168_pdf_hyphenated_wrap_2.txt +0 -0
  260. {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/hints.json +0 -0
  261. {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/optimal.json +0 -0
  262. {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/169_diacritic_apostrophe_speakers_1.txt +0 -0
  263. {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/hints.json +0 -0
  264. {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/optimal.json +0 -0
  265. {play_parser-1.2.1 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/16_stage_directions_square_brackets.txt +0 -0
  266. {play_parser-1.2.1 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/optimal.json +0 -0
  267. {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/170_diacritic_apostrophe_speakers_2.txt +0 -0
  268. {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/hints.json +0 -0
  269. {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/optimal.json +0 -0
  270. {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/171_numbered_scene_titles_1.txt +0 -0
  271. {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/hints.json +0 -0
  272. {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/optimal.json +0 -0
  273. {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/172_numbered_scene_titles_2.txt +0 -0
  274. {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/hints.json +0 -0
  275. {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/optimal.json +0 -0
  276. {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/173_scene_colon_label_1.txt +0 -0
  277. {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/hints.json +0 -0
  278. {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/optimal.json +0 -0
  279. {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/174_scene_colon_label_2.txt +0 -0
  280. {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/hints.json +0 -0
  281. {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/optimal.json +0 -0
  282. {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/175_single_letter_speakers_1.txt +0 -0
  283. {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/hints.json +0 -0
  284. {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/optimal.json +0 -0
  285. {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/176_single_letter_speakers_2.txt +0 -0
  286. {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/hints.json +0 -0
  287. {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/optimal.json +0 -0
  288. {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/177_music_lyrics_cues_1.txt +0 -0
  289. {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/hints.json +0 -0
  290. {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/optimal.json +0 -0
  291. {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/178_music_lyrics_cues_2.txt +0 -0
  292. {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/hints.json +0 -0
  293. {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/optimal.json +0 -0
  294. {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/179_speaker_then_blank_then_text_1.txt +0 -0
  295. {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/hints.json +0 -0
  296. {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/optimal.json +0 -0
  297. {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/17_screenplayish_format.txt +0 -0
  298. {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/hints.json +0 -0
  299. {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/optimal.json +0 -0
  300. {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/180_speaker_then_blank_then_text_2.txt +0 -0
  301. {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/hints.json +0 -0
  302. {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/optimal.json +0 -0
  303. {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/181_ocr_spaced_speaker_labels_1.txt +0 -0
  304. {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/hints.json +0 -0
  305. {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/optimal.json +0 -0
  306. {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/182_ocr_spaced_speaker_labels_2.txt +0 -0
  307. {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/hints.json +0 -0
  308. {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/optimal.json +0 -0
  309. {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/183_ocr_digit_letter_confusion_1.txt +0 -0
  310. {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/hints.json +0 -0
  311. {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/optimal.json +0 -0
  312. {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/184_ocr_digit_letter_confusion_2.txt +0 -0
  313. {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/hints.json +0 -0
  314. {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/optimal.json +0 -0
  315. {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/185_ocr_broken_word_continuation_1.txt +0 -0
  316. {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/hints.json +0 -0
  317. {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/optimal.json +0 -0
  318. {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/186_ocr_broken_word_continuation_2.txt +0 -0
  319. {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/hints.json +0 -0
  320. {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/optimal.json +0 -0
  321. {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/187_ocr_page_number_in_speech_1.txt +0 -0
  322. {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/hints.json +0 -0
  323. {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/optimal.json +0 -0
  324. {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/188_ocr_page_number_in_speech_2.txt +0 -0
  325. {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/hints.json +0 -0
  326. {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/optimal.json +0 -0
  327. {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/189_ocr_header_footer_intrusion_1.txt +0 -0
  328. {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/hints.json +0 -0
  329. {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/optimal.json +0 -0
  330. {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/18_blank_lines_and_extra_spacing.txt +0 -0
  331. {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/hints.json +0 -0
  332. {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/optimal.json +0 -0
  333. {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/190_ocr_header_footer_intrusion_2.txt +0 -0
  334. {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/hints.json +0 -0
  335. {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/optimal.json +0 -0
  336. {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/191_ocr_ligature_artefacts_1.txt +0 -0
  337. {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/hints.json +0 -0
  338. {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/optimal.json +0 -0
  339. {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/192_ocr_ligature_artefacts_2.txt +0 -0
  340. {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/hints.json +0 -0
  341. {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/optimal.json +0 -0
  342. {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/193_ocr_curly_quote_damage_1.txt +0 -0
  343. {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/hints.json +0 -0
  344. {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/optimal.json +0 -0
  345. {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/194_ocr_curly_quote_damage_2.txt +0 -0
  346. {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/hints.json +0 -0
  347. {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/optimal.json +0 -0
  348. {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/195_ocr_soft_hyphen_artefact_1.txt +0 -0
  349. {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/hints.json +0 -0
  350. {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/optimal.json +0 -0
  351. {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/196_ocr_soft_hyphen_artefact_2.txt +0 -0
  352. {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/hints.json +0 -0
  353. {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/optimal.json +0 -0
  354. {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/197_ocr_broken_speaker_colon_1.txt +0 -0
  355. {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/hints.json +0 -0
  356. {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/optimal.json +0 -0
  357. {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/198_ocr_broken_speaker_colon_2.txt +0 -0
  358. {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/hints.json +0 -0
  359. {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/optimal.json +0 -0
  360. {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/199_ocr_line_wrap_with_indentation_1.txt +0 -0
  361. {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/hints.json +0 -0
  362. {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/optimal.json +0 -0
  363. {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/19_preamble_without_clear_marker.txt +0 -0
  364. {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/hints.json +0 -0
  365. {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/optimal.json +0 -0
  366. {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/200_ocr_line_wrap_with_indentation_2.txt +0 -0
  367. {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/hints.json +0 -0
  368. {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/optimal.json +0 -0
  369. {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/201_cast_list_descriptions_columns_1.txt +0 -0
  370. {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/hints.json +0 -0
  371. {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/optimal.json +0 -0
  372. {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/202_cast_list_descriptions_columns_2.txt +0 -0
  373. {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/hints.json +0 -0
  374. {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/optimal.json +0 -0
  375. {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/203_cast_group_roles_1.txt +0 -0
  376. {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/hints.json +0 -0
  377. {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/optimal.json +0 -0
  378. {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/204_cast_group_roles_2.txt +0 -0
  379. {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/hints.json +0 -0
  380. {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/optimal.json +0 -0
  381. {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/205_cast_alias_roles_1.txt +0 -0
  382. {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/hints.json +0 -0
  383. {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/optimal.json +0 -0
  384. {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/206_cast_alias_roles_2.txt +0 -0
  385. {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/hints.json +0 -0
  386. {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/optimal.json +0 -0
  387. {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/207_cast_no_separator_1.txt +0 -0
  388. {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/hints.json +0 -0
  389. {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/optimal.json +0 -0
  390. {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/208_cast_no_separator_2.txt +0 -0
  391. {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/hints.json +0 -0
  392. {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/optimal.json +0 -0
  393. {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/209_cast_non_speaking_1.txt +0 -0
  394. {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/hints.json +0 -0
  395. {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/optimal.json +0 -0
  396. {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/20_single_character_monologue_with_directions.txt +0 -0
  397. {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/hints.json +0 -0
  398. {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/optimal.json +0 -0
  399. {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/210_cast_non_speaking_2.txt +0 -0
  400. {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/hints.json +0 -0
  401. {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/optimal.json +0 -0
  402. {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/211_classical_abbreviated_sigla_1.txt +0 -0
  403. {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/hints.json +0 -0
  404. {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/optimal.json +0 -0
  405. {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/212_classical_abbreviated_sigla_2.txt +0 -0
  406. {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/hints.json +0 -0
  407. {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/optimal.json +0 -0
  408. {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/213_marginal_speaker_labels_1.txt +0 -0
  409. {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/hints.json +0 -0
  410. {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/optimal.json +0 -0
  411. {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/214_marginal_speaker_labels_2.txt +0 -0
  412. {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/hints.json +0 -0
  413. {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/optimal.json +0 -0
  414. {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/215_numbered_verse_lines_1.txt +0 -0
  415. {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/hints.json +0 -0
  416. {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/optimal.json +0 -0
  417. {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/216_numbered_verse_lines_2.txt +0 -0
  418. {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/hints.json +0 -0
  419. {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/optimal.json +0 -0
  420. {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/217_roman_structure_1.txt +0 -0
  421. {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/hints.json +0 -0
  422. {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/optimal.json +0 -0
  423. {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/218_roman_structure_2.txt +0 -0
  424. {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/hints.json +0 -0
  425. {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/optimal.json +0 -0
  426. {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/219_enter_exit_conventions_1.txt +0 -0
  427. {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/hints.json +0 -0
  428. {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/optimal.json +0 -0
  429. {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/220_enter_exit_conventions_2.txt +0 -0
  430. {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/hints.json +0 -0
  431. {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/optimal.json +0 -0
  432. {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/221_timestamp_inline_dialogue_1.txt +0 -0
  433. {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/hints.json +0 -0
  434. {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/optimal.json +0 -0
  435. {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/222_timestamp_inline_dialogue_2.txt +0 -0
  436. {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/hints.json +0 -0
  437. {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/optimal.json +0 -0
  438. {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/223_bracketed_speaker_subtitles_1.txt +0 -0
  439. {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/hints.json +0 -0
  440. {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/optimal.json +0 -0
  441. {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/224_bracketed_speaker_subtitles_2.txt +0 -0
  442. {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/hints.json +0 -0
  443. {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/optimal.json +0 -0
  444. {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/225_srt_chunks_1.txt +0 -0
  445. {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/hints.json +0 -0
  446. {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/optimal.json +0 -0
  447. {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/226_srt_chunks_2.txt +0 -0
  448. {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/hints.json +0 -0
  449. {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/optimal.json +0 -0
  450. {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/227_webvtt_cues_1.txt +0 -0
  451. {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/hints.json +0 -0
  452. {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/optimal.json +0 -0
  453. {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/228_webvtt_cues_2.txt +0 -0
  454. {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/hints.json +0 -0
  455. {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/optimal.json +0 -0
  456. {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/229_speaker_dash_transcript_1.txt +0 -0
  457. {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/hints.json +0 -0
  458. {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/optimal.json +0 -0
  459. {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/230_speaker_dash_transcript_2.txt +0 -0
  460. {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/hints.json +0 -0
  461. {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/optimal.json +0 -0
  462. {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/231_markdown_bold_speakers_1.txt +0 -0
  463. {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/hints.json +0 -0
  464. {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/optimal.json +0 -0
  465. {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/232_markdown_bold_speakers_2.txt +0 -0
  466. {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/hints.json +0 -0
  467. {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/optimal.json +0 -0
  468. {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/233_markdown_italic_stage_1.txt +0 -0
  469. {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/hints.json +0 -0
  470. {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/optimal.json +0 -0
  471. {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/234_markdown_italic_stage_2.txt +0 -0
  472. {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/hints.json +0 -0
  473. {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/optimal.json +0 -0
  474. {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/235_markdown_blockquote_dialogue_1.txt +0 -0
  475. {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/hints.json +0 -0
  476. {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/optimal.json +0 -0
  477. {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/236_markdown_blockquote_dialogue_2.txt +0 -0
  478. {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/hints.json +0 -0
  479. {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/optimal.json +0 -0
  480. {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/237_html_entities_1.txt +0 -0
  481. {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/hints.json +0 -0
  482. {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/optimal.json +0 -0
  483. {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/238_html_entities_2.txt +0 -0
  484. {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/hints.json +0 -0
  485. {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/optimal.json +0 -0
  486. {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/239_web_footer_copied_1.txt +0 -0
  487. {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/hints.json +0 -0
  488. {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/optimal.json +0 -0
  489. {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/240_web_footer_copied_2.txt +0 -0
  490. {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/hints.json +0 -0
  491. {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/optimal.json +0 -0
  492. {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/60_audition_01_two_person_drama.txt +0 -0
  493. {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/hints.json +0 -0
  494. {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/optimal.json +0 -0
  495. {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/61_audition_02_comedic_monologue.txt +0 -0
  496. {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/hints.json +0 -0
  497. {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/optimal.json +0 -0
  498. {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/62_audition_03_one_person_voice_message.txt +0 -0
  499. {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/hints.json +0 -0
  500. {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/optimal.json +0 -0
  501. {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/63_audition_04_period_scene.txt +0 -0
  502. {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/hints.json +0 -0
  503. {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/optimal.json +0 -0
  504. {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/64_audition_05_sci_fi_interrogation.txt +0 -0
  505. {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/hints.json +0 -0
  506. {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/optimal.json +0 -0
  507. {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/65_audition_06_romantic_comedy.txt +0 -0
  508. {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/hints.json +0 -0
  509. {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/optimal.json +0 -0
  510. {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/66_audition_07_thriller_scene.txt +0 -0
  511. {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/hints.json +0 -0
  512. {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/optimal.json +0 -0
  513. {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/67_audition_08_duologue_family.txt +0 -0
  514. {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/hints.json +0 -0
  515. {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/optimal.json +0 -0
  516. {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/68_audition_09_silent_stage_directions.txt +0 -0
  517. {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/hints.json +0 -0
  518. {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/optimal.json +0 -0
  519. {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/69_audition_10_mockumentary.txt +0 -0
  520. {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/hints.json +0 -0
  521. {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/optimal.json +0 -0
  522. {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/70_audition_11_classical_heightened.txt +0 -0
  523. {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/hints.json +0 -0
  524. {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/optimal.json +0 -0
  525. {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/71_audition_12_police_procedural.txt +0 -0
  526. {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/hints.json +0 -0
  527. {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/optimal.json +0 -0
  528. {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/72_audition_13_child_actor_scene.txt +0 -0
  529. {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/hints.json +0 -0
  530. {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/optimal.json +0 -0
  531. {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/73_audition_14_soap_scene.txt +0 -0
  532. {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/hints.json +0 -0
  533. {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/optimal.json +0 -0
  534. {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/74_audition_15_horror_scene.txt +0 -0
  535. {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/hints.json +0 -0
  536. {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/optimal.json +0 -0
  537. {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/75_audition_16_workplace_scene.txt +0 -0
  538. {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/hints.json +0 -0
  539. {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/optimal.json +0 -0
  540. {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/76_audition_17_legal_scene.txt +0 -0
  541. {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/hints.json +0 -0
  542. {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/optimal.json +0 -0
  543. {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/77_audition_18_fantasy_scene.txt +0 -0
  544. {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/hints.json +0 -0
  545. {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/optimal.json +0 -0
  546. {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/78_audition_19_radio_play.txt +0 -0
  547. {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/hints.json +0 -0
  548. {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/optimal.json +0 -0
  549. {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/79_audition_20_musical_book_scene.txt +0 -0
  550. {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/hints.json +0 -0
  551. {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/optimal.json +0 -0
  552. {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/80_colon_cast_and_scene.txt +0 -0
  553. {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/hints.json +0 -0
  554. {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/optimal.json +0 -0
  555. {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/81_bare_speaker_acts.txt +0 -0
  556. {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/hints.json +0 -0
  557. {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/optimal.json +0 -0
  558. {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/82_dot_inline_comedy.txt +0 -0
  559. {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/hints.json +0 -0
  560. {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/optimal.json +0 -0
  561. {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/83_dot_block_form.txt +0 -0
  562. {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/hints.json +0 -0
  563. {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/optimal.json +0 -0
  564. {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/84_bracket_directions.txt +0 -0
  565. {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/hints.json +0 -0
  566. {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/optimal.json +0 -0
  567. {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/85_monologue_parentheses.txt +0 -0
  568. {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/hints.json +0 -0
  569. {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/optimal.json +0 -0
  570. {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/86_no_dialogue_physical.txt +0 -0
  571. {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/hints.json +0 -0
  572. {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/optimal.json +0 -0
  573. {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/87_modern_act_words.txt +0 -0
  574. {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/hints.json +0 -0
  575. {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/optimal.json +0 -0
  576. {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/88_screenplay_slugline.txt +0 -0
  577. {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/hints.json +0 -0
  578. {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/optimal.json +0 -0
  579. {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/89_radio_sfx.txt +0 -0
  580. {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/hints.json +0 -0
  581. {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/optimal.json +0 -0
  582. {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/90_mixed_inline_stage.txt +0 -0
  583. {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/hints.json +0 -0
  584. {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/optimal.json +0 -0
  585. {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/91_title_author_immediate.txt +0 -0
  586. {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/hints.json +0 -0
  587. {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/optimal.json +0 -0
  588. {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/92_cast_commas.txt +0 -0
  589. {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/hints.json +0 -0
  590. {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/optimal.json +0 -0
  591. {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/93_multiscene_no_acts.txt +0 -0
  592. {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/hints.json +0 -0
  593. {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/optimal.json +0 -0
  594. {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/94_stage_speaker_action.txt +0 -0
  595. {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/hints.json +0 -0
  596. {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/optimal.json +0 -0
  597. {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/95_character_names_spaces.txt +0 -0
  598. {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/hints.json +0 -0
  599. {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/optimal.json +0 -0
  600. {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/96_long_preamble_marker.txt +0 -0
  601. {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/hints.json +0 -0
  602. {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/optimal.json +0 -0
  603. {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/97_single_character_with_end.txt +0 -0
  604. {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/hints.json +0 -0
  605. {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/optimal.json +0 -0
  606. {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/98_colon_scene_false_positive.txt +0 -0
  607. {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/hints.json +0 -0
  608. {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/optimal.json +0 -0
  609. {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/99_dot_signature_not_speaker.txt +0 -0
  610. {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/hints.json +0 -0
  611. {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/optimal.json +0 -0
  612. {play_parser-1.2.1 → play_parser-1.2.2}/data/A Midsummer Night's Dream/A Midsummer Night's Dream.txt +0 -0
  613. {play_parser-1.2.1 → play_parser-1.2.2}/data/A Midsummer Night's Dream/optimal.json +0 -0
  614. {play_parser-1.2.1 → play_parser-1.2.2}/data/All's Well That Ends Well/All's Well That Ends Well.txt +0 -0
  615. {play_parser-1.2.1 → play_parser-1.2.2}/data/All's Well That Ends Well/optimal.json +0 -0
  616. {play_parser-1.2.1 → play_parser-1.2.2}/data/Antony and Cleopatra/Antony and Cleopatra.txt +0 -0
  617. {play_parser-1.2.1 → play_parser-1.2.2}/data/Antony and Cleopatra/optimal.json +0 -0
  618. {play_parser-1.2.1 → play_parser-1.2.2}/data/As You Like It/As You Like It.txt +0 -0
  619. {play_parser-1.2.1 → play_parser-1.2.2}/data/As You Like It/optimal.json +0 -0
  620. {play_parser-1.2.1 → play_parser-1.2.2}/data/CORPUS_FORMATS.md +0 -0
  621. {play_parser-1.2.1 → play_parser-1.2.2}/data/Coriolanus/Coriolanus.txt +0 -0
  622. {play_parser-1.2.1 → play_parser-1.2.2}/data/Coriolanus/optimal.json +0 -0
  623. {play_parser-1.2.1 → play_parser-1.2.2}/data/Cymbeline/Cymbeline.txt +0 -0
  624. {play_parser-1.2.1 → play_parser-1.2.2}/data/Cymbeline/optimal.json +0 -0
  625. {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/Gin vs Whiskey.txt +0 -0
  626. {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/hints.json +0 -0
  627. {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/optimal.json +0 -0
  628. {play_parser-1.2.1 → play_parser-1.2.2}/data/Hamlet/Hamlet.txt +0 -0
  629. {play_parser-1.2.1 → play_parser-1.2.2}/data/Hamlet/optimal.json +0 -0
  630. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 1/Henry IV, Part 1.txt +0 -0
  631. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 1/optimal.json +0 -0
  632. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 2/Henry IV, Part 2.txt +0 -0
  633. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 2/optimal.json +0 -0
  634. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry V/Henry V.txt +0 -0
  635. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry V/optimal.json +0 -0
  636. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 1/Henry VI, Part 1.txt +0 -0
  637. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 1/optimal.json +0 -0
  638. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 2/Henry VI, Part 2.txt +0 -0
  639. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 2/optimal.json +0 -0
  640. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 3/Henry VI, Part 3.txt +0 -0
  641. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 3/optimal.json +0 -0
  642. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VIII/Henry VIII.txt +0 -0
  643. {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VIII/optimal.json +0 -0
  644. {play_parser-1.2.1 → play_parser-1.2.2}/data/Julius Caesar/Julius Caesar.txt +0 -0
  645. {play_parser-1.2.1 → play_parser-1.2.2}/data/Julius Caesar/optimal.json +0 -0
  646. {play_parser-1.2.1 → play_parser-1.2.2}/data/King John/King John.txt +0 -0
  647. {play_parser-1.2.1 → play_parser-1.2.2}/data/King John/optimal.json +0 -0
  648. {play_parser-1.2.1 → play_parser-1.2.2}/data/King Lear/King Lear.txt +0 -0
  649. {play_parser-1.2.1 → play_parser-1.2.2}/data/King Lear/optimal.json +0 -0
  650. {play_parser-1.2.1 → play_parser-1.2.2}/data/Love's Labour's Lost/Love's Labour's Lost.txt +0 -0
  651. {play_parser-1.2.1 → play_parser-1.2.2}/data/Love's Labour's Lost/optimal.json +0 -0
  652. {play_parser-1.2.1 → play_parser-1.2.2}/data/Macbeth/Macbeth.txt +0 -0
  653. {play_parser-1.2.1 → play_parser-1.2.2}/data/Macbeth/optimal.json +0 -0
  654. {play_parser-1.2.1 → play_parser-1.2.2}/data/Measure for Measure/Measure for Measure.txt +0 -0
  655. {play_parser-1.2.1 → play_parser-1.2.2}/data/Measure for Measure/optimal.json +0 -0
  656. {play_parser-1.2.1 → play_parser-1.2.2}/data/Much Ado About Nothing/Much Ado About Nothing.txt +0 -0
  657. {play_parser-1.2.1 → play_parser-1.2.2}/data/Much Ado About Nothing/optimal.json +0 -0
  658. {play_parser-1.2.1 → play_parser-1.2.2}/data/Othello/Othello.txt +0 -0
  659. {play_parser-1.2.1 → play_parser-1.2.2}/data/Othello/optimal.json +0 -0
  660. {play_parser-1.2.1 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/Pericles, Prince of Tyre.txt +0 -0
  661. {play_parser-1.2.1 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/optimal.json +0 -0
  662. {play_parser-1.2.1 → play_parser-1.2.2}/data/README.md +0 -0
  663. {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard II/Richard II.txt +0 -0
  664. {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard II/optimal.json +0 -0
  665. {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard III/Richard III.txt +0 -0
  666. {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard III/optimal.json +0 -0
  667. {play_parser-1.2.1 → play_parser-1.2.2}/data/Romeo and Juliet/Romeo and Juliet.txt +0 -0
  668. {play_parser-1.2.1 → play_parser-1.2.2}/data/Romeo and Juliet/optimal.json +0 -0
  669. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Comedy of Errors/The Comedy of Errors.txt +0 -0
  670. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Comedy of Errors/optimal.json +0 -0
  671. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/The Importance of Being Earnest.txt +0 -0
  672. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/hints.json +0 -0
  673. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/optimal.json +0 -0
  674. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merchant of Venice/The Merchant of Venice.txt +0 -0
  675. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merchant of Venice/optimal.json +0 -0
  676. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merry Wives of Windsor/The Merry Wives of Windsor.txt +0 -0
  677. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merry Wives of Windsor/optimal.json +0 -0
  678. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Taming of the Shrew/The Taming of the Shrew.txt +0 -0
  679. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Taming of the Shrew/optimal.json +0 -0
  680. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Tempest/The Tempest.txt +0 -0
  681. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Tempest/optimal.json +0 -0
  682. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Winter's Tale/The Winter's Tale.txt +0 -0
  683. {play_parser-1.2.1 → play_parser-1.2.2}/data/The Winter's Tale/optimal.json +0 -0
  684. {play_parser-1.2.1 → play_parser-1.2.2}/data/Timon of Athens/Timon of Athens.txt +0 -0
  685. {play_parser-1.2.1 → play_parser-1.2.2}/data/Timon of Athens/optimal.json +0 -0
  686. {play_parser-1.2.1 → play_parser-1.2.2}/data/Titus Andronicus/Titus Andronicus.txt +0 -0
  687. {play_parser-1.2.1 → play_parser-1.2.2}/data/Titus Andronicus/optimal.json +0 -0
  688. {play_parser-1.2.1 → play_parser-1.2.2}/data/Troilus and Cressida/Troilus and Cressida.txt +0 -0
  689. {play_parser-1.2.1 → play_parser-1.2.2}/data/Troilus and Cressida/optimal.json +0 -0
  690. {play_parser-1.2.1 → play_parser-1.2.2}/data/Twelfth Night/Twelfth Night.txt +0 -0
  691. {play_parser-1.2.1 → play_parser-1.2.2}/data/Twelfth Night/optimal.json +0 -0
  692. {play_parser-1.2.1 → play_parser-1.2.2}/data/Two Gentlemen of Verona/Two Gentlemen of Verona.txt +0 -0
  693. {play_parser-1.2.1 → play_parser-1.2.2}/data/Two Gentlemen of Verona/optimal.json +0 -0
  694. {play_parser-1.2.1 → play_parser-1.2.2}/docs/API.md +0 -0
  695. {play_parser-1.2.1 → play_parser-1.2.2}/docs/FORMAT_PROFILES.md +0 -0
  696. {play_parser-1.2.1 → play_parser-1.2.2}/docs/JSON_SCHEMA.md +0 -0
  697. {play_parser-1.2.1 → play_parser-1.2.2}/docs/play_document.schema.json +0 -0
  698. {play_parser-1.2.1 → play_parser-1.2.2}/setup.cfg +0 -0
  699. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/__init__.py +0 -0
  700. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/__main__.py +0 -0
  701. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/_io.py +0 -0
  702. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/cli/__init__.py +0 -0
  703. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/cli/main.py +0 -0
  704. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/__init__.py +0 -0
  705. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/assembler.py +0 -0
  706. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/builder.py +0 -0
  707. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/constants.py +0 -0
  708. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/text.py +0 -0
  709. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/types.py +0 -0
  710. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/validation.py +0 -0
  711. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/domain/__init__.py +0 -0
  712. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/domain/play.py +0 -0
  713. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/ingestion/__init__.py +0 -0
  714. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/ingestion/ingestor.py +0 -0
  715. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsers.py +0 -0
  716. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/__init__.py +0 -0
  717. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/front_matter.py +0 -0
  718. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/fsm.py +0 -0
  719. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/hints.py +0 -0
  720. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/__init__.py +0 -0
  721. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/__init__.py +0 -0
  722. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/colon_inline.json +0 -0
  723. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_block.json +0 -0
  724. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_inline.json +0 -0
  725. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json +0 -0
  726. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json +0 -0
  727. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/loader.py +0 -0
  728. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/schema.py +0 -0
  729. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/speakers.py +0 -0
  730. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/structure.py +0 -0
  731. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/viterbi.py +0 -0
  732. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/py.typed +0 -0
  733. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/dependency_links.txt +0 -0
  734. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/entry_points.txt +0 -0
  735. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/requires.txt +0 -0
  736. {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/top_level.txt +0 -0
  737. {play_parser-1.2.1 → play_parser-1.2.2}/tests/__init__.py +0 -0
  738. {play_parser-1.2.1 → play_parser-1.2.2}/tests/conftest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: play-parser
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Parse dramatic play text into ordered dramatic events.
5
5
  Author-email: Stergios Poularakis <stpoular@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "play-parser"
7
- version = "1.2.1"
7
+ version = "1.2.2"
8
8
  description = "Parse dramatic play text into ordered dramatic events."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING
6
6
  from play_parser.document.text import normalise_whitespace
7
7
  from play_parser.document.types import PlayEvent, StageDirectionEvent
8
8
  from play_parser.parsing.speech import starts_new_speech_at
9
- from play_parser.parsing.stage import is_stage_direction_line
9
+ from play_parser.parsing.stage import is_stage_direction_line, split_unbracketed_stage_prose
10
10
  from play_parser.parsing.structure import is_structural_line
11
11
 
12
12
  if TYPE_CHECKING:
@@ -69,7 +69,7 @@ def consume_unbracketed_stage_paragraph(
69
69
  events: list[PlayEvent],
70
70
  *,
71
71
  profile: FormatProfile | None = None,
72
- ) -> tuple[StageDirectionEvent | None, int]:
72
+ ) -> tuple[list[StageDirectionEvent] | None, int]:
73
73
  """Consume a profile-enabled unbracketed stage paragraph after the body starts."""
74
74
  paragraph_lines: list[str] = []
75
75
  while index < len(lines):
@@ -86,12 +86,13 @@ def consume_unbracketed_stage_paragraph(
86
86
  if not paragraph_lines:
87
87
  return None, index
88
88
 
89
+ subtype = "setting" if should_treat_as_setting(events) else "action"
90
+ paragraph = normalise_whitespace(" ".join(paragraph_lines))
89
91
  return (
90
- StageDirectionEvent(
91
- type="stage_direction",
92
- subtype="setting" if should_treat_as_setting(events) else "action",
93
- text=normalise_whitespace(" ".join(paragraph_lines)),
94
- ),
92
+ [
93
+ StageDirectionEvent(type="stage_direction", subtype=subtype, text=part)
94
+ for part in split_unbracketed_stage_prose(paragraph)
95
+ ],
95
96
  index,
96
97
  )
97
98
 
@@ -641,14 +641,14 @@ def consume_fallback(state: ParserState) -> None:
641
641
  stripped = state.stripped
642
642
  if state.body_started:
643
643
  if profile_allows_long_unbracketed_stage_paragraphs(state.profile):
644
- stage_direction, next_index = consume_unbracketed_stage_paragraph(
644
+ stage_directions, next_index = consume_unbracketed_stage_paragraph(
645
645
  state.lines,
646
646
  state.index,
647
647
  state.events,
648
648
  profile=state.profile,
649
649
  )
650
- if stage_direction is not None:
651
- state.events.append(stage_direction)
650
+ if stage_directions is not None:
651
+ state.events.extend(stage_directions)
652
652
  state.index = next_index
653
653
  return
654
654
 
@@ -12,12 +12,12 @@ from play_parser.parsing.parser import parse_play_text
12
12
  from play_parser.parsing.profiles import get_format_profile
13
13
 
14
14
  CANDIDATE_FORMAT_PROFILES: tuple[str, ...] = (
15
+ "generic",
15
16
  "dot_block",
16
17
  "colon_inline",
17
18
  "dot_inline",
18
19
  "mixed_parenthetical",
19
20
  "narrative_stage_heavy",
20
- "generic",
21
21
  )
22
22
  DEFAULT_SAMPLE_CHARS = 2_000
23
23
  LOW_SCORE = -10_000
@@ -129,6 +129,14 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
129
129
 
130
130
  plausible_speakers = [speaker for speaker in unique_speakers if _is_plausible_speaker_name(speaker)]
131
131
  implausible_speakers = len(unique_speakers) - len(plausible_speakers)
132
+ suspicious_speakers = [speaker for speaker in unique_speakers if _is_suspicious_speaker_name(speaker)]
133
+ one_off_multiword_speakers = [
134
+ speaker
135
+ for speaker in unique_speakers
136
+ if speakers.count(speaker) == 1
137
+ and len(speaker.split()) > 1
138
+ and speaker.casefold() not in {"cast list"}
139
+ ]
132
140
 
133
141
  repeated_speakers = tuple(sorted({speaker for speaker in unique_speakers if speakers.count(speaker) >= 2}))
134
142
 
@@ -153,11 +161,15 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
153
161
  score += 60
154
162
 
155
163
  if len(stage_dirs) > len(speeches) * 0.5:
156
- score -= 120
164
+ score -= 180
165
+ if len(stage_dirs) > len(speeches):
166
+ score -= 240
157
167
  if 0 < alternation_ratio < 0.15 and len(speeches) >= 6:
158
168
  score -= 120
159
169
  score -= int(meta_ratio * 250)
160
170
  score -= implausible_speakers * 120
171
+ score -= len(suspicious_speakers) * 180
172
+ score -= len(one_off_multiword_speakers) * 180
161
173
  score -= int(very_short_ratio * 180)
162
174
  score -= int(very_long_ratio * 220)
163
175
 
@@ -179,10 +191,38 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
179
191
  def _is_plausible_speaker_name(value: str) -> bool:
180
192
  if not value or len(value) > 40:
181
193
  return False
182
- if any(char in value for char in ".?!,:;()[]{}"):
194
+ if any(char in value for char in "?!,:;()[]{}"):
183
195
  return False
184
196
  parts = value.split()
185
- return 1 <= len(parts) <= 4
197
+ if not 1 <= len(parts) <= 4:
198
+ return False
199
+ # Allow title/name abbreviations such as "Ms. Rai" or "Dr. Moreau".
200
+ return all(part.replace(".", "").replace("'", "").replace("-", "").isalpha() for part in parts)
201
+
202
+
203
+ def _is_suspicious_speaker_name(value: str) -> bool:
204
+ lowered = value.casefold()
205
+ if lowered in {
206
+ "a",
207
+ "an",
208
+ "and",
209
+ "but",
210
+ "fine",
211
+ "no",
212
+ "not",
213
+ "now",
214
+ "oh",
215
+ "so",
216
+ "then",
217
+ "well",
218
+ "yes",
219
+ }:
220
+ return True
221
+ words = [word.strip(".") for word in value.split() if word.strip(".")]
222
+ # Parsed speaker names are normalised to title-ish form. Verse fragments
223
+ # promoted by over-eager colon parsing often retain lowercase words, e.g.
224
+ # "My strength can give you" or "Of hostile paces".
225
+ return any(word and word[0].islower() for word in words)
186
226
 
187
227
 
188
228
  def detect_format_profile(
@@ -203,6 +243,19 @@ def detect_format_profile(
203
243
  coerced_hints = _coerce_hints(hints)
204
244
  scores: list[ProfileScore] = []
205
245
 
246
+ if "by William Shakespeare" in sample:
247
+ try:
248
+ events = parse_play_text(sample, profile=None, hints=coerced_hints)
249
+ generic_score = score_profile_events("generic", events)
250
+ except Exception as exc: # pragma: no cover - defensive
251
+ generic_score = score_profile_events("generic", [], error=str(exc))
252
+ return ProfileDetectionResult(
253
+ selected_profile="generic",
254
+ confidence="high",
255
+ sample_chars=len(sample),
256
+ scores=(generic_score,),
257
+ )
258
+
206
259
  for profile_name in _unique_profiles(candidate_profiles):
207
260
  try:
208
261
  profile = None if profile_name == "generic" else get_format_profile(profile_name)
@@ -218,6 +271,10 @@ def detect_format_profile(
218
271
  best = scores[0]
219
272
  second = scores[1] if len(scores) > 1 else None
220
273
  confidence = _confidence(best, second)
274
+ if confidence == "low":
275
+ generic = next((score for score in scores if score.profile == "generic" and score.score > LOW_SCORE), None)
276
+ if generic is not None:
277
+ best = generic
221
278
  return ProfileDetectionResult(
222
279
  selected_profile=best.profile,
223
280
  confidence=confidence,
@@ -725,6 +725,13 @@ def is_strong_adjacent_speech_start(
725
725
  # a new speech.
726
726
  letters = [char for char in raw_speaker if char.isalpha()]
727
727
  return bool(letters) and all(not char.islower() for char in letters)
728
+ if profile is not None and profile.name != "colon_inline" and COLON_SPEAKER_RE.match(linestr):
729
+ # Mixed/generic parsing may see verse punctuation such as
730
+ # ``Call'd Robin Goodfellow: are not you he`` inside an existing
731
+ # speech. Without a blank boundary, only source-uppercase colon
732
+ # labels are strong enough to interrupt the current speech.
733
+ letters = [char for char in raw_speaker if char.isalpha()]
734
+ return bool(letters) and all(not char.islower() for char in letters)
728
735
  return True
729
736
  letters = [char for char in raw_speaker if char.isalpha()]
730
737
  return (
@@ -66,6 +66,21 @@ def clean_stage_direction_text(text: str, *, profile: FormatProfile | None = Non
66
66
  return re.sub(r" {2,}", " ", cleaned).strip()
67
67
 
68
68
 
69
+
70
+
71
+ def split_unbracketed_stage_prose(text: str) -> list[str]:
72
+ """Split unbracketed stage prose into sentence-like stage events.
73
+
74
+ Long unbracketed paragraphs are a convenience for natural prose stage
75
+ directions. The play document model represents each sentence-like action as
76
+ its own stage_direction event, matching the corpus optimal JSON.
77
+ """
78
+ stripped = text.strip()
79
+ if not stripped:
80
+ return []
81
+ parts = re.split(r"(?<=[.!?])\s+(?=[A-Z])", stripped)
82
+ return [part.strip() for part in parts if part.strip()]
83
+
69
84
  def consume_multiline_stage_direction(
70
85
  lines: Sequence[str],
71
86
  index: int,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: play-parser
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Parse dramatic play text into ordered dramatic events.
5
5
  Author-email: Stergios Poularakis <stpoular@gmail.com>
6
6
  License-Expression: MIT
@@ -716,20 +716,4 @@ src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json
716
716
  src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json
717
717
  tests/__init__.py
718
718
  tests/conftest.py
719
- tests/play_document_comparison.py
720
- tests/test_cli.py
721
- tests/test_corpus_inventory.py
722
- tests/test_corpus_optimal_json.py
723
- tests/test_document_roundtrip.py
724
- tests/test_domain.py
725
- tests/test_fsm_corpus_optimal_json.py
726
- tests/test_fsm_scoring.py
727
- tests/test_ingestor.py
728
- tests/test_json_schema.py
729
- tests/test_parser_core.py
730
- tests/test_parser_factory.py
731
- tests/test_profile_detection.py
732
- tests/test_profiles.py
733
- tests/test_public_api.py
734
- tests/test_validation_strict_types.py
735
- tests/test_viterbi_decoder.py
719
+ tests/test_corpus_optimal_json.py
@@ -0,0 +1,21 @@
1
+ import copy
2
+ import json
3
+ from pathlib import Path
4
+
5
+ from play_parser import PlayParser, load_play_parse_config
6
+
7
+ DATA = Path(__file__).resolve().parents[1] / "data"
8
+
9
+ def parsed_play_only(document):
10
+ document = copy.deepcopy(document)
11
+ document.get("metadata", {}).pop("selected_format_profile", None)
12
+ document.get("metadata", {}).pop("profile_detection", None)
13
+ return document
14
+
15
+ def test_all_data_fixtures_match_optimal_json():
16
+ parser = PlayParser.create("rule")
17
+ for case in sorted(p for p in DATA.iterdir() if p.is_dir()):
18
+ config = load_play_parse_config(case / "hints.json")
19
+ actual = parser.parse_document((case / f"{case.name}.txt").read_text(encoding="utf-8"), source_name=f"{case.name}.txt", profile=config.profile, hints=config.hints)
20
+ expected = json.loads((case / "optimal.json").read_text(encoding="utf-8"))
21
+ assert parsed_play_only(actual) == parsed_play_only(expected), case.name
@@ -1,41 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from copy import deepcopy
4
- from typing import Any
5
-
6
- JsonObject = dict[str, Any]
7
-
8
-
9
- def normalise_play_document_structure(document: JsonObject) -> JsonObject:
10
- """Return a comparison-safe copy of a parsed play document.
11
-
12
- The corpus JSON captures theatre structure. Some fields are structural but
13
- not order-sensitive. For example, the character list represents the set of
14
- characters found in a play; the order may come from first appearance in one
15
- parser path and from a cast/preamble list in another.
16
- """
17
-
18
- normalised = deepcopy(document)
19
- metadata = normalised.get("metadata")
20
-
21
- if isinstance(metadata, dict):
22
- characters = metadata.get("characters")
23
- if isinstance(characters, list):
24
- metadata["characters"] = sorted(characters, key=_character_sort_key)
25
-
26
- return normalised
27
-
28
-
29
- def equalsJSONstructure(actual: JsonObject, expected: JsonObject) -> bool:
30
- """Compare two theatrical JSON structures.
31
-
32
- This is intentionally stricter than a loose semantic comparison, but less
33
- brittle than raw JSON equality where order does not carry meaning.
34
- """
35
-
36
- return normalise_play_document_structure(actual) == normalise_play_document_structure(expected)
37
-
38
-
39
- def _character_sort_key(value: object) -> tuple[str, str]:
40
- text = str(value)
41
- return (text.casefold(), text)
@@ -1,188 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import subprocess
5
- import sys
6
- from pathlib import Path
7
-
8
-
9
- def test_cli_parse_defaults_to_rule_parser(tmp_path: Path) -> None:
10
- source = tmp_path / "sample.txt"
11
- output = tmp_path / "sample.json"
12
- source.write_text(
13
- "Tiny Play\nby A Writer\n\nACT I\n\nSCENE I. A room.\n\nALEX: Hello.\n\nTHE END\n",
14
- encoding="utf-8",
15
- )
16
-
17
- result = subprocess.run(
18
- [
19
- sys.executable,
20
- "-m",
21
- "play_parser",
22
- "parse",
23
- str(source),
24
- "--json-output",
25
- str(output),
26
- ],
27
- check=False,
28
- capture_output=True,
29
- text=True,
30
- )
31
-
32
- assert result.returncode == 0, result.stderr
33
- document = json.loads(output.read_text(encoding="utf-8"))
34
- assert document["metadata"]["title"] == "Tiny Play"
35
- assert document["events"][-1]["type"] == "end_marker"
36
-
37
-
38
- def test_cli_parse_accepts_fsm_beam_width(tmp_path: Path) -> None:
39
- source = tmp_path / "sample.txt"
40
- output = tmp_path / "sample.json"
41
- source.write_text(
42
- "Tiny Play\nby A Writer\n\nACT I\n\nSCENE I. A room.\n\nALEX: Hello.\n\nTHE END\n",
43
- encoding="utf-8",
44
- )
45
-
46
- result = subprocess.run(
47
- [
48
- sys.executable,
49
- "-m",
50
- "play_parser",
51
- "parse",
52
- str(source),
53
- "--method",
54
- "fsm",
55
- "--beam-width",
56
- "2",
57
- "--json-output",
58
- str(output),
59
- ],
60
- check=False,
61
- capture_output=True,
62
- text=True,
63
- )
64
-
65
- assert result.returncode == 0, result.stderr
66
- document = json.loads(output.read_text(encoding="utf-8"))
67
- assert document["events"][-1]["type"] == "end_marker"
68
-
69
-
70
- def test_cli_parse_rejects_invalid_beam_width(tmp_path: Path) -> None:
71
- source = tmp_path / "sample.txt"
72
- source.write_text("ALEX: Hello.\n", encoding="utf-8")
73
-
74
- result = subprocess.run(
75
- [
76
- sys.executable,
77
- "-m",
78
- "play_parser",
79
- "parse",
80
- str(source),
81
- "--method",
82
- "fsm",
83
- "--beam-width",
84
- "0",
85
- ],
86
- check=False,
87
- capture_output=True,
88
- text=True,
89
- )
90
-
91
- assert result.returncode != 0
92
- assert "--beam-width must be at least 1" in result.stderr
93
-
94
-
95
- def test_cli_assemble_reports_invalid_json_without_traceback(tmp_path: Path) -> None:
96
- source = tmp_path / "broken.json"
97
- source.write_text("{not json", encoding="utf-8")
98
-
99
- result = subprocess.run(
100
- [sys.executable, "-m", "play_parser", "assemble", str(source)],
101
- check=False,
102
- capture_output=True,
103
- text=True,
104
- )
105
-
106
- assert result.returncode == 2
107
- assert "error: Invalid JSON" in result.stderr
108
- assert "Traceback" not in result.stderr
109
-
110
-
111
- def test_cli_parse_reports_invalid_profile_json_without_traceback(tmp_path: Path) -> None:
112
- source = tmp_path / "sample.txt"
113
- profile = tmp_path / "profile.json"
114
- source.write_text("ALEX: Hello.\n", encoding="utf-8")
115
- profile.write_text("{not json", encoding="utf-8")
116
-
117
- result = subprocess.run(
118
- [
119
- sys.executable,
120
- "-m",
121
- "play_parser",
122
- "parse",
123
- str(source),
124
- "--profile-path",
125
- str(profile),
126
- ],
127
- check=False,
128
- capture_output=True,
129
- text=True,
130
- )
131
-
132
- assert result.returncode == 2
133
- assert "error: Invalid JSON" in result.stderr
134
- assert "Traceback" not in result.stderr
135
-
136
-
137
- def test_cli_assemble_reports_invalid_canonical_document_without_traceback(tmp_path: Path) -> None:
138
- source = tmp_path / "broken_document.json"
139
- source.write_text(
140
- json.dumps(
141
- {
142
- "metadata": {
143
- "title": None,
144
- "author": None,
145
- "characters": [],
146
- "acts": [],
147
- "scenes": [],
148
- "stats": {
149
- "stage_directions": 0,
150
- "speeches": 1,
151
- "scenes": 0,
152
- "acts": 0,
153
- "source_words": 0,
154
- "spoken_words": 0,
155
- },
156
- },
157
- "events": [{"type": "speech"}],
158
- }
159
- ),
160
- encoding="utf-8",
161
- )
162
-
163
- result = subprocess.run(
164
- [sys.executable, "-m", "play_parser", "assemble", str(source)],
165
- check=False,
166
- capture_output=True,
167
- text=True,
168
- )
169
-
170
- assert result.returncode == 2
171
- assert "error: Invalid event at index 0" in result.stderr
172
- assert "speech event missing required fields" in result.stderr
173
- assert "Traceback" not in result.stderr
174
-
175
-
176
- def test_cli_missing_input_path_does_not_show_traceback(tmp_path: Path) -> None:
177
- missing = tmp_path / "missing.txt"
178
-
179
- result = subprocess.run(
180
- [sys.executable, "-m", "play_parser", "parse", str(missing)],
181
- check=False,
182
- capture_output=True,
183
- text=True,
184
- )
185
-
186
- assert result.returncode != 0
187
- assert "Input path not found" in result.stderr
188
- assert "Traceback" not in result.stderr
@@ -1,19 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
-
5
- ROOT = Path(__file__).resolve().parents[1]
6
- DATA_ROOT = ROOT / "data"
7
- EXPECTED_CORPUS_SIZE = 234
8
-
9
-
10
- def test_regression_corpus_has_expected_size() -> None:
11
- play_dirs = sorted(path for path in DATA_ROOT.iterdir() if path.is_dir())
12
-
13
- assert len(play_dirs) == EXPECTED_CORPUS_SIZE
14
-
15
-
16
- def test_each_corpus_case_has_text_and_optimal_json() -> None:
17
- for play_dir in sorted(path for path in DATA_ROOT.iterdir() if path.is_dir()):
18
- assert (play_dir / f"{play_dir.name}.txt").exists()
19
- assert (play_dir / "optimal.json").exists()
@@ -1,61 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- from pathlib import Path
5
-
6
- import pytest
7
-
8
- from play_parser import PlayParser, load_play_parse_config
9
- from play_parser.parsing.hints import DEFAULT_PROFILE_NAME, PlayParseConfig
10
- from play_parser.parsing.profiles import get_format_profile
11
- from tests.play_document_comparison import equalsJSONstructure
12
-
13
- ROOT = Path(__file__).resolve().parents[1]
14
- DATA_ROOT = ROOT / "data"
15
-
16
-
17
- def _resolve_profile(config: PlayParseConfig):
18
- if config.profile == DEFAULT_PROFILE_NAME:
19
- return None
20
- return get_format_profile(config.profile)
21
-
22
-
23
- def _all_play_cases() -> list[tuple[Path, Path, Path, PlayParseConfig]]:
24
- cases: list[tuple[Path, Path, Path, PlayParseConfig]] = []
25
-
26
- for play_dir in sorted(path for path in DATA_ROOT.iterdir() if path.is_dir()):
27
- text_path = play_dir / f"{play_dir.name}.txt"
28
- expected_path = play_dir / "optimal.json"
29
- hints_path = play_dir / "hints.json"
30
- cases.append((text_path, expected_path, hints_path, load_play_parse_config(hints_path)))
31
-
32
- return cases
33
-
34
-
35
- ALL_PLAY_CASES = _all_play_cases()
36
-
37
-
38
- def _case_id(case: tuple[Path, Path, Path, PlayParseConfig]) -> str:
39
- text_path, _, _, _ = case
40
- return text_path.stem
41
-
42
-
43
- @pytest.mark.parametrize("case", ALL_PLAY_CASES, ids=_case_id)
44
- def test_rule_parser_matches_optimal_json(
45
- case: tuple[Path, Path, Path, PlayParseConfig],
46
- ) -> None:
47
- text_path, expected_path, _hints_path, config = case
48
-
49
- assert text_path.exists(), f"Missing text file: {text_path}"
50
- assert expected_path.exists(), f"Missing optimal JSON for {text_path.name}: {expected_path}"
51
-
52
- parser = PlayParser.create("rule")
53
- actual = parser.parse_document(
54
- text_path.read_text(encoding="utf-8"),
55
- profile=_resolve_profile(config),
56
- hints=config.hints,
57
- source_name=text_path.name,
58
- )
59
- expected = json.loads(expected_path.read_text(encoding="utf-8"))
60
-
61
- assert equalsJSONstructure(actual, expected)
@@ -1,78 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import tempfile
5
- import unittest
6
- from pathlib import Path
7
-
8
- from play_parser._io import DEFAULT_MAX_INPUT_BYTES
9
- from play_parser.document.assembler import assemble_play_text
10
- from play_parser.document.builder import build_play_document, build_play_document_from_file, write_json_file
11
-
12
- ROOT = Path(__file__).resolve().parents[1]
13
-
14
- SAMPLE_TEXT = """Example Play
15
- by William Shakespeare
16
-
17
- ACT I
18
-
19
- SCENE I. A room.
20
-
21
- HAMLET: To be or not to be.
22
- """
23
-
24
-
25
- class DocumentRoundtripTests(unittest.TestCase):
26
- def test_build_play_document_collects_metadata_and_events(self) -> None:
27
- document = build_play_document(SAMPLE_TEXT)
28
-
29
- self.assertEqual(document["metadata"]["title"], "Example Play")
30
- self.assertEqual(document["metadata"]["author"], "William Shakespeare")
31
- self.assertEqual(document["metadata"]["stats"]["acts"], 1)
32
- self.assertEqual(document["metadata"]["stats"]["scenes"], 1)
33
- self.assertEqual(document["metadata"]["stats"]["speeches"], 1)
34
- self.assertEqual(document["events"][0]["type"], "meta")
35
- self.assertEqual(document["events"][-1]["type"], "speech")
36
-
37
- def test_json_to_text_to_json_is_idempotent_for_sample(self) -> None:
38
- document = build_play_document(SAMPLE_TEXT, play_name="Example Play")
39
- canonical_text = assemble_play_text(document)
40
- reparsed = build_play_document(canonical_text, play_name="Example Play")
41
-
42
- self.assertEqual(reparsed, document)
43
-
44
- def test_txt_to_json_to_normalised_txt_to_json_is_idempotent_for_sample_file(self) -> None:
45
- with tempfile.TemporaryDirectory() as tmpdir:
46
- input_path = Path(tmpdir) / "Example.txt"
47
- input_path.write_text(SAMPLE_TEXT, encoding="utf-8")
48
-
49
- first = build_play_document_from_file(input_path)
50
- normalised_text = assemble_play_text(first)
51
- second = build_play_document(normalised_text, play_name=input_path.stem)
52
-
53
- self.assertEqual(second, first)
54
-
55
- def test_write_json_file_writes_same_document_that_it_returns(self) -> None:
56
- with tempfile.TemporaryDirectory() as tmpdir:
57
- tmp = Path(tmpdir)
58
- input_path = tmp / "Example.txt"
59
- output_path = tmp / "out" / "Example.json"
60
- input_path.write_text(SAMPLE_TEXT, encoding="utf-8")
61
-
62
- returned = write_json_file(input_path, output_path)
63
- written = json.loads(output_path.read_text(encoding="utf-8"))
64
-
65
- self.assertEqual(written, returned)
66
-
67
- def test_rejects_oversized_text_file(self) -> None:
68
- with tempfile.TemporaryDirectory() as tmpdir:
69
- path = Path(tmpdir) / "Large.txt"
70
- with path.open("wb") as handle:
71
- handle.truncate(DEFAULT_MAX_INPUT_BYTES + 1)
72
-
73
- with self.assertRaisesRegex(ValueError, "too large"):
74
- build_play_document_from_file(path)
75
-
76
-
77
- if __name__ == "__main__":
78
- unittest.main()