play-parser 1.2.0__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 (737) hide show
  1. {play_parser-1.2.0/src/play_parser.egg-info → play_parser-1.2.2}/PKG-INFO +1 -1
  2. {play_parser-1.2.0 → play_parser-1.2.2}/pyproject.toml +1 -1
  3. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/__init__.py +4 -0
  4. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/types.py +3 -1
  5. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/validation.py +1 -1
  6. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsers.py +35 -4
  7. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/context.py +8 -7
  8. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/parser.py +3 -3
  9. play_parser-1.2.2/src/play_parser/parsing/profile_detection.py +310 -0
  10. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/speech.py +7 -0
  11. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/stage.py +15 -0
  12. {play_parser-1.2.0 → play_parser-1.2.2/src/play_parser.egg-info}/PKG-INFO +1 -1
  13. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser.egg-info/SOURCES.txt +2 -16
  14. play_parser-1.2.2/tests/test_corpus_optimal_json.py +21 -0
  15. play_parser-1.2.0/tests/play_document_comparison.py +0 -41
  16. play_parser-1.2.0/tests/test_cli.py +0 -188
  17. play_parser-1.2.0/tests/test_corpus_inventory.py +0 -19
  18. play_parser-1.2.0/tests/test_corpus_optimal_json.py +0 -61
  19. play_parser-1.2.0/tests/test_document_roundtrip.py +0 -78
  20. play_parser-1.2.0/tests/test_domain.py +0 -109
  21. play_parser-1.2.0/tests/test_fsm_corpus_optimal_json.py +0 -61
  22. play_parser-1.2.0/tests/test_fsm_scoring.py +0 -45
  23. play_parser-1.2.0/tests/test_ingestor.py +0 -96
  24. play_parser-1.2.0/tests/test_json_schema.py +0 -53
  25. play_parser-1.2.0/tests/test_parser_core.py +0 -534
  26. play_parser-1.2.0/tests/test_parser_factory.py +0 -100
  27. play_parser-1.2.0/tests/test_profiles.py +0 -168
  28. play_parser-1.2.0/tests/test_public_api.py +0 -38
  29. play_parser-1.2.0/tests/test_validation_strict_types.py +0 -184
  30. play_parser-1.2.0/tests/test_viterbi_decoder.py +0 -49
  31. {play_parser-1.2.0 → play_parser-1.2.2}/CHANGELOG.md +0 -0
  32. {play_parser-1.2.0 → play_parser-1.2.2}/LICENSE +0 -0
  33. {play_parser-1.2.0 → play_parser-1.2.2}/MANIFEST.in +0 -0
  34. {play_parser-1.2.0 → play_parser-1.2.2}/README.md +0 -0
  35. {play_parser-1.2.0 → play_parser-1.2.2}/RELEASE.md +0 -0
  36. {play_parser-1.2.0 → play_parser-1.2.2}/SECURITY.md +0 -0
  37. {play_parser-1.2.0 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/01_modern_two_hander_preamble_separator.txt +0 -0
  38. {play_parser-1.2.0 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/hints.json +0 -0
  39. {play_parser-1.2.0 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/optimal.json +0 -0
  40. {play_parser-1.2.0 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/02_modern_three_characters_no_separator.txt +0 -0
  41. {play_parser-1.2.0 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/hints.json +0 -0
  42. {play_parser-1.2.0 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/optimal.json +0 -0
  43. {play_parser-1.2.0 → play_parser-1.2.2}/data/03_colon_format_one_scene/03_colon_format_one_scene.txt +0 -0
  44. {play_parser-1.2.0 → play_parser-1.2.2}/data/03_colon_format_one_scene/hints.json +0 -0
  45. {play_parser-1.2.0 → play_parser-1.2.2}/data/03_colon_format_one_scene/optimal.json +0 -0
  46. {play_parser-1.2.0 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/04_speaker_colon_multiscene.txt +0 -0
  47. {play_parser-1.2.0 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/optimal.json +0 -0
  48. {play_parser-1.2.0 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/05_shakespeare_line_speakers.txt +0 -0
  49. {play_parser-1.2.0 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/optimal.json +0 -0
  50. {play_parser-1.2.0 → play_parser-1.2.2}/data/06_inline_stage_directions/06_inline_stage_directions.txt +0 -0
  51. {play_parser-1.2.0 → play_parser-1.2.2}/data/06_inline_stage_directions/hints.json +0 -0
  52. {play_parser-1.2.0 → play_parser-1.2.2}/data/06_inline_stage_directions/optimal.json +0 -0
  53. {play_parser-1.2.0 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/07_long_preamble_cast_setting_notes.txt +0 -0
  54. {play_parser-1.2.0 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/hints.json +0 -0
  55. {play_parser-1.2.0 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/optimal.json +0 -0
  56. {play_parser-1.2.0 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/08_no_preamble_immediate_dialogue.txt +0 -0
  57. {play_parser-1.2.0 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/optimal.json +0 -0
  58. {play_parser-1.2.0 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/09_title_author_then_scene_no_act.txt +0 -0
  59. {play_parser-1.2.0 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/optimal.json +0 -0
  60. {play_parser-1.2.0 → play_parser-1.2.2}/data/100_formal_three_hander/100_formal_three_hander.txt +0 -0
  61. {play_parser-1.2.0 → play_parser-1.2.2}/data/100_formal_three_hander/hints.json +0 -0
  62. {play_parser-1.2.0 → play_parser-1.2.2}/data/100_formal_three_hander/optimal.json +0 -0
  63. {play_parser-1.2.0 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/101_lift_lobby_sluglines.txt +0 -0
  64. {play_parser-1.2.0 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/hints.json +0 -0
  65. {play_parser-1.2.0 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/optimal.json +0 -0
  66. {play_parser-1.2.0 → play_parser-1.2.2}/data/102_weather_frequency/102_weather_frequency.txt +0 -0
  67. {play_parser-1.2.0 → play_parser-1.2.2}/data/102_weather_frequency/hints.json +0 -0
  68. {play_parser-1.2.0 → play_parser-1.2.2}/data/102_weather_frequency/optimal.json +0 -0
  69. {play_parser-1.2.0 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/103_the_spare_key_catalogue.txt +0 -0
  70. {play_parser-1.2.0 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/hints.json +0 -0
  71. {play_parser-1.2.0 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/optimal.json +0 -0
  72. {play_parser-1.2.0 → play_parser-1.2.2}/data/104_initials_at_tea/104_initials_at_tea.txt +0 -0
  73. {play_parser-1.2.0 → play_parser-1.2.2}/data/104_initials_at_tea/hints.json +0 -0
  74. {play_parser-1.2.0 → play_parser-1.2.2}/data/104_initials_at_tea/optimal.json +0 -0
  75. {play_parser-1.2.0 → play_parser-1.2.2}/data/105_a_door_answers/105_a_door_answers.txt +0 -0
  76. {play_parser-1.2.0 → play_parser-1.2.2}/data/105_a_door_answers/hints.json +0 -0
  77. {play_parser-1.2.0 → play_parser-1.2.2}/data/105_a_door_answers/optimal.json +0 -0
  78. {play_parser-1.2.0 → play_parser-1.2.2}/data/106_small_applause/106_small_applause.txt +0 -0
  79. {play_parser-1.2.0 → play_parser-1.2.2}/data/106_small_applause/hints.json +0 -0
  80. {play_parser-1.2.0 → play_parser-1.2.2}/data/106_small_applause/optimal.json +0 -0
  81. {play_parser-1.2.0 → play_parser-1.2.2}/data/107_chair_ballet/107_chair_ballet.txt +0 -0
  82. {play_parser-1.2.0 → play_parser-1.2.2}/data/107_chair_ballet/hints.json +0 -0
  83. {play_parser-1.2.0 → play_parser-1.2.2}/data/107_chair_ballet/optimal.json +0 -0
  84. {play_parser-1.2.0 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/108_scene_is_not_a_scene.txt +0 -0
  85. {play_parser-1.2.0 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/hints.json +0 -0
  86. {play_parser-1.2.0 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/optimal.json +0 -0
  87. {play_parser-1.2.0 → play_parser-1.2.2}/data/109_lower_roman/109_lower_roman.txt +0 -0
  88. {play_parser-1.2.0 → play_parser-1.2.2}/data/109_lower_roman/hints.json +0 -0
  89. {play_parser-1.2.0 → play_parser-1.2.2}/data/109_lower_roman/optimal.json +0 -0
  90. {play_parser-1.2.0 → play_parser-1.2.2}/data/10_simple_spare_key_scene/10_simple_spare_key_scene.txt +0 -0
  91. {play_parser-1.2.0 → play_parser-1.2.2}/data/10_simple_spare_key_scene/hints.json +0 -0
  92. {play_parser-1.2.0 → play_parser-1.2.2}/data/10_simple_spare_key_scene/optimal.json +0 -0
  93. {play_parser-1.2.0 → play_parser-1.2.2}/data/110_inbox_play/110_inbox_play.txt +0 -0
  94. {play_parser-1.2.0 → play_parser-1.2.2}/data/110_inbox_play/hints.json +0 -0
  95. {play_parser-1.2.0 → play_parser-1.2.2}/data/110_inbox_play/optimal.json +0 -0
  96. {play_parser-1.2.0 → play_parser-1.2.2}/data/111_hyphenated_night/111_hyphenated_night.txt +0 -0
  97. {play_parser-1.2.0 → play_parser-1.2.2}/data/111_hyphenated_night/hints.json +0 -0
  98. {play_parser-1.2.0 → play_parser-1.2.2}/data/111_hyphenated_night/optimal.json +0 -0
  99. {play_parser-1.2.0 → play_parser-1.2.2}/data/113_numbered_witnesses/113_numbered_witnesses.txt +0 -0
  100. {play_parser-1.2.0 → play_parser-1.2.2}/data/113_numbered_witnesses/hints.json +0 -0
  101. {play_parser-1.2.0 → play_parser-1.2.2}/data/113_numbered_witnesses/optimal.json +0 -0
  102. {play_parser-1.2.0 → play_parser-1.2.2}/data/114_the_group_chat/114_the_group_chat.txt +0 -0
  103. {play_parser-1.2.0 → play_parser-1.2.2}/data/114_the_group_chat/hints.json +0 -0
  104. {play_parser-1.2.0 → play_parser-1.2.2}/data/114_the_group_chat/optimal.json +0 -0
  105. {play_parser-1.2.0 → play_parser-1.2.2}/data/115_four_line_oath/115_four_line_oath.txt +0 -0
  106. {play_parser-1.2.0 → play_parser-1.2.2}/data/115_four_line_oath/hints.json +0 -0
  107. {play_parser-1.2.0 → play_parser-1.2.2}/data/115_four_line_oath/optimal.json +0 -0
  108. {play_parser-1.2.0 → play_parser-1.2.2}/data/116_after_the_bell/116_after_the_bell.txt +0 -0
  109. {play_parser-1.2.0 → play_parser-1.2.2}/data/116_after_the_bell/hints.json +0 -0
  110. {play_parser-1.2.0 → play_parser-1.2.2}/data/116_after_the_bell/optimal.json +0 -0
  111. {play_parser-1.2.0 → play_parser-1.2.2}/data/117_italic_corridor/117_italic_corridor.txt +0 -0
  112. {play_parser-1.2.0 → play_parser-1.2.2}/data/117_italic_corridor/hints.json +0 -0
  113. {play_parser-1.2.0 → play_parser-1.2.2}/data/117_italic_corridor/optimal.json +0 -0
  114. {play_parser-1.2.0 → play_parser-1.2.2}/data/118_third_act_weather/118_third_act_weather.txt +0 -0
  115. {play_parser-1.2.0 → play_parser-1.2.2}/data/118_third_act_weather/hints.json +0 -0
  116. {play_parser-1.2.0 → play_parser-1.2.2}/data/118_third_act_weather/optimal.json +0 -0
  117. {play_parser-1.2.0 → play_parser-1.2.2}/data/119_pause_audit/119_pause_audit.txt +0 -0
  118. {play_parser-1.2.0 → play_parser-1.2.2}/data/119_pause_audit/hints.json +0 -0
  119. {play_parser-1.2.0 → play_parser-1.2.2}/data/119_pause_audit/optimal.json +0 -0
  120. {play_parser-1.2.0 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/11_malformed_joined_speaker_pdf_artifact.txt +0 -0
  121. {play_parser-1.2.0 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/hints.json +0 -0
  122. {play_parser-1.2.0 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/optimal.json +0 -0
  123. {play_parser-1.2.0 → play_parser-1.2.2}/data/120_colon_trouble/120_colon_trouble.txt +0 -0
  124. {play_parser-1.2.0 → play_parser-1.2.2}/data/120_colon_trouble/hints.json +0 -0
  125. {play_parser-1.2.0 → play_parser-1.2.2}/data/120_colon_trouble/optimal.json +0 -0
  126. {play_parser-1.2.0 → play_parser-1.2.2}/data/121_semicolon_cast/121_semicolon_cast.txt +0 -0
  127. {play_parser-1.2.0 → play_parser-1.2.2}/data/121_semicolon_cast/hints.json +0 -0
  128. {play_parser-1.2.0 → play_parser-1.2.2}/data/121_semicolon_cast/optimal.json +0 -0
  129. {play_parser-1.2.0 → play_parser-1.2.2}/data/122_square_cue/122_square_cue.txt +0 -0
  130. {play_parser-1.2.0 → play_parser-1.2.2}/data/122_square_cue/hints.json +0 -0
  131. {play_parser-1.2.0 → play_parser-1.2.2}/data/122_square_cue/optimal.json +0 -0
  132. {play_parser-1.2.0 → play_parser-1.2.2}/data/123_page_header_fog/123_page_header_fog.txt +0 -0
  133. {play_parser-1.2.0 → play_parser-1.2.2}/data/123_page_header_fog/hints.json +0 -0
  134. {play_parser-1.2.0 → play_parser-1.2.2}/data/123_page_header_fog/optimal.json +0 -0
  135. {play_parser-1.2.0 → play_parser-1.2.2}/data/124_lowercase_lobby/124_lowercase_lobby.txt +0 -0
  136. {play_parser-1.2.0 → play_parser-1.2.2}/data/124_lowercase_lobby/hints.json +0 -0
  137. {play_parser-1.2.0 → play_parser-1.2.2}/data/124_lowercase_lobby/optimal.json +0 -0
  138. {play_parser-1.2.0 → play_parser-1.2.2}/data/125_parenthesis_room/125_parenthesis_room.txt +0 -0
  139. {play_parser-1.2.0 → play_parser-1.2.2}/data/125_parenthesis_room/hints.json +0 -0
  140. {play_parser-1.2.0 → play_parser-1.2.2}/data/125_parenthesis_room/optimal.json +0 -0
  141. {play_parser-1.2.0 → play_parser-1.2.2}/data/126_mixed_marks/126_mixed_marks.txt +0 -0
  142. {play_parser-1.2.0 → play_parser-1.2.2}/data/126_mixed_marks/hints.json +0 -0
  143. {play_parser-1.2.0 → play_parser-1.2.2}/data/126_mixed_marks/optimal.json +0 -0
  144. {play_parser-1.2.0 → play_parser-1.2.2}/data/127_the_word_act/127_the_word_act.txt +0 -0
  145. {play_parser-1.2.0 → play_parser-1.2.2}/data/127_the_word_act/hints.json +0 -0
  146. {play_parser-1.2.0 → play_parser-1.2.2}/data/127_the_word_act/optimal.json +0 -0
  147. {play_parser-1.2.0 → play_parser-1.2.2}/data/128_broken_column/128_broken_column.txt +0 -0
  148. {play_parser-1.2.0 → play_parser-1.2.2}/data/128_broken_column/hints.json +0 -0
  149. {play_parser-1.2.0 → play_parser-1.2.2}/data/128_broken_column/optimal.json +0 -0
  150. {play_parser-1.2.0 → play_parser-1.2.2}/data/129_prologue_with_receipts/129_prologue_with_receipts.txt +0 -0
  151. {play_parser-1.2.0 → play_parser-1.2.2}/data/129_prologue_with_receipts/hints.json +0 -0
  152. {play_parser-1.2.0 → play_parser-1.2.2}/data/129_prologue_with_receipts/optimal.json +0 -0
  153. {play_parser-1.2.0 → play_parser-1.2.2}/data/12_many_characters_short_lines/12_many_characters_short_lines.txt +0 -0
  154. {play_parser-1.2.0 → play_parser-1.2.2}/data/12_many_characters_short_lines/hints.json +0 -0
  155. {play_parser-1.2.0 → play_parser-1.2.2}/data/12_many_characters_short_lines/optimal.json +0 -0
  156. {play_parser-1.2.0 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/131_screenplay_character_blocks_1.txt +0 -0
  157. {play_parser-1.2.0 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/hints.json +0 -0
  158. {play_parser-1.2.0 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/optimal.json +0 -0
  159. {play_parser-1.2.0 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/132_screenplay_character_blocks_2.txt +0 -0
  160. {play_parser-1.2.0 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/hints.json +0 -0
  161. {play_parser-1.2.0 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/optimal.json +0 -0
  162. {play_parser-1.2.0 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/133_screenplay_parenthetical_cues_1.txt +0 -0
  163. {play_parser-1.2.0 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/hints.json +0 -0
  164. {play_parser-1.2.0 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/optimal.json +0 -0
  165. {play_parser-1.2.0 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/134_screenplay_parenthetical_cues_2.txt +0 -0
  166. {play_parser-1.2.0 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/hints.json +0 -0
  167. {play_parser-1.2.0 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/optimal.json +0 -0
  168. {play_parser-1.2.0 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/135_fixed_width_dialogue_1.txt +0 -0
  169. {play_parser-1.2.0 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/hints.json +0 -0
  170. {play_parser-1.2.0 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/optimal.json +0 -0
  171. {play_parser-1.2.0 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/136_fixed_width_dialogue_2.txt +0 -0
  172. {play_parser-1.2.0 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/hints.json +0 -0
  173. {play_parser-1.2.0 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/optimal.json +0 -0
  174. {play_parser-1.2.0 → play_parser-1.2.2}/data/137_tabular_dialogue_1/137_tabular_dialogue_1.txt +0 -0
  175. {play_parser-1.2.0 → play_parser-1.2.2}/data/137_tabular_dialogue_1/hints.json +0 -0
  176. {play_parser-1.2.0 → play_parser-1.2.2}/data/137_tabular_dialogue_1/optimal.json +0 -0
  177. {play_parser-1.2.0 → play_parser-1.2.2}/data/138_tabular_dialogue_2/138_tabular_dialogue_2.txt +0 -0
  178. {play_parser-1.2.0 → play_parser-1.2.2}/data/138_tabular_dialogue_2/hints.json +0 -0
  179. {play_parser-1.2.0 → play_parser-1.2.2}/data/138_tabular_dialogue_2/optimal.json +0 -0
  180. {play_parser-1.2.0 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/139_hyphen_dialogue_1.txt +0 -0
  181. {play_parser-1.2.0 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/hints.json +0 -0
  182. {play_parser-1.2.0 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/optimal.json +0 -0
  183. {play_parser-1.2.0 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/13_character_names_with_spaces_colon.txt +0 -0
  184. {play_parser-1.2.0 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/optimal.json +0 -0
  185. {play_parser-1.2.0 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/140_hyphen_dialogue_2.txt +0 -0
  186. {play_parser-1.2.0 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/hints.json +0 -0
  187. {play_parser-1.2.0 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/optimal.json +0 -0
  188. {play_parser-1.2.0 → play_parser-1.2.2}/data/141_emdash_dialogue_1/141_emdash_dialogue_1.txt +0 -0
  189. {play_parser-1.2.0 → play_parser-1.2.2}/data/141_emdash_dialogue_1/hints.json +0 -0
  190. {play_parser-1.2.0 → play_parser-1.2.2}/data/141_emdash_dialogue_1/optimal.json +0 -0
  191. {play_parser-1.2.0 → play_parser-1.2.2}/data/142_emdash_dialogue_2/142_emdash_dialogue_2.txt +0 -0
  192. {play_parser-1.2.0 → play_parser-1.2.2}/data/142_emdash_dialogue_2/hints.json +0 -0
  193. {play_parser-1.2.0 → play_parser-1.2.2}/data/142_emdash_dialogue_2/optimal.json +0 -0
  194. {play_parser-1.2.0 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/143_abbreviated_dot_speakers_1.txt +0 -0
  195. {play_parser-1.2.0 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/hints.json +0 -0
  196. {play_parser-1.2.0 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/optimal.json +0 -0
  197. {play_parser-1.2.0 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/144_abbreviated_dot_speakers_2.txt +0 -0
  198. {play_parser-1.2.0 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/hints.json +0 -0
  199. {play_parser-1.2.0 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/optimal.json +0 -0
  200. {play_parser-1.2.0 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/149_alias_cast_dialogue_1.txt +0 -0
  201. {play_parser-1.2.0 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/hints.json +0 -0
  202. {play_parser-1.2.0 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/optimal.json +0 -0
  203. {play_parser-1.2.0 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/14_character_block_with_colons_and_descriptions.txt +0 -0
  204. {play_parser-1.2.0 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/hints.json +0 -0
  205. {play_parser-1.2.0 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/optimal.json +0 -0
  206. {play_parser-1.2.0 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/150_alias_cast_dialogue_2.txt +0 -0
  207. {play_parser-1.2.0 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/hints.json +0 -0
  208. {play_parser-1.2.0 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/optimal.json +0 -0
  209. {play_parser-1.2.0 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/151_page_header_inside_speech_1.txt +0 -0
  210. {play_parser-1.2.0 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/hints.json +0 -0
  211. {play_parser-1.2.0 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/optimal.json +0 -0
  212. {play_parser-1.2.0 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/152_page_header_inside_speech_2.txt +0 -0
  213. {play_parser-1.2.0 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/hints.json +0 -0
  214. {play_parser-1.2.0 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/optimal.json +0 -0
  215. {play_parser-1.2.0 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/153_verse_indented_continuation_1.txt +0 -0
  216. {play_parser-1.2.0 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/hints.json +0 -0
  217. {play_parser-1.2.0 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/optimal.json +0 -0
  218. {play_parser-1.2.0 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/154_verse_indented_continuation_2.txt +0 -0
  219. {play_parser-1.2.0 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/hints.json +0 -0
  220. {play_parser-1.2.0 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/optimal.json +0 -0
  221. {play_parser-1.2.0 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/155_unbracketed_stage_prose_1.txt +0 -0
  222. {play_parser-1.2.0 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/hints.json +0 -0
  223. {play_parser-1.2.0 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/optimal.json +0 -0
  224. {play_parser-1.2.0 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/156_unbracketed_stage_prose_2.txt +0 -0
  225. {play_parser-1.2.0 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/hints.json +0 -0
  226. {play_parser-1.2.0 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/optimal.json +0 -0
  227. {play_parser-1.2.0 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/157_dual_dialogue_same_line_1.txt +0 -0
  228. {play_parser-1.2.0 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/hints.json +0 -0
  229. {play_parser-1.2.0 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/optimal.json +0 -0
  230. {play_parser-1.2.0 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/158_dual_dialogue_same_line_2.txt +0 -0
  231. {play_parser-1.2.0 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/hints.json +0 -0
  232. {play_parser-1.2.0 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/optimal.json +0 -0
  233. {play_parser-1.2.0 → play_parser-1.2.2}/data/159_cue_before_colon_1/159_cue_before_colon_1.txt +0 -0
  234. {play_parser-1.2.0 → play_parser-1.2.2}/data/159_cue_before_colon_1/hints.json +0 -0
  235. {play_parser-1.2.0 → play_parser-1.2.2}/data/159_cue_before_colon_1/optimal.json +0 -0
  236. {play_parser-1.2.0 → play_parser-1.2.2}/data/15_multiple_acts_modern/15_multiple_acts_modern.txt +0 -0
  237. {play_parser-1.2.0 → play_parser-1.2.2}/data/15_multiple_acts_modern/optimal.json +0 -0
  238. {play_parser-1.2.0 → play_parser-1.2.2}/data/160_cue_before_colon_2/160_cue_before_colon_2.txt +0 -0
  239. {play_parser-1.2.0 → play_parser-1.2.2}/data/160_cue_before_colon_2/hints.json +0 -0
  240. {play_parser-1.2.0 → play_parser-1.2.2}/data/160_cue_before_colon_2/optimal.json +0 -0
  241. {play_parser-1.2.0 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/161_scene_title_false_speaker_1.txt +0 -0
  242. {play_parser-1.2.0 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/hints.json +0 -0
  243. {play_parser-1.2.0 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/optimal.json +0 -0
  244. {play_parser-1.2.0 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/162_scene_title_false_speaker_2.txt +0 -0
  245. {play_parser-1.2.0 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/hints.json +0 -0
  246. {play_parser-1.2.0 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/optimal.json +0 -0
  247. {play_parser-1.2.0 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/163_chat_timestamp_dialogue_1.txt +0 -0
  248. {play_parser-1.2.0 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/hints.json +0 -0
  249. {play_parser-1.2.0 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/optimal.json +0 -0
  250. {play_parser-1.2.0 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/164_chat_timestamp_dialogue_2.txt +0 -0
  251. {play_parser-1.2.0 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/hints.json +0 -0
  252. {play_parser-1.2.0 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/optimal.json +0 -0
  253. {play_parser-1.2.0 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/165_line_numbered_dialogue_1.txt +0 -0
  254. {play_parser-1.2.0 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/hints.json +0 -0
  255. {play_parser-1.2.0 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/optimal.json +0 -0
  256. {play_parser-1.2.0 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/166_line_numbered_dialogue_2.txt +0 -0
  257. {play_parser-1.2.0 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/hints.json +0 -0
  258. {play_parser-1.2.0 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/optimal.json +0 -0
  259. {play_parser-1.2.0 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/167_pdf_hyphenated_wrap_1.txt +0 -0
  260. {play_parser-1.2.0 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/hints.json +0 -0
  261. {play_parser-1.2.0 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/optimal.json +0 -0
  262. {play_parser-1.2.0 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/168_pdf_hyphenated_wrap_2.txt +0 -0
  263. {play_parser-1.2.0 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/hints.json +0 -0
  264. {play_parser-1.2.0 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/optimal.json +0 -0
  265. {play_parser-1.2.0 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/169_diacritic_apostrophe_speakers_1.txt +0 -0
  266. {play_parser-1.2.0 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/hints.json +0 -0
  267. {play_parser-1.2.0 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/optimal.json +0 -0
  268. {play_parser-1.2.0 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/16_stage_directions_square_brackets.txt +0 -0
  269. {play_parser-1.2.0 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/optimal.json +0 -0
  270. {play_parser-1.2.0 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/170_diacritic_apostrophe_speakers_2.txt +0 -0
  271. {play_parser-1.2.0 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/hints.json +0 -0
  272. {play_parser-1.2.0 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/optimal.json +0 -0
  273. {play_parser-1.2.0 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/171_numbered_scene_titles_1.txt +0 -0
  274. {play_parser-1.2.0 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/hints.json +0 -0
  275. {play_parser-1.2.0 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/optimal.json +0 -0
  276. {play_parser-1.2.0 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/172_numbered_scene_titles_2.txt +0 -0
  277. {play_parser-1.2.0 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/hints.json +0 -0
  278. {play_parser-1.2.0 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/optimal.json +0 -0
  279. {play_parser-1.2.0 → play_parser-1.2.2}/data/173_scene_colon_label_1/173_scene_colon_label_1.txt +0 -0
  280. {play_parser-1.2.0 → play_parser-1.2.2}/data/173_scene_colon_label_1/hints.json +0 -0
  281. {play_parser-1.2.0 → play_parser-1.2.2}/data/173_scene_colon_label_1/optimal.json +0 -0
  282. {play_parser-1.2.0 → play_parser-1.2.2}/data/174_scene_colon_label_2/174_scene_colon_label_2.txt +0 -0
  283. {play_parser-1.2.0 → play_parser-1.2.2}/data/174_scene_colon_label_2/hints.json +0 -0
  284. {play_parser-1.2.0 → play_parser-1.2.2}/data/174_scene_colon_label_2/optimal.json +0 -0
  285. {play_parser-1.2.0 → play_parser-1.2.2}/data/175_single_letter_speakers_1/175_single_letter_speakers_1.txt +0 -0
  286. {play_parser-1.2.0 → play_parser-1.2.2}/data/175_single_letter_speakers_1/hints.json +0 -0
  287. {play_parser-1.2.0 → play_parser-1.2.2}/data/175_single_letter_speakers_1/optimal.json +0 -0
  288. {play_parser-1.2.0 → play_parser-1.2.2}/data/176_single_letter_speakers_2/176_single_letter_speakers_2.txt +0 -0
  289. {play_parser-1.2.0 → play_parser-1.2.2}/data/176_single_letter_speakers_2/hints.json +0 -0
  290. {play_parser-1.2.0 → play_parser-1.2.2}/data/176_single_letter_speakers_2/optimal.json +0 -0
  291. {play_parser-1.2.0 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/177_music_lyrics_cues_1.txt +0 -0
  292. {play_parser-1.2.0 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/hints.json +0 -0
  293. {play_parser-1.2.0 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/optimal.json +0 -0
  294. {play_parser-1.2.0 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/178_music_lyrics_cues_2.txt +0 -0
  295. {play_parser-1.2.0 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/hints.json +0 -0
  296. {play_parser-1.2.0 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/optimal.json +0 -0
  297. {play_parser-1.2.0 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/179_speaker_then_blank_then_text_1.txt +0 -0
  298. {play_parser-1.2.0 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/hints.json +0 -0
  299. {play_parser-1.2.0 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/optimal.json +0 -0
  300. {play_parser-1.2.0 → play_parser-1.2.2}/data/17_screenplayish_format/17_screenplayish_format.txt +0 -0
  301. {play_parser-1.2.0 → play_parser-1.2.2}/data/17_screenplayish_format/hints.json +0 -0
  302. {play_parser-1.2.0 → play_parser-1.2.2}/data/17_screenplayish_format/optimal.json +0 -0
  303. {play_parser-1.2.0 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/180_speaker_then_blank_then_text_2.txt +0 -0
  304. {play_parser-1.2.0 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/hints.json +0 -0
  305. {play_parser-1.2.0 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/optimal.json +0 -0
  306. {play_parser-1.2.0 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/181_ocr_spaced_speaker_labels_1.txt +0 -0
  307. {play_parser-1.2.0 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/hints.json +0 -0
  308. {play_parser-1.2.0 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/optimal.json +0 -0
  309. {play_parser-1.2.0 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/182_ocr_spaced_speaker_labels_2.txt +0 -0
  310. {play_parser-1.2.0 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/hints.json +0 -0
  311. {play_parser-1.2.0 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/optimal.json +0 -0
  312. {play_parser-1.2.0 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/183_ocr_digit_letter_confusion_1.txt +0 -0
  313. {play_parser-1.2.0 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/hints.json +0 -0
  314. {play_parser-1.2.0 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/optimal.json +0 -0
  315. {play_parser-1.2.0 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/184_ocr_digit_letter_confusion_2.txt +0 -0
  316. {play_parser-1.2.0 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/hints.json +0 -0
  317. {play_parser-1.2.0 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/optimal.json +0 -0
  318. {play_parser-1.2.0 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/185_ocr_broken_word_continuation_1.txt +0 -0
  319. {play_parser-1.2.0 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/hints.json +0 -0
  320. {play_parser-1.2.0 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/optimal.json +0 -0
  321. {play_parser-1.2.0 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/186_ocr_broken_word_continuation_2.txt +0 -0
  322. {play_parser-1.2.0 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/hints.json +0 -0
  323. {play_parser-1.2.0 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/optimal.json +0 -0
  324. {play_parser-1.2.0 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/187_ocr_page_number_in_speech_1.txt +0 -0
  325. {play_parser-1.2.0 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/hints.json +0 -0
  326. {play_parser-1.2.0 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/optimal.json +0 -0
  327. {play_parser-1.2.0 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/188_ocr_page_number_in_speech_2.txt +0 -0
  328. {play_parser-1.2.0 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/hints.json +0 -0
  329. {play_parser-1.2.0 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/optimal.json +0 -0
  330. {play_parser-1.2.0 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/189_ocr_header_footer_intrusion_1.txt +0 -0
  331. {play_parser-1.2.0 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/hints.json +0 -0
  332. {play_parser-1.2.0 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/optimal.json +0 -0
  333. {play_parser-1.2.0 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/18_blank_lines_and_extra_spacing.txt +0 -0
  334. {play_parser-1.2.0 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/hints.json +0 -0
  335. {play_parser-1.2.0 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/optimal.json +0 -0
  336. {play_parser-1.2.0 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/190_ocr_header_footer_intrusion_2.txt +0 -0
  337. {play_parser-1.2.0 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/hints.json +0 -0
  338. {play_parser-1.2.0 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/optimal.json +0 -0
  339. {play_parser-1.2.0 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/191_ocr_ligature_artefacts_1.txt +0 -0
  340. {play_parser-1.2.0 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/hints.json +0 -0
  341. {play_parser-1.2.0 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/optimal.json +0 -0
  342. {play_parser-1.2.0 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/192_ocr_ligature_artefacts_2.txt +0 -0
  343. {play_parser-1.2.0 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/hints.json +0 -0
  344. {play_parser-1.2.0 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/optimal.json +0 -0
  345. {play_parser-1.2.0 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/193_ocr_curly_quote_damage_1.txt +0 -0
  346. {play_parser-1.2.0 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/hints.json +0 -0
  347. {play_parser-1.2.0 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/optimal.json +0 -0
  348. {play_parser-1.2.0 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/194_ocr_curly_quote_damage_2.txt +0 -0
  349. {play_parser-1.2.0 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/hints.json +0 -0
  350. {play_parser-1.2.0 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/optimal.json +0 -0
  351. {play_parser-1.2.0 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/195_ocr_soft_hyphen_artefact_1.txt +0 -0
  352. {play_parser-1.2.0 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/hints.json +0 -0
  353. {play_parser-1.2.0 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/optimal.json +0 -0
  354. {play_parser-1.2.0 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/196_ocr_soft_hyphen_artefact_2.txt +0 -0
  355. {play_parser-1.2.0 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/hints.json +0 -0
  356. {play_parser-1.2.0 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/optimal.json +0 -0
  357. {play_parser-1.2.0 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/197_ocr_broken_speaker_colon_1.txt +0 -0
  358. {play_parser-1.2.0 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/hints.json +0 -0
  359. {play_parser-1.2.0 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/optimal.json +0 -0
  360. {play_parser-1.2.0 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/198_ocr_broken_speaker_colon_2.txt +0 -0
  361. {play_parser-1.2.0 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/hints.json +0 -0
  362. {play_parser-1.2.0 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/optimal.json +0 -0
  363. {play_parser-1.2.0 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/199_ocr_line_wrap_with_indentation_1.txt +0 -0
  364. {play_parser-1.2.0 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/hints.json +0 -0
  365. {play_parser-1.2.0 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/optimal.json +0 -0
  366. {play_parser-1.2.0 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/19_preamble_without_clear_marker.txt +0 -0
  367. {play_parser-1.2.0 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/hints.json +0 -0
  368. {play_parser-1.2.0 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/optimal.json +0 -0
  369. {play_parser-1.2.0 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/200_ocr_line_wrap_with_indentation_2.txt +0 -0
  370. {play_parser-1.2.0 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/hints.json +0 -0
  371. {play_parser-1.2.0 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/optimal.json +0 -0
  372. {play_parser-1.2.0 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/201_cast_list_descriptions_columns_1.txt +0 -0
  373. {play_parser-1.2.0 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/hints.json +0 -0
  374. {play_parser-1.2.0 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/optimal.json +0 -0
  375. {play_parser-1.2.0 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/202_cast_list_descriptions_columns_2.txt +0 -0
  376. {play_parser-1.2.0 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/hints.json +0 -0
  377. {play_parser-1.2.0 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/optimal.json +0 -0
  378. {play_parser-1.2.0 → play_parser-1.2.2}/data/203_cast_group_roles_1/203_cast_group_roles_1.txt +0 -0
  379. {play_parser-1.2.0 → play_parser-1.2.2}/data/203_cast_group_roles_1/hints.json +0 -0
  380. {play_parser-1.2.0 → play_parser-1.2.2}/data/203_cast_group_roles_1/optimal.json +0 -0
  381. {play_parser-1.2.0 → play_parser-1.2.2}/data/204_cast_group_roles_2/204_cast_group_roles_2.txt +0 -0
  382. {play_parser-1.2.0 → play_parser-1.2.2}/data/204_cast_group_roles_2/hints.json +0 -0
  383. {play_parser-1.2.0 → play_parser-1.2.2}/data/204_cast_group_roles_2/optimal.json +0 -0
  384. {play_parser-1.2.0 → play_parser-1.2.2}/data/205_cast_alias_roles_1/205_cast_alias_roles_1.txt +0 -0
  385. {play_parser-1.2.0 → play_parser-1.2.2}/data/205_cast_alias_roles_1/hints.json +0 -0
  386. {play_parser-1.2.0 → play_parser-1.2.2}/data/205_cast_alias_roles_1/optimal.json +0 -0
  387. {play_parser-1.2.0 → play_parser-1.2.2}/data/206_cast_alias_roles_2/206_cast_alias_roles_2.txt +0 -0
  388. {play_parser-1.2.0 → play_parser-1.2.2}/data/206_cast_alias_roles_2/hints.json +0 -0
  389. {play_parser-1.2.0 → play_parser-1.2.2}/data/206_cast_alias_roles_2/optimal.json +0 -0
  390. {play_parser-1.2.0 → play_parser-1.2.2}/data/207_cast_no_separator_1/207_cast_no_separator_1.txt +0 -0
  391. {play_parser-1.2.0 → play_parser-1.2.2}/data/207_cast_no_separator_1/hints.json +0 -0
  392. {play_parser-1.2.0 → play_parser-1.2.2}/data/207_cast_no_separator_1/optimal.json +0 -0
  393. {play_parser-1.2.0 → play_parser-1.2.2}/data/208_cast_no_separator_2/208_cast_no_separator_2.txt +0 -0
  394. {play_parser-1.2.0 → play_parser-1.2.2}/data/208_cast_no_separator_2/hints.json +0 -0
  395. {play_parser-1.2.0 → play_parser-1.2.2}/data/208_cast_no_separator_2/optimal.json +0 -0
  396. {play_parser-1.2.0 → play_parser-1.2.2}/data/209_cast_non_speaking_1/209_cast_non_speaking_1.txt +0 -0
  397. {play_parser-1.2.0 → play_parser-1.2.2}/data/209_cast_non_speaking_1/hints.json +0 -0
  398. {play_parser-1.2.0 → play_parser-1.2.2}/data/209_cast_non_speaking_1/optimal.json +0 -0
  399. {play_parser-1.2.0 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/20_single_character_monologue_with_directions.txt +0 -0
  400. {play_parser-1.2.0 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/hints.json +0 -0
  401. {play_parser-1.2.0 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/optimal.json +0 -0
  402. {play_parser-1.2.0 → play_parser-1.2.2}/data/210_cast_non_speaking_2/210_cast_non_speaking_2.txt +0 -0
  403. {play_parser-1.2.0 → play_parser-1.2.2}/data/210_cast_non_speaking_2/hints.json +0 -0
  404. {play_parser-1.2.0 → play_parser-1.2.2}/data/210_cast_non_speaking_2/optimal.json +0 -0
  405. {play_parser-1.2.0 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/211_classical_abbreviated_sigla_1.txt +0 -0
  406. {play_parser-1.2.0 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/hints.json +0 -0
  407. {play_parser-1.2.0 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/optimal.json +0 -0
  408. {play_parser-1.2.0 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/212_classical_abbreviated_sigla_2.txt +0 -0
  409. {play_parser-1.2.0 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/hints.json +0 -0
  410. {play_parser-1.2.0 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/optimal.json +0 -0
  411. {play_parser-1.2.0 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/213_marginal_speaker_labels_1.txt +0 -0
  412. {play_parser-1.2.0 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/hints.json +0 -0
  413. {play_parser-1.2.0 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/optimal.json +0 -0
  414. {play_parser-1.2.0 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/214_marginal_speaker_labels_2.txt +0 -0
  415. {play_parser-1.2.0 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/hints.json +0 -0
  416. {play_parser-1.2.0 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/optimal.json +0 -0
  417. {play_parser-1.2.0 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/215_numbered_verse_lines_1.txt +0 -0
  418. {play_parser-1.2.0 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/hints.json +0 -0
  419. {play_parser-1.2.0 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/optimal.json +0 -0
  420. {play_parser-1.2.0 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/216_numbered_verse_lines_2.txt +0 -0
  421. {play_parser-1.2.0 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/hints.json +0 -0
  422. {play_parser-1.2.0 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/optimal.json +0 -0
  423. {play_parser-1.2.0 → play_parser-1.2.2}/data/217_roman_structure_1/217_roman_structure_1.txt +0 -0
  424. {play_parser-1.2.0 → play_parser-1.2.2}/data/217_roman_structure_1/hints.json +0 -0
  425. {play_parser-1.2.0 → play_parser-1.2.2}/data/217_roman_structure_1/optimal.json +0 -0
  426. {play_parser-1.2.0 → play_parser-1.2.2}/data/218_roman_structure_2/218_roman_structure_2.txt +0 -0
  427. {play_parser-1.2.0 → play_parser-1.2.2}/data/218_roman_structure_2/hints.json +0 -0
  428. {play_parser-1.2.0 → play_parser-1.2.2}/data/218_roman_structure_2/optimal.json +0 -0
  429. {play_parser-1.2.0 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/219_enter_exit_conventions_1.txt +0 -0
  430. {play_parser-1.2.0 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/hints.json +0 -0
  431. {play_parser-1.2.0 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/optimal.json +0 -0
  432. {play_parser-1.2.0 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/220_enter_exit_conventions_2.txt +0 -0
  433. {play_parser-1.2.0 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/hints.json +0 -0
  434. {play_parser-1.2.0 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/optimal.json +0 -0
  435. {play_parser-1.2.0 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/221_timestamp_inline_dialogue_1.txt +0 -0
  436. {play_parser-1.2.0 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/hints.json +0 -0
  437. {play_parser-1.2.0 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/optimal.json +0 -0
  438. {play_parser-1.2.0 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/222_timestamp_inline_dialogue_2.txt +0 -0
  439. {play_parser-1.2.0 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/hints.json +0 -0
  440. {play_parser-1.2.0 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/optimal.json +0 -0
  441. {play_parser-1.2.0 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/223_bracketed_speaker_subtitles_1.txt +0 -0
  442. {play_parser-1.2.0 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/hints.json +0 -0
  443. {play_parser-1.2.0 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/optimal.json +0 -0
  444. {play_parser-1.2.0 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/224_bracketed_speaker_subtitles_2.txt +0 -0
  445. {play_parser-1.2.0 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/hints.json +0 -0
  446. {play_parser-1.2.0 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/optimal.json +0 -0
  447. {play_parser-1.2.0 → play_parser-1.2.2}/data/225_srt_chunks_1/225_srt_chunks_1.txt +0 -0
  448. {play_parser-1.2.0 → play_parser-1.2.2}/data/225_srt_chunks_1/hints.json +0 -0
  449. {play_parser-1.2.0 → play_parser-1.2.2}/data/225_srt_chunks_1/optimal.json +0 -0
  450. {play_parser-1.2.0 → play_parser-1.2.2}/data/226_srt_chunks_2/226_srt_chunks_2.txt +0 -0
  451. {play_parser-1.2.0 → play_parser-1.2.2}/data/226_srt_chunks_2/hints.json +0 -0
  452. {play_parser-1.2.0 → play_parser-1.2.2}/data/226_srt_chunks_2/optimal.json +0 -0
  453. {play_parser-1.2.0 → play_parser-1.2.2}/data/227_webvtt_cues_1/227_webvtt_cues_1.txt +0 -0
  454. {play_parser-1.2.0 → play_parser-1.2.2}/data/227_webvtt_cues_1/hints.json +0 -0
  455. {play_parser-1.2.0 → play_parser-1.2.2}/data/227_webvtt_cues_1/optimal.json +0 -0
  456. {play_parser-1.2.0 → play_parser-1.2.2}/data/228_webvtt_cues_2/228_webvtt_cues_2.txt +0 -0
  457. {play_parser-1.2.0 → play_parser-1.2.2}/data/228_webvtt_cues_2/hints.json +0 -0
  458. {play_parser-1.2.0 → play_parser-1.2.2}/data/228_webvtt_cues_2/optimal.json +0 -0
  459. {play_parser-1.2.0 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/229_speaker_dash_transcript_1.txt +0 -0
  460. {play_parser-1.2.0 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/hints.json +0 -0
  461. {play_parser-1.2.0 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/optimal.json +0 -0
  462. {play_parser-1.2.0 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/230_speaker_dash_transcript_2.txt +0 -0
  463. {play_parser-1.2.0 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/hints.json +0 -0
  464. {play_parser-1.2.0 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/optimal.json +0 -0
  465. {play_parser-1.2.0 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/231_markdown_bold_speakers_1.txt +0 -0
  466. {play_parser-1.2.0 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/hints.json +0 -0
  467. {play_parser-1.2.0 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/optimal.json +0 -0
  468. {play_parser-1.2.0 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/232_markdown_bold_speakers_2.txt +0 -0
  469. {play_parser-1.2.0 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/hints.json +0 -0
  470. {play_parser-1.2.0 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/optimal.json +0 -0
  471. {play_parser-1.2.0 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/233_markdown_italic_stage_1.txt +0 -0
  472. {play_parser-1.2.0 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/hints.json +0 -0
  473. {play_parser-1.2.0 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/optimal.json +0 -0
  474. {play_parser-1.2.0 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/234_markdown_italic_stage_2.txt +0 -0
  475. {play_parser-1.2.0 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/hints.json +0 -0
  476. {play_parser-1.2.0 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/optimal.json +0 -0
  477. {play_parser-1.2.0 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/235_markdown_blockquote_dialogue_1.txt +0 -0
  478. {play_parser-1.2.0 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/hints.json +0 -0
  479. {play_parser-1.2.0 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/optimal.json +0 -0
  480. {play_parser-1.2.0 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/236_markdown_blockquote_dialogue_2.txt +0 -0
  481. {play_parser-1.2.0 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/hints.json +0 -0
  482. {play_parser-1.2.0 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/optimal.json +0 -0
  483. {play_parser-1.2.0 → play_parser-1.2.2}/data/237_html_entities_1/237_html_entities_1.txt +0 -0
  484. {play_parser-1.2.0 → play_parser-1.2.2}/data/237_html_entities_1/hints.json +0 -0
  485. {play_parser-1.2.0 → play_parser-1.2.2}/data/237_html_entities_1/optimal.json +0 -0
  486. {play_parser-1.2.0 → play_parser-1.2.2}/data/238_html_entities_2/238_html_entities_2.txt +0 -0
  487. {play_parser-1.2.0 → play_parser-1.2.2}/data/238_html_entities_2/hints.json +0 -0
  488. {play_parser-1.2.0 → play_parser-1.2.2}/data/238_html_entities_2/optimal.json +0 -0
  489. {play_parser-1.2.0 → play_parser-1.2.2}/data/239_web_footer_copied_1/239_web_footer_copied_1.txt +0 -0
  490. {play_parser-1.2.0 → play_parser-1.2.2}/data/239_web_footer_copied_1/hints.json +0 -0
  491. {play_parser-1.2.0 → play_parser-1.2.2}/data/239_web_footer_copied_1/optimal.json +0 -0
  492. {play_parser-1.2.0 → play_parser-1.2.2}/data/240_web_footer_copied_2/240_web_footer_copied_2.txt +0 -0
  493. {play_parser-1.2.0 → play_parser-1.2.2}/data/240_web_footer_copied_2/hints.json +0 -0
  494. {play_parser-1.2.0 → play_parser-1.2.2}/data/240_web_footer_copied_2/optimal.json +0 -0
  495. {play_parser-1.2.0 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/60_audition_01_two_person_drama.txt +0 -0
  496. {play_parser-1.2.0 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/hints.json +0 -0
  497. {play_parser-1.2.0 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/optimal.json +0 -0
  498. {play_parser-1.2.0 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/61_audition_02_comedic_monologue.txt +0 -0
  499. {play_parser-1.2.0 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/hints.json +0 -0
  500. {play_parser-1.2.0 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/optimal.json +0 -0
  501. {play_parser-1.2.0 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/62_audition_03_one_person_voice_message.txt +0 -0
  502. {play_parser-1.2.0 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/hints.json +0 -0
  503. {play_parser-1.2.0 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/optimal.json +0 -0
  504. {play_parser-1.2.0 → play_parser-1.2.2}/data/63_audition_04_period_scene/63_audition_04_period_scene.txt +0 -0
  505. {play_parser-1.2.0 → play_parser-1.2.2}/data/63_audition_04_period_scene/hints.json +0 -0
  506. {play_parser-1.2.0 → play_parser-1.2.2}/data/63_audition_04_period_scene/optimal.json +0 -0
  507. {play_parser-1.2.0 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/64_audition_05_sci_fi_interrogation.txt +0 -0
  508. {play_parser-1.2.0 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/hints.json +0 -0
  509. {play_parser-1.2.0 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/optimal.json +0 -0
  510. {play_parser-1.2.0 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/65_audition_06_romantic_comedy.txt +0 -0
  511. {play_parser-1.2.0 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/hints.json +0 -0
  512. {play_parser-1.2.0 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/optimal.json +0 -0
  513. {play_parser-1.2.0 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/66_audition_07_thriller_scene.txt +0 -0
  514. {play_parser-1.2.0 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/hints.json +0 -0
  515. {play_parser-1.2.0 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/optimal.json +0 -0
  516. {play_parser-1.2.0 → play_parser-1.2.2}/data/67_audition_08_duologue_family/67_audition_08_duologue_family.txt +0 -0
  517. {play_parser-1.2.0 → play_parser-1.2.2}/data/67_audition_08_duologue_family/hints.json +0 -0
  518. {play_parser-1.2.0 → play_parser-1.2.2}/data/67_audition_08_duologue_family/optimal.json +0 -0
  519. {play_parser-1.2.0 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/68_audition_09_silent_stage_directions.txt +0 -0
  520. {play_parser-1.2.0 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/hints.json +0 -0
  521. {play_parser-1.2.0 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/optimal.json +0 -0
  522. {play_parser-1.2.0 → play_parser-1.2.2}/data/69_audition_10_mockumentary/69_audition_10_mockumentary.txt +0 -0
  523. {play_parser-1.2.0 → play_parser-1.2.2}/data/69_audition_10_mockumentary/hints.json +0 -0
  524. {play_parser-1.2.0 → play_parser-1.2.2}/data/69_audition_10_mockumentary/optimal.json +0 -0
  525. {play_parser-1.2.0 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/70_audition_11_classical_heightened.txt +0 -0
  526. {play_parser-1.2.0 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/hints.json +0 -0
  527. {play_parser-1.2.0 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/optimal.json +0 -0
  528. {play_parser-1.2.0 → play_parser-1.2.2}/data/71_audition_12_police_procedural/71_audition_12_police_procedural.txt +0 -0
  529. {play_parser-1.2.0 → play_parser-1.2.2}/data/71_audition_12_police_procedural/hints.json +0 -0
  530. {play_parser-1.2.0 → play_parser-1.2.2}/data/71_audition_12_police_procedural/optimal.json +0 -0
  531. {play_parser-1.2.0 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/72_audition_13_child_actor_scene.txt +0 -0
  532. {play_parser-1.2.0 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/hints.json +0 -0
  533. {play_parser-1.2.0 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/optimal.json +0 -0
  534. {play_parser-1.2.0 → play_parser-1.2.2}/data/73_audition_14_soap_scene/73_audition_14_soap_scene.txt +0 -0
  535. {play_parser-1.2.0 → play_parser-1.2.2}/data/73_audition_14_soap_scene/hints.json +0 -0
  536. {play_parser-1.2.0 → play_parser-1.2.2}/data/73_audition_14_soap_scene/optimal.json +0 -0
  537. {play_parser-1.2.0 → play_parser-1.2.2}/data/74_audition_15_horror_scene/74_audition_15_horror_scene.txt +0 -0
  538. {play_parser-1.2.0 → play_parser-1.2.2}/data/74_audition_15_horror_scene/hints.json +0 -0
  539. {play_parser-1.2.0 → play_parser-1.2.2}/data/74_audition_15_horror_scene/optimal.json +0 -0
  540. {play_parser-1.2.0 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/75_audition_16_workplace_scene.txt +0 -0
  541. {play_parser-1.2.0 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/hints.json +0 -0
  542. {play_parser-1.2.0 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/optimal.json +0 -0
  543. {play_parser-1.2.0 → play_parser-1.2.2}/data/76_audition_17_legal_scene/76_audition_17_legal_scene.txt +0 -0
  544. {play_parser-1.2.0 → play_parser-1.2.2}/data/76_audition_17_legal_scene/hints.json +0 -0
  545. {play_parser-1.2.0 → play_parser-1.2.2}/data/76_audition_17_legal_scene/optimal.json +0 -0
  546. {play_parser-1.2.0 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/77_audition_18_fantasy_scene.txt +0 -0
  547. {play_parser-1.2.0 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/hints.json +0 -0
  548. {play_parser-1.2.0 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/optimal.json +0 -0
  549. {play_parser-1.2.0 → play_parser-1.2.2}/data/78_audition_19_radio_play/78_audition_19_radio_play.txt +0 -0
  550. {play_parser-1.2.0 → play_parser-1.2.2}/data/78_audition_19_radio_play/hints.json +0 -0
  551. {play_parser-1.2.0 → play_parser-1.2.2}/data/78_audition_19_radio_play/optimal.json +0 -0
  552. {play_parser-1.2.0 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/79_audition_20_musical_book_scene.txt +0 -0
  553. {play_parser-1.2.0 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/hints.json +0 -0
  554. {play_parser-1.2.0 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/optimal.json +0 -0
  555. {play_parser-1.2.0 → play_parser-1.2.2}/data/80_colon_cast_and_scene/80_colon_cast_and_scene.txt +0 -0
  556. {play_parser-1.2.0 → play_parser-1.2.2}/data/80_colon_cast_and_scene/hints.json +0 -0
  557. {play_parser-1.2.0 → play_parser-1.2.2}/data/80_colon_cast_and_scene/optimal.json +0 -0
  558. {play_parser-1.2.0 → play_parser-1.2.2}/data/81_bare_speaker_acts/81_bare_speaker_acts.txt +0 -0
  559. {play_parser-1.2.0 → play_parser-1.2.2}/data/81_bare_speaker_acts/hints.json +0 -0
  560. {play_parser-1.2.0 → play_parser-1.2.2}/data/81_bare_speaker_acts/optimal.json +0 -0
  561. {play_parser-1.2.0 → play_parser-1.2.2}/data/82_dot_inline_comedy/82_dot_inline_comedy.txt +0 -0
  562. {play_parser-1.2.0 → play_parser-1.2.2}/data/82_dot_inline_comedy/hints.json +0 -0
  563. {play_parser-1.2.0 → play_parser-1.2.2}/data/82_dot_inline_comedy/optimal.json +0 -0
  564. {play_parser-1.2.0 → play_parser-1.2.2}/data/83_dot_block_form/83_dot_block_form.txt +0 -0
  565. {play_parser-1.2.0 → play_parser-1.2.2}/data/83_dot_block_form/hints.json +0 -0
  566. {play_parser-1.2.0 → play_parser-1.2.2}/data/83_dot_block_form/optimal.json +0 -0
  567. {play_parser-1.2.0 → play_parser-1.2.2}/data/84_bracket_directions/84_bracket_directions.txt +0 -0
  568. {play_parser-1.2.0 → play_parser-1.2.2}/data/84_bracket_directions/hints.json +0 -0
  569. {play_parser-1.2.0 → play_parser-1.2.2}/data/84_bracket_directions/optimal.json +0 -0
  570. {play_parser-1.2.0 → play_parser-1.2.2}/data/85_monologue_parentheses/85_monologue_parentheses.txt +0 -0
  571. {play_parser-1.2.0 → play_parser-1.2.2}/data/85_monologue_parentheses/hints.json +0 -0
  572. {play_parser-1.2.0 → play_parser-1.2.2}/data/85_monologue_parentheses/optimal.json +0 -0
  573. {play_parser-1.2.0 → play_parser-1.2.2}/data/86_no_dialogue_physical/86_no_dialogue_physical.txt +0 -0
  574. {play_parser-1.2.0 → play_parser-1.2.2}/data/86_no_dialogue_physical/hints.json +0 -0
  575. {play_parser-1.2.0 → play_parser-1.2.2}/data/86_no_dialogue_physical/optimal.json +0 -0
  576. {play_parser-1.2.0 → play_parser-1.2.2}/data/87_modern_act_words/87_modern_act_words.txt +0 -0
  577. {play_parser-1.2.0 → play_parser-1.2.2}/data/87_modern_act_words/hints.json +0 -0
  578. {play_parser-1.2.0 → play_parser-1.2.2}/data/87_modern_act_words/optimal.json +0 -0
  579. {play_parser-1.2.0 → play_parser-1.2.2}/data/88_screenplay_slugline/88_screenplay_slugline.txt +0 -0
  580. {play_parser-1.2.0 → play_parser-1.2.2}/data/88_screenplay_slugline/hints.json +0 -0
  581. {play_parser-1.2.0 → play_parser-1.2.2}/data/88_screenplay_slugline/optimal.json +0 -0
  582. {play_parser-1.2.0 → play_parser-1.2.2}/data/89_radio_sfx/89_radio_sfx.txt +0 -0
  583. {play_parser-1.2.0 → play_parser-1.2.2}/data/89_radio_sfx/hints.json +0 -0
  584. {play_parser-1.2.0 → play_parser-1.2.2}/data/89_radio_sfx/optimal.json +0 -0
  585. {play_parser-1.2.0 → play_parser-1.2.2}/data/90_mixed_inline_stage/90_mixed_inline_stage.txt +0 -0
  586. {play_parser-1.2.0 → play_parser-1.2.2}/data/90_mixed_inline_stage/hints.json +0 -0
  587. {play_parser-1.2.0 → play_parser-1.2.2}/data/90_mixed_inline_stage/optimal.json +0 -0
  588. {play_parser-1.2.0 → play_parser-1.2.2}/data/91_title_author_immediate/91_title_author_immediate.txt +0 -0
  589. {play_parser-1.2.0 → play_parser-1.2.2}/data/91_title_author_immediate/hints.json +0 -0
  590. {play_parser-1.2.0 → play_parser-1.2.2}/data/91_title_author_immediate/optimal.json +0 -0
  591. {play_parser-1.2.0 → play_parser-1.2.2}/data/92_cast_commas/92_cast_commas.txt +0 -0
  592. {play_parser-1.2.0 → play_parser-1.2.2}/data/92_cast_commas/hints.json +0 -0
  593. {play_parser-1.2.0 → play_parser-1.2.2}/data/92_cast_commas/optimal.json +0 -0
  594. {play_parser-1.2.0 → play_parser-1.2.2}/data/93_multiscene_no_acts/93_multiscene_no_acts.txt +0 -0
  595. {play_parser-1.2.0 → play_parser-1.2.2}/data/93_multiscene_no_acts/hints.json +0 -0
  596. {play_parser-1.2.0 → play_parser-1.2.2}/data/93_multiscene_no_acts/optimal.json +0 -0
  597. {play_parser-1.2.0 → play_parser-1.2.2}/data/94_stage_speaker_action/94_stage_speaker_action.txt +0 -0
  598. {play_parser-1.2.0 → play_parser-1.2.2}/data/94_stage_speaker_action/hints.json +0 -0
  599. {play_parser-1.2.0 → play_parser-1.2.2}/data/94_stage_speaker_action/optimal.json +0 -0
  600. {play_parser-1.2.0 → play_parser-1.2.2}/data/95_character_names_spaces/95_character_names_spaces.txt +0 -0
  601. {play_parser-1.2.0 → play_parser-1.2.2}/data/95_character_names_spaces/hints.json +0 -0
  602. {play_parser-1.2.0 → play_parser-1.2.2}/data/95_character_names_spaces/optimal.json +0 -0
  603. {play_parser-1.2.0 → play_parser-1.2.2}/data/96_long_preamble_marker/96_long_preamble_marker.txt +0 -0
  604. {play_parser-1.2.0 → play_parser-1.2.2}/data/96_long_preamble_marker/hints.json +0 -0
  605. {play_parser-1.2.0 → play_parser-1.2.2}/data/96_long_preamble_marker/optimal.json +0 -0
  606. {play_parser-1.2.0 → play_parser-1.2.2}/data/97_single_character_with_end/97_single_character_with_end.txt +0 -0
  607. {play_parser-1.2.0 → play_parser-1.2.2}/data/97_single_character_with_end/hints.json +0 -0
  608. {play_parser-1.2.0 → play_parser-1.2.2}/data/97_single_character_with_end/optimal.json +0 -0
  609. {play_parser-1.2.0 → play_parser-1.2.2}/data/98_colon_scene_false_positive/98_colon_scene_false_positive.txt +0 -0
  610. {play_parser-1.2.0 → play_parser-1.2.2}/data/98_colon_scene_false_positive/hints.json +0 -0
  611. {play_parser-1.2.0 → play_parser-1.2.2}/data/98_colon_scene_false_positive/optimal.json +0 -0
  612. {play_parser-1.2.0 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/99_dot_signature_not_speaker.txt +0 -0
  613. {play_parser-1.2.0 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/hints.json +0 -0
  614. {play_parser-1.2.0 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/optimal.json +0 -0
  615. {play_parser-1.2.0 → play_parser-1.2.2}/data/A Midsummer Night's Dream/A Midsummer Night's Dream.txt +0 -0
  616. {play_parser-1.2.0 → play_parser-1.2.2}/data/A Midsummer Night's Dream/optimal.json +0 -0
  617. {play_parser-1.2.0 → play_parser-1.2.2}/data/All's Well That Ends Well/All's Well That Ends Well.txt +0 -0
  618. {play_parser-1.2.0 → play_parser-1.2.2}/data/All's Well That Ends Well/optimal.json +0 -0
  619. {play_parser-1.2.0 → play_parser-1.2.2}/data/Antony and Cleopatra/Antony and Cleopatra.txt +0 -0
  620. {play_parser-1.2.0 → play_parser-1.2.2}/data/Antony and Cleopatra/optimal.json +0 -0
  621. {play_parser-1.2.0 → play_parser-1.2.2}/data/As You Like It/As You Like It.txt +0 -0
  622. {play_parser-1.2.0 → play_parser-1.2.2}/data/As You Like It/optimal.json +0 -0
  623. {play_parser-1.2.0 → play_parser-1.2.2}/data/CORPUS_FORMATS.md +0 -0
  624. {play_parser-1.2.0 → play_parser-1.2.2}/data/Coriolanus/Coriolanus.txt +0 -0
  625. {play_parser-1.2.0 → play_parser-1.2.2}/data/Coriolanus/optimal.json +0 -0
  626. {play_parser-1.2.0 → play_parser-1.2.2}/data/Cymbeline/Cymbeline.txt +0 -0
  627. {play_parser-1.2.0 → play_parser-1.2.2}/data/Cymbeline/optimal.json +0 -0
  628. {play_parser-1.2.0 → play_parser-1.2.2}/data/Gin vs Whiskey/Gin vs Whiskey.txt +0 -0
  629. {play_parser-1.2.0 → play_parser-1.2.2}/data/Gin vs Whiskey/hints.json +0 -0
  630. {play_parser-1.2.0 → play_parser-1.2.2}/data/Gin vs Whiskey/optimal.json +0 -0
  631. {play_parser-1.2.0 → play_parser-1.2.2}/data/Hamlet/Hamlet.txt +0 -0
  632. {play_parser-1.2.0 → play_parser-1.2.2}/data/Hamlet/optimal.json +0 -0
  633. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry IV, Part 1/Henry IV, Part 1.txt +0 -0
  634. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry IV, Part 1/optimal.json +0 -0
  635. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry IV, Part 2/Henry IV, Part 2.txt +0 -0
  636. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry IV, Part 2/optimal.json +0 -0
  637. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry V/Henry V.txt +0 -0
  638. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry V/optimal.json +0 -0
  639. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 1/Henry VI, Part 1.txt +0 -0
  640. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 1/optimal.json +0 -0
  641. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 2/Henry VI, Part 2.txt +0 -0
  642. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 2/optimal.json +0 -0
  643. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 3/Henry VI, Part 3.txt +0 -0
  644. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VI, Part 3/optimal.json +0 -0
  645. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VIII/Henry VIII.txt +0 -0
  646. {play_parser-1.2.0 → play_parser-1.2.2}/data/Henry VIII/optimal.json +0 -0
  647. {play_parser-1.2.0 → play_parser-1.2.2}/data/Julius Caesar/Julius Caesar.txt +0 -0
  648. {play_parser-1.2.0 → play_parser-1.2.2}/data/Julius Caesar/optimal.json +0 -0
  649. {play_parser-1.2.0 → play_parser-1.2.2}/data/King John/King John.txt +0 -0
  650. {play_parser-1.2.0 → play_parser-1.2.2}/data/King John/optimal.json +0 -0
  651. {play_parser-1.2.0 → play_parser-1.2.2}/data/King Lear/King Lear.txt +0 -0
  652. {play_parser-1.2.0 → play_parser-1.2.2}/data/King Lear/optimal.json +0 -0
  653. {play_parser-1.2.0 → play_parser-1.2.2}/data/Love's Labour's Lost/Love's Labour's Lost.txt +0 -0
  654. {play_parser-1.2.0 → play_parser-1.2.2}/data/Love's Labour's Lost/optimal.json +0 -0
  655. {play_parser-1.2.0 → play_parser-1.2.2}/data/Macbeth/Macbeth.txt +0 -0
  656. {play_parser-1.2.0 → play_parser-1.2.2}/data/Macbeth/optimal.json +0 -0
  657. {play_parser-1.2.0 → play_parser-1.2.2}/data/Measure for Measure/Measure for Measure.txt +0 -0
  658. {play_parser-1.2.0 → play_parser-1.2.2}/data/Measure for Measure/optimal.json +0 -0
  659. {play_parser-1.2.0 → play_parser-1.2.2}/data/Much Ado About Nothing/Much Ado About Nothing.txt +0 -0
  660. {play_parser-1.2.0 → play_parser-1.2.2}/data/Much Ado About Nothing/optimal.json +0 -0
  661. {play_parser-1.2.0 → play_parser-1.2.2}/data/Othello/Othello.txt +0 -0
  662. {play_parser-1.2.0 → play_parser-1.2.2}/data/Othello/optimal.json +0 -0
  663. {play_parser-1.2.0 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/Pericles, Prince of Tyre.txt +0 -0
  664. {play_parser-1.2.0 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/optimal.json +0 -0
  665. {play_parser-1.2.0 → play_parser-1.2.2}/data/README.md +0 -0
  666. {play_parser-1.2.0 → play_parser-1.2.2}/data/Richard II/Richard II.txt +0 -0
  667. {play_parser-1.2.0 → play_parser-1.2.2}/data/Richard II/optimal.json +0 -0
  668. {play_parser-1.2.0 → play_parser-1.2.2}/data/Richard III/Richard III.txt +0 -0
  669. {play_parser-1.2.0 → play_parser-1.2.2}/data/Richard III/optimal.json +0 -0
  670. {play_parser-1.2.0 → play_parser-1.2.2}/data/Romeo and Juliet/Romeo and Juliet.txt +0 -0
  671. {play_parser-1.2.0 → play_parser-1.2.2}/data/Romeo and Juliet/optimal.json +0 -0
  672. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Comedy of Errors/The Comedy of Errors.txt +0 -0
  673. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Comedy of Errors/optimal.json +0 -0
  674. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Importance of Being Earnest/The Importance of Being Earnest.txt +0 -0
  675. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Importance of Being Earnest/hints.json +0 -0
  676. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Importance of Being Earnest/optimal.json +0 -0
  677. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Merchant of Venice/The Merchant of Venice.txt +0 -0
  678. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Merchant of Venice/optimal.json +0 -0
  679. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Merry Wives of Windsor/The Merry Wives of Windsor.txt +0 -0
  680. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Merry Wives of Windsor/optimal.json +0 -0
  681. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Taming of the Shrew/The Taming of the Shrew.txt +0 -0
  682. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Taming of the Shrew/optimal.json +0 -0
  683. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Tempest/The Tempest.txt +0 -0
  684. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Tempest/optimal.json +0 -0
  685. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Winter's Tale/The Winter's Tale.txt +0 -0
  686. {play_parser-1.2.0 → play_parser-1.2.2}/data/The Winter's Tale/optimal.json +0 -0
  687. {play_parser-1.2.0 → play_parser-1.2.2}/data/Timon of Athens/Timon of Athens.txt +0 -0
  688. {play_parser-1.2.0 → play_parser-1.2.2}/data/Timon of Athens/optimal.json +0 -0
  689. {play_parser-1.2.0 → play_parser-1.2.2}/data/Titus Andronicus/Titus Andronicus.txt +0 -0
  690. {play_parser-1.2.0 → play_parser-1.2.2}/data/Titus Andronicus/optimal.json +0 -0
  691. {play_parser-1.2.0 → play_parser-1.2.2}/data/Troilus and Cressida/Troilus and Cressida.txt +0 -0
  692. {play_parser-1.2.0 → play_parser-1.2.2}/data/Troilus and Cressida/optimal.json +0 -0
  693. {play_parser-1.2.0 → play_parser-1.2.2}/data/Twelfth Night/Twelfth Night.txt +0 -0
  694. {play_parser-1.2.0 → play_parser-1.2.2}/data/Twelfth Night/optimal.json +0 -0
  695. {play_parser-1.2.0 → play_parser-1.2.2}/data/Two Gentlemen of Verona/Two Gentlemen of Verona.txt +0 -0
  696. {play_parser-1.2.0 → play_parser-1.2.2}/data/Two Gentlemen of Verona/optimal.json +0 -0
  697. {play_parser-1.2.0 → play_parser-1.2.2}/docs/API.md +0 -0
  698. {play_parser-1.2.0 → play_parser-1.2.2}/docs/FORMAT_PROFILES.md +0 -0
  699. {play_parser-1.2.0 → play_parser-1.2.2}/docs/JSON_SCHEMA.md +0 -0
  700. {play_parser-1.2.0 → play_parser-1.2.2}/docs/play_document.schema.json +0 -0
  701. {play_parser-1.2.0 → play_parser-1.2.2}/setup.cfg +0 -0
  702. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/__main__.py +0 -0
  703. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/_io.py +0 -0
  704. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/cli/__init__.py +0 -0
  705. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/cli/main.py +0 -0
  706. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/__init__.py +0 -0
  707. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/assembler.py +0 -0
  708. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/builder.py +0 -0
  709. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/constants.py +0 -0
  710. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/document/text.py +0 -0
  711. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/domain/__init__.py +0 -0
  712. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/domain/play.py +0 -0
  713. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/ingestion/__init__.py +0 -0
  714. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/ingestion/ingestor.py +0 -0
  715. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/__init__.py +0 -0
  716. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/front_matter.py +0 -0
  717. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/fsm.py +0 -0
  718. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/hints.py +0 -0
  719. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/__init__.py +0 -0
  720. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/__init__.py +0 -0
  721. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/colon_inline.json +0 -0
  722. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_block.json +0 -0
  723. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_inline.json +0 -0
  724. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json +0 -0
  725. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json +0 -0
  726. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/loader.py +0 -0
  727. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/profiles/schema.py +0 -0
  728. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/speakers.py +0 -0
  729. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/structure.py +0 -0
  730. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/parsing/viterbi.py +0 -0
  731. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser/py.typed +0 -0
  732. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser.egg-info/dependency_links.txt +0 -0
  733. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser.egg-info/entry_points.txt +0 -0
  734. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser.egg-info/requires.txt +0 -0
  735. {play_parser-1.2.0 → play_parser-1.2.2}/src/play_parser.egg-info/top_level.txt +0 -0
  736. {play_parser-1.2.0 → play_parser-1.2.2}/tests/__init__.py +0 -0
  737. {play_parser-1.2.0 → 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.0
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.0"
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"
@@ -8,6 +8,7 @@ from play_parser.domain import Act, Character, Dialogue, Monologue, Play, Scene,
8
8
  from play_parser.ingestion import PlayIngestor
9
9
  from play_parser.parsers import FSMPlayParser, PlayParser, RuleBasedPlayParser, SimplePlayParser
10
10
  from play_parser.parsing.hints import PlayParseConfig, PlayParseHints, load_play_parse_config
11
+ from play_parser.parsing.profile_detection import ProfileDetectionResult, ProfileScore, detect_format_profile
11
12
  from play_parser.parsing.profiles import (
12
13
  FormatProfile,
13
14
  get_format_profile,
@@ -52,6 +53,9 @@ __all__ = [
52
53
  "FSMPlayParser",
53
54
  "PlayParseConfig",
54
55
  "PlayParseHints",
56
+ "ProfileDetectionResult",
57
+ "ProfileScore",
58
+ "detect_format_profile",
55
59
  "Scene",
56
60
  "Speech",
57
61
  "assemble_play_text",
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Literal, TypedDict
3
+ from typing import Any, Literal, TypedDict
4
4
 
5
5
 
6
6
  class ActStartEvent(TypedDict):
@@ -95,6 +95,8 @@ class PlayMetadataRequired(TypedDict):
95
95
 
96
96
  class PlayMetadata(PlayMetadataRequired, total=False):
97
97
  preamble: str
98
+ selected_format_profile: str
99
+ profile_detection: dict[str, Any]
98
100
 
99
101
 
100
102
  class PlayDocument(TypedDict):
@@ -12,7 +12,7 @@ from .types import PlayDocument, PlayEvent, PlayMetadata
12
12
 
13
13
  DEFAULT_DIFF_CONTEXT_SIZE = 50
14
14
  REQUIRED_METADATA_FIELDS = {"title", "author", "characters", "acts", "scenes", "stats"}
15
- OPTIONAL_METADATA_FIELDS = {"preamble"}
15
+ OPTIONAL_METADATA_FIELDS = {"preamble", "selected_format_profile", "profile_detection"}
16
16
  REQUIRED_DOCUMENT_FIELDS = {"metadata", "events"}
17
17
  REQUIRED_ACT_SUMMARY_FIELDS = {"act_number", "label"}
18
18
  REQUIRED_SCENE_SUMMARY_FIELDS = {"act_number", "scene_number", "label"}
@@ -12,6 +12,7 @@ from play_parser.domain import Play
12
12
  from play_parser.ingestion.ingestor import ProfileInput, resolve_format_profile
13
13
  from play_parser.parsing.fsm import FSMDocumentParser, PlayFSMScoring
14
14
  from play_parser.parsing.hints import PlayParseHints
15
+ from play_parser.parsing.profile_detection import detect_format_profile
15
16
 
16
17
  ParserMethod = Literal["simple", "rule", "fsm"]
17
18
 
@@ -79,6 +80,16 @@ class PlayParser(ABC):
79
80
  ).as_dict()
80
81
 
81
82
 
83
+ def _should_auto_detect_profile(profile: ProfileInput, profile_path: str | Path | None) -> bool:
84
+ if profile_path is not None:
85
+ return False
86
+ if profile is None:
87
+ return False
88
+ if isinstance(profile, str):
89
+ return profile.strip().lower().replace("-", "_") in {"auto", "default"}
90
+ return False
91
+
92
+
82
93
  def _coerce_hints(hints: PlayParseHints | Mapping[str, object] | None) -> PlayParseHints | None:
83
94
  if hints is None:
84
95
  return None
@@ -109,13 +120,23 @@ class SimplePlayParser(PlayParser):
109
120
  if existing_document is not None:
110
121
  return Play(existing_document)
111
122
 
112
- resolved_profile = resolve_format_profile(profile=profile, profile_path=profile_path)
123
+ coerced_hints = _coerce_hints(hints)
124
+ detection = None
125
+ if _should_auto_detect_profile(profile, profile_path):
126
+ detection = detect_format_profile(data, hints=coerced_hints)
127
+ resolved_profile = None if detection.selected_profile == "generic" else resolve_format_profile(profile=detection.selected_profile)
128
+ else:
129
+ resolved_profile = resolve_format_profile(profile=profile, profile_path=profile_path)
130
+
113
131
  document = build_play_document(
114
132
  data,
115
133
  play_name=Path(source_name).stem if source_name else None,
116
134
  profile=resolved_profile,
117
- hints=_coerce_hints(hints),
135
+ hints=coerced_hints,
118
136
  )
137
+ if detection is not None:
138
+ document.setdefault("metadata", {})["selected_format_profile"] = detection.selected_profile
139
+ document.setdefault("metadata", {})["profile_detection"] = detection.as_dict()
119
140
  return Play(document)
120
141
 
121
142
 
@@ -149,12 +170,22 @@ class FSMPlayParser(PlayParser):
149
170
  if existing_document is not None:
150
171
  return Play(existing_document)
151
172
 
152
- resolved_profile = resolve_format_profile(profile=profile, profile_path=profile_path)
173
+ coerced_hints = _coerce_hints(hints)
174
+ detection = None
175
+ if _should_auto_detect_profile(profile, profile_path):
176
+ detection = detect_format_profile(data, hints=coerced_hints)
177
+ resolved_profile = None if detection.selected_profile == "generic" else resolve_format_profile(profile=detection.selected_profile)
178
+ else:
179
+ resolved_profile = resolve_format_profile(profile=profile, profile_path=profile_path)
180
+
153
181
  document = FSMDocumentParser(
154
182
  profile=resolved_profile,
155
- hints=_coerce_hints(hints),
183
+ hints=coerced_hints,
156
184
  source_name=source_name,
157
185
  beam_width=self.beam_width,
158
186
  scoring=self.scoring,
159
187
  ).parse(data)
188
+ if detection is not None:
189
+ document.setdefault("metadata", {})["selected_format_profile"] = detection.selected_profile
190
+ document.setdefault("metadata", {})["profile_detection"] = detection.as_dict()
160
191
  return Play(document)
@@ -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
 
@@ -0,0 +1,310 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+
6
+ from play_parser.document.text import count_words
7
+ from play_parser.document.types import PlayEvent
8
+ from collections.abc import Mapping
9
+
10
+ from play_parser.parsing.hints import PlayParseHints
11
+ from play_parser.parsing.parser import parse_play_text
12
+ from play_parser.parsing.profiles import get_format_profile
13
+
14
+ CANDIDATE_FORMAT_PROFILES: tuple[str, ...] = (
15
+ "generic",
16
+ "dot_block",
17
+ "colon_inline",
18
+ "dot_inline",
19
+ "mixed_parenthetical",
20
+ "narrative_stage_heavy",
21
+ )
22
+ DEFAULT_SAMPLE_CHARS = 2_000
23
+ LOW_SCORE = -10_000
24
+
25
+
26
+ @dataclass(frozen=True, slots=True)
27
+ class ProfileScore:
28
+ profile: str
29
+ score: int
30
+ speeches: int = 0
31
+ unique_speakers: tuple[str, ...] = ()
32
+ repeated_speakers: tuple[str, ...] = ()
33
+ stage_directions: int = 0
34
+ meta_events: int = 0
35
+ avg_words_per_speech: float = 0.0
36
+ very_short_ratio: float = 0.0
37
+ very_long_ratio: float = 0.0
38
+ alternation_ratio: float = 0.0
39
+ error: str | None = None
40
+
41
+ def as_dict(self) -> dict[str, Any]:
42
+ return {
43
+ "profile": self.profile,
44
+ "score": self.score,
45
+ "speeches": self.speeches,
46
+ "unique_speakers": list(self.unique_speakers),
47
+ "repeated_speakers": list(self.repeated_speakers),
48
+ "stage_directions": self.stage_directions,
49
+ "meta_events": self.meta_events,
50
+ "avg_words_per_speech": self.avg_words_per_speech,
51
+ "very_short_ratio": self.very_short_ratio,
52
+ "very_long_ratio": self.very_long_ratio,
53
+ "alternation_ratio": self.alternation_ratio,
54
+ "error": self.error,
55
+ }
56
+
57
+
58
+ @dataclass(frozen=True, slots=True)
59
+ class ProfileDetectionResult:
60
+ selected_profile: str
61
+ confidence: str
62
+ sample_chars: int
63
+ scores: tuple[ProfileScore, ...]
64
+
65
+ def as_dict(self) -> dict[str, Any]:
66
+ return {
67
+ "method": "sample_score",
68
+ "selected_profile": self.selected_profile,
69
+ "confidence": self.confidence,
70
+ "sample_chars": self.sample_chars,
71
+ "scores": [score.as_dict() for score in self.scores],
72
+ }
73
+
74
+
75
+ def sample_script_body(text: str, *, max_chars: int = DEFAULT_SAMPLE_CHARS) -> str:
76
+ """Return a stable parser-detection sample without cutting mid-line when possible."""
77
+
78
+ stripped = text.strip()
79
+ if len(stripped) <= max_chars:
80
+ return stripped
81
+
82
+ sample = stripped[:max_chars]
83
+ last_newline = sample.rfind("\n")
84
+ if last_newline > max(300, max_chars // 3):
85
+ return sample[:last_newline].strip()
86
+ return sample.strip()
87
+
88
+
89
+ def score_parsed_events(events: list[PlayEvent]) -> ProfileScore:
90
+ return _score_events("<parsed>", events)
91
+
92
+
93
+ def score_profile_events(profile: str, events: list[PlayEvent], *, error: str | None = None) -> ProfileScore:
94
+ if error is not None:
95
+ return ProfileScore(profile=profile, score=LOW_SCORE, error=error)
96
+ return _score_events(profile, events)
97
+
98
+
99
+ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
100
+ if not events:
101
+ return ProfileScore(profile=profile, score=LOW_SCORE, error="No events detected")
102
+
103
+ speeches = [event for event in events if event.get("type") == "speech"]
104
+ stage_dirs = [event for event in events if event.get("type") == "stage_direction"]
105
+ meta = [event for event in events if event.get("type") == "meta"]
106
+
107
+ speakers = [
108
+ str(event.get("speaker") or "").strip()
109
+ for event in speeches
110
+ if str(event.get("speaker") or "").strip()
111
+ ]
112
+ unique_speakers = tuple(sorted(set(speakers)))
113
+
114
+ if not speeches or not unique_speakers:
115
+ return ProfileScore(
116
+ profile=profile,
117
+ score=LOW_SCORE,
118
+ speeches=len(speeches),
119
+ unique_speakers=unique_speakers,
120
+ stage_directions=len(stage_dirs),
121
+ meta_events=len(meta),
122
+ error="No speeches or speakers detected",
123
+ )
124
+
125
+ word_counts = [count_words(str(event.get("text") or "")) for event in speeches]
126
+ avg_words = sum(word_counts) / max(1, len(word_counts))
127
+ very_short_ratio = sum(1 for count in word_counts if count <= 1) / len(word_counts)
128
+ very_long_ratio = sum(1 for count in word_counts if count > 80) / len(word_counts)
129
+
130
+ plausible_speakers = [speaker for speaker in unique_speakers if _is_plausible_speaker_name(speaker)]
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
+ ]
140
+
141
+ repeated_speakers = tuple(sorted({speaker for speaker in unique_speakers if speakers.count(speaker) >= 2}))
142
+
143
+ speaker_changes = sum(1 for previous, current in zip(speakers, speakers[1:]) if previous != current)
144
+ alternation_ratio = speaker_changes / max(1, len(speakers) - 1)
145
+ meta_ratio = len(meta) / max(1, len(events))
146
+
147
+ score = 0
148
+ score += min(len(unique_speakers), 8) * 80
149
+ score += min(len(repeated_speakers), 8) * 100
150
+ score += min(len(speeches), 25) * 8
151
+ score += min(len(stage_dirs), 8) * 10
152
+
153
+ if 2 <= avg_words <= 35:
154
+ score += 150
155
+ elif 35 < avg_words <= 80:
156
+ score += 40
157
+ else:
158
+ score -= 150
159
+
160
+ if 0.25 <= alternation_ratio <= 1.0:
161
+ score += 60
162
+
163
+ if len(stage_dirs) > len(speeches) * 0.5:
164
+ score -= 180
165
+ if len(stage_dirs) > len(speeches):
166
+ score -= 240
167
+ if 0 < alternation_ratio < 0.15 and len(speeches) >= 6:
168
+ score -= 120
169
+ score -= int(meta_ratio * 250)
170
+ score -= implausible_speakers * 120
171
+ score -= len(suspicious_speakers) * 180
172
+ score -= len(one_off_multiword_speakers) * 180
173
+ score -= int(very_short_ratio * 180)
174
+ score -= int(very_long_ratio * 220)
175
+
176
+ return ProfileScore(
177
+ profile=profile,
178
+ score=score,
179
+ speeches=len(speeches),
180
+ unique_speakers=unique_speakers,
181
+ repeated_speakers=repeated_speakers,
182
+ stage_directions=len(stage_dirs),
183
+ meta_events=len(meta),
184
+ avg_words_per_speech=round(avg_words, 3),
185
+ very_short_ratio=round(very_short_ratio, 3),
186
+ very_long_ratio=round(very_long_ratio, 3),
187
+ alternation_ratio=round(alternation_ratio, 3),
188
+ )
189
+
190
+
191
+ def _is_plausible_speaker_name(value: str) -> bool:
192
+ if not value or len(value) > 40:
193
+ return False
194
+ if any(char in value for char in "?!,:;()[]{}"):
195
+ return False
196
+ parts = value.split()
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)
226
+
227
+
228
+ def detect_format_profile(
229
+ text: str,
230
+ *,
231
+ hints: PlayParseHints | Mapping[str, object] | None = None,
232
+ candidate_profiles: tuple[str, ...] | list[str] = CANDIDATE_FORMAT_PROFILES,
233
+ sample_chars: int = DEFAULT_SAMPLE_CHARS,
234
+ ) -> ProfileDetectionResult:
235
+ """Detect the most plausible built-in format profile for raw play text.
236
+
237
+ The detector parses only a short sample with each candidate profile and scores
238
+ the resulting dramatic structure. It is intended for profile selection, not
239
+ final document parsing.
240
+ """
241
+
242
+ sample = sample_script_body(text, max_chars=sample_chars)
243
+ coerced_hints = _coerce_hints(hints)
244
+ scores: list[ProfileScore] = []
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
+
259
+ for profile_name in _unique_profiles(candidate_profiles):
260
+ try:
261
+ profile = None if profile_name == "generic" else get_format_profile(profile_name)
262
+ events = parse_play_text(sample, profile=profile, hints=coerced_hints)
263
+ scores.append(score_profile_events(profile_name, events))
264
+ except Exception as exc: # pragma: no cover - defensive path depends on profile internals
265
+ scores.append(score_profile_events(profile_name, [], error=str(exc)))
266
+
267
+ scores.sort(key=lambda item: item.score, reverse=True)
268
+ if not scores:
269
+ raise ValueError("No candidate format profiles supplied")
270
+
271
+ best = scores[0]
272
+ second = scores[1] if len(scores) > 1 else None
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
278
+ return ProfileDetectionResult(
279
+ selected_profile=best.profile,
280
+ confidence=confidence,
281
+ sample_chars=len(sample),
282
+ scores=tuple(scores),
283
+ )
284
+
285
+
286
+ def _unique_profiles(profiles: tuple[str, ...] | list[str]) -> list[str]:
287
+ seen: set[str] = set()
288
+ output: list[str] = []
289
+ for profile in profiles:
290
+ if profile in seen:
291
+ continue
292
+ seen.add(profile)
293
+ output.append(profile)
294
+ return output
295
+
296
+
297
+ def _confidence(best: ProfileScore, second: ProfileScore | None) -> str:
298
+ if best.score < 250:
299
+ return "low"
300
+ if second is not None and best.score - second.score < 75:
301
+ return "medium"
302
+ return "high"
303
+
304
+
305
+ def _coerce_hints(hints: PlayParseHints | Mapping[str, object] | None) -> PlayParseHints | None:
306
+ if hints is None:
307
+ return None
308
+ if isinstance(hints, PlayParseHints):
309
+ return hints
310
+ return PlayParseHints(**dict(hints))
@@ -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.0
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
@@ -699,6 +699,7 @@ src/play_parser/parsing/front_matter.py
699
699
  src/play_parser/parsing/fsm.py
700
700
  src/play_parser/parsing/hints.py
701
701
  src/play_parser/parsing/parser.py
702
+ src/play_parser/parsing/profile_detection.py
702
703
  src/play_parser/parsing/speakers.py
703
704
  src/play_parser/parsing/speech.py
704
705
  src/play_parser/parsing/stage.py
@@ -715,19 +716,4 @@ src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json
715
716
  src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json
716
717
  tests/__init__.py
717
718
  tests/conftest.py
718
- tests/play_document_comparison.py
719
- tests/test_cli.py
720
- tests/test_corpus_inventory.py
721
- tests/test_corpus_optimal_json.py
722
- tests/test_document_roundtrip.py
723
- tests/test_domain.py
724
- tests/test_fsm_corpus_optimal_json.py
725
- tests/test_fsm_scoring.py
726
- tests/test_ingestor.py
727
- tests/test_json_schema.py
728
- tests/test_parser_core.py
729
- tests/test_parser_factory.py
730
- tests/test_profiles.py
731
- tests/test_public_api.py
732
- tests/test_validation_strict_types.py
733
- 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)