play-parser 1.2.1__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {play_parser-1.2.1/src/play_parser.egg-info → play_parser-1.2.2}/PKG-INFO +1 -1
- {play_parser-1.2.1 → play_parser-1.2.2}/pyproject.toml +1 -1
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/context.py +8 -7
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/parser.py +3 -3
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profile_detection.py +61 -4
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/speech.py +7 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/stage.py +15 -0
- {play_parser-1.2.1 → play_parser-1.2.2/src/play_parser.egg-info}/PKG-INFO +1 -1
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/SOURCES.txt +1 -17
- play_parser-1.2.2/tests/test_corpus_optimal_json.py +21 -0
- play_parser-1.2.1/tests/play_document_comparison.py +0 -41
- play_parser-1.2.1/tests/test_cli.py +0 -188
- play_parser-1.2.1/tests/test_corpus_inventory.py +0 -19
- play_parser-1.2.1/tests/test_corpus_optimal_json.py +0 -61
- play_parser-1.2.1/tests/test_document_roundtrip.py +0 -78
- play_parser-1.2.1/tests/test_domain.py +0 -109
- play_parser-1.2.1/tests/test_fsm_corpus_optimal_json.py +0 -61
- play_parser-1.2.1/tests/test_fsm_scoring.py +0 -45
- play_parser-1.2.1/tests/test_ingestor.py +0 -96
- play_parser-1.2.1/tests/test_json_schema.py +0 -53
- play_parser-1.2.1/tests/test_parser_core.py +0 -534
- play_parser-1.2.1/tests/test_parser_factory.py +0 -100
- play_parser-1.2.1/tests/test_profile_detection.py +0 -75
- play_parser-1.2.1/tests/test_profiles.py +0 -168
- play_parser-1.2.1/tests/test_public_api.py +0 -38
- play_parser-1.2.1/tests/test_validation_strict_types.py +0 -184
- play_parser-1.2.1/tests/test_viterbi_decoder.py +0 -49
- {play_parser-1.2.1 → play_parser-1.2.2}/CHANGELOG.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/LICENSE +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/MANIFEST.in +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/README.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/RELEASE.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/SECURITY.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/01_modern_two_hander_preamble_separator.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/01_modern_two_hander_preamble_separator/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/02_modern_three_characters_no_separator.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/02_modern_three_characters_no_separator/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/03_colon_format_one_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/03_colon_format_one_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/04_speaker_colon_multiscene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/04_speaker_colon_multiscene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/05_shakespeare_line_speakers.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/05_shakespeare_line_speakers/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/06_inline_stage_directions.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/06_inline_stage_directions/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/07_long_preamble_cast_setting_notes.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/07_long_preamble_cast_setting_notes/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/08_no_preamble_immediate_dialogue.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/08_no_preamble_immediate_dialogue/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/09_title_author_then_scene_no_act.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/09_title_author_then_scene_no_act/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/100_formal_three_hander.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/100_formal_three_hander/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/101_lift_lobby_sluglines.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/101_lift_lobby_sluglines/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/102_weather_frequency.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/102_weather_frequency/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/103_the_spare_key_catalogue.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/103_the_spare_key_catalogue/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/104_initials_at_tea.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/104_initials_at_tea/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/105_a_door_answers.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/105_a_door_answers/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/106_small_applause.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/106_small_applause/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/107_chair_ballet.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/107_chair_ballet/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/108_scene_is_not_a_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/108_scene_is_not_a_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/109_lower_roman.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/109_lower_roman/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/10_simple_spare_key_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/10_simple_spare_key_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/110_inbox_play.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/110_inbox_play/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/111_hyphenated_night.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/111_hyphenated_night/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/113_numbered_witnesses.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/113_numbered_witnesses/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/114_the_group_chat.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/114_the_group_chat/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/115_four_line_oath.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/115_four_line_oath/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/116_after_the_bell.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/116_after_the_bell/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/117_italic_corridor.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/117_italic_corridor/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/118_third_act_weather.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/118_third_act_weather/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/119_pause_audit.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/119_pause_audit/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/11_malformed_joined_speaker_pdf_artifact.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/11_malformed_joined_speaker_pdf_artifact/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/120_colon_trouble.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/120_colon_trouble/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/121_semicolon_cast.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/121_semicolon_cast/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/122_square_cue.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/122_square_cue/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/123_page_header_fog.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/123_page_header_fog/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/124_lowercase_lobby.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/124_lowercase_lobby/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/125_parenthesis_room.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/125_parenthesis_room/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/126_mixed_marks.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/126_mixed_marks/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/127_the_word_act.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/127_the_word_act/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/128_broken_column.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/128_broken_column/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/129_prologue_with_receipts.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/129_prologue_with_receipts/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/12_many_characters_short_lines.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/12_many_characters_short_lines/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/131_screenplay_character_blocks_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/131_screenplay_character_blocks_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/132_screenplay_character_blocks_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/132_screenplay_character_blocks_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/133_screenplay_parenthetical_cues_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/133_screenplay_parenthetical_cues_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/134_screenplay_parenthetical_cues_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/134_screenplay_parenthetical_cues_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/135_fixed_width_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/135_fixed_width_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/136_fixed_width_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/136_fixed_width_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/137_tabular_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/137_tabular_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/138_tabular_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/138_tabular_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/139_hyphen_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/139_hyphen_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/13_character_names_with_spaces_colon.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/13_character_names_with_spaces_colon/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/140_hyphen_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/140_hyphen_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/141_emdash_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/141_emdash_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/142_emdash_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/142_emdash_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/143_abbreviated_dot_speakers_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/143_abbreviated_dot_speakers_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/144_abbreviated_dot_speakers_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/144_abbreviated_dot_speakers_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/149_alias_cast_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/149_alias_cast_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/14_character_block_with_colons_and_descriptions.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/14_character_block_with_colons_and_descriptions/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/150_alias_cast_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/150_alias_cast_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/151_page_header_inside_speech_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/151_page_header_inside_speech_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/152_page_header_inside_speech_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/152_page_header_inside_speech_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/153_verse_indented_continuation_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/153_verse_indented_continuation_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/154_verse_indented_continuation_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/154_verse_indented_continuation_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/155_unbracketed_stage_prose_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/155_unbracketed_stage_prose_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/156_unbracketed_stage_prose_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/156_unbracketed_stage_prose_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/157_dual_dialogue_same_line_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/157_dual_dialogue_same_line_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/158_dual_dialogue_same_line_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/158_dual_dialogue_same_line_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/159_cue_before_colon_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/159_cue_before_colon_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/15_multiple_acts_modern/15_multiple_acts_modern.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/15_multiple_acts_modern/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/160_cue_before_colon_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/160_cue_before_colon_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/161_scene_title_false_speaker_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/161_scene_title_false_speaker_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/162_scene_title_false_speaker_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/162_scene_title_false_speaker_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/163_chat_timestamp_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/163_chat_timestamp_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/164_chat_timestamp_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/164_chat_timestamp_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/165_line_numbered_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/165_line_numbered_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/166_line_numbered_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/166_line_numbered_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/167_pdf_hyphenated_wrap_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/167_pdf_hyphenated_wrap_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/168_pdf_hyphenated_wrap_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/168_pdf_hyphenated_wrap_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/169_diacritic_apostrophe_speakers_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/169_diacritic_apostrophe_speakers_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/16_stage_directions_square_brackets.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/16_stage_directions_square_brackets/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/170_diacritic_apostrophe_speakers_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/170_diacritic_apostrophe_speakers_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/171_numbered_scene_titles_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/171_numbered_scene_titles_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/172_numbered_scene_titles_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/172_numbered_scene_titles_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/173_scene_colon_label_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/173_scene_colon_label_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/174_scene_colon_label_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/174_scene_colon_label_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/175_single_letter_speakers_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/175_single_letter_speakers_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/176_single_letter_speakers_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/176_single_letter_speakers_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/177_music_lyrics_cues_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/177_music_lyrics_cues_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/178_music_lyrics_cues_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/178_music_lyrics_cues_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/179_speaker_then_blank_then_text_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/179_speaker_then_blank_then_text_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/17_screenplayish_format.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/17_screenplayish_format/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/180_speaker_then_blank_then_text_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/180_speaker_then_blank_then_text_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/181_ocr_spaced_speaker_labels_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/181_ocr_spaced_speaker_labels_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/182_ocr_spaced_speaker_labels_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/182_ocr_spaced_speaker_labels_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/183_ocr_digit_letter_confusion_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/183_ocr_digit_letter_confusion_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/184_ocr_digit_letter_confusion_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/184_ocr_digit_letter_confusion_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/185_ocr_broken_word_continuation_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/185_ocr_broken_word_continuation_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/186_ocr_broken_word_continuation_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/186_ocr_broken_word_continuation_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/187_ocr_page_number_in_speech_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/187_ocr_page_number_in_speech_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/188_ocr_page_number_in_speech_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/188_ocr_page_number_in_speech_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/189_ocr_header_footer_intrusion_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/189_ocr_header_footer_intrusion_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/18_blank_lines_and_extra_spacing.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/18_blank_lines_and_extra_spacing/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/190_ocr_header_footer_intrusion_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/190_ocr_header_footer_intrusion_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/191_ocr_ligature_artefacts_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/191_ocr_ligature_artefacts_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/192_ocr_ligature_artefacts_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/192_ocr_ligature_artefacts_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/193_ocr_curly_quote_damage_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/193_ocr_curly_quote_damage_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/194_ocr_curly_quote_damage_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/194_ocr_curly_quote_damage_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/195_ocr_soft_hyphen_artefact_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/195_ocr_soft_hyphen_artefact_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/196_ocr_soft_hyphen_artefact_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/196_ocr_soft_hyphen_artefact_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/197_ocr_broken_speaker_colon_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/197_ocr_broken_speaker_colon_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/198_ocr_broken_speaker_colon_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/198_ocr_broken_speaker_colon_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/199_ocr_line_wrap_with_indentation_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/199_ocr_line_wrap_with_indentation_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/19_preamble_without_clear_marker.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/19_preamble_without_clear_marker/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/200_ocr_line_wrap_with_indentation_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/200_ocr_line_wrap_with_indentation_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/201_cast_list_descriptions_columns_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/201_cast_list_descriptions_columns_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/202_cast_list_descriptions_columns_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/202_cast_list_descriptions_columns_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/203_cast_group_roles_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/203_cast_group_roles_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/204_cast_group_roles_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/204_cast_group_roles_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/205_cast_alias_roles_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/205_cast_alias_roles_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/206_cast_alias_roles_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/206_cast_alias_roles_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/207_cast_no_separator_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/207_cast_no_separator_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/208_cast_no_separator_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/208_cast_no_separator_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/209_cast_non_speaking_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/209_cast_non_speaking_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/20_single_character_monologue_with_directions.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/20_single_character_monologue_with_directions/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/210_cast_non_speaking_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/210_cast_non_speaking_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/211_classical_abbreviated_sigla_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/211_classical_abbreviated_sigla_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/212_classical_abbreviated_sigla_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/212_classical_abbreviated_sigla_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/213_marginal_speaker_labels_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/213_marginal_speaker_labels_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/214_marginal_speaker_labels_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/214_marginal_speaker_labels_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/215_numbered_verse_lines_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/215_numbered_verse_lines_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/216_numbered_verse_lines_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/216_numbered_verse_lines_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/217_roman_structure_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/217_roman_structure_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/218_roman_structure_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/218_roman_structure_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/219_enter_exit_conventions_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/219_enter_exit_conventions_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/220_enter_exit_conventions_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/220_enter_exit_conventions_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/221_timestamp_inline_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/221_timestamp_inline_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/222_timestamp_inline_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/222_timestamp_inline_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/223_bracketed_speaker_subtitles_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/223_bracketed_speaker_subtitles_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/224_bracketed_speaker_subtitles_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/224_bracketed_speaker_subtitles_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/225_srt_chunks_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/225_srt_chunks_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/226_srt_chunks_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/226_srt_chunks_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/227_webvtt_cues_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/227_webvtt_cues_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/228_webvtt_cues_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/228_webvtt_cues_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/229_speaker_dash_transcript_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/229_speaker_dash_transcript_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/230_speaker_dash_transcript_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/230_speaker_dash_transcript_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/231_markdown_bold_speakers_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/231_markdown_bold_speakers_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/232_markdown_bold_speakers_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/232_markdown_bold_speakers_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/233_markdown_italic_stage_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/233_markdown_italic_stage_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/234_markdown_italic_stage_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/234_markdown_italic_stage_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/235_markdown_blockquote_dialogue_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/235_markdown_blockquote_dialogue_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/236_markdown_blockquote_dialogue_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/236_markdown_blockquote_dialogue_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/237_html_entities_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/237_html_entities_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/238_html_entities_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/238_html_entities_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/239_web_footer_copied_1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/239_web_footer_copied_1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/240_web_footer_copied_2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/240_web_footer_copied_2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/60_audition_01_two_person_drama.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/60_audition_01_two_person_drama/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/61_audition_02_comedic_monologue.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/61_audition_02_comedic_monologue/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/62_audition_03_one_person_voice_message.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/62_audition_03_one_person_voice_message/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/63_audition_04_period_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/63_audition_04_period_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/64_audition_05_sci_fi_interrogation.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/64_audition_05_sci_fi_interrogation/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/65_audition_06_romantic_comedy.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/65_audition_06_romantic_comedy/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/66_audition_07_thriller_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/66_audition_07_thriller_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/67_audition_08_duologue_family.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/67_audition_08_duologue_family/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/68_audition_09_silent_stage_directions.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/68_audition_09_silent_stage_directions/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/69_audition_10_mockumentary.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/69_audition_10_mockumentary/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/70_audition_11_classical_heightened.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/70_audition_11_classical_heightened/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/71_audition_12_police_procedural.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/71_audition_12_police_procedural/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/72_audition_13_child_actor_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/72_audition_13_child_actor_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/73_audition_14_soap_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/73_audition_14_soap_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/74_audition_15_horror_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/74_audition_15_horror_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/75_audition_16_workplace_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/75_audition_16_workplace_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/76_audition_17_legal_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/76_audition_17_legal_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/77_audition_18_fantasy_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/77_audition_18_fantasy_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/78_audition_19_radio_play.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/78_audition_19_radio_play/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/79_audition_20_musical_book_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/79_audition_20_musical_book_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/80_colon_cast_and_scene.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/80_colon_cast_and_scene/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/81_bare_speaker_acts.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/81_bare_speaker_acts/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/82_dot_inline_comedy.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/82_dot_inline_comedy/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/83_dot_block_form.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/83_dot_block_form/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/84_bracket_directions.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/84_bracket_directions/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/85_monologue_parentheses.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/85_monologue_parentheses/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/86_no_dialogue_physical.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/86_no_dialogue_physical/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/87_modern_act_words.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/87_modern_act_words/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/88_screenplay_slugline.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/88_screenplay_slugline/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/89_radio_sfx.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/89_radio_sfx/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/90_mixed_inline_stage.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/90_mixed_inline_stage/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/91_title_author_immediate.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/91_title_author_immediate/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/92_cast_commas.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/92_cast_commas/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/93_multiscene_no_acts.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/93_multiscene_no_acts/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/94_stage_speaker_action.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/94_stage_speaker_action/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/95_character_names_spaces.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/95_character_names_spaces/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/96_long_preamble_marker.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/96_long_preamble_marker/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/97_single_character_with_end.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/97_single_character_with_end/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/98_colon_scene_false_positive.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/98_colon_scene_false_positive/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/99_dot_signature_not_speaker.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/99_dot_signature_not_speaker/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/A Midsummer Night's Dream/A Midsummer Night's Dream.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/A Midsummer Night's Dream/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/All's Well That Ends Well/All's Well That Ends Well.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/All's Well That Ends Well/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Antony and Cleopatra/Antony and Cleopatra.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Antony and Cleopatra/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/As You Like It/As You Like It.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/As You Like It/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/CORPUS_FORMATS.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Coriolanus/Coriolanus.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Coriolanus/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Cymbeline/Cymbeline.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Cymbeline/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/Gin vs Whiskey.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Gin vs Whiskey/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Hamlet/Hamlet.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Hamlet/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 1/Henry IV, Part 1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 2/Henry IV, Part 2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry IV, Part 2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry V/Henry V.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry V/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 1/Henry VI, Part 1.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 1/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 2/Henry VI, Part 2.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 2/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 3/Henry VI, Part 3.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VI, Part 3/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VIII/Henry VIII.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Henry VIII/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Julius Caesar/Julius Caesar.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Julius Caesar/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/King John/King John.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/King John/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/King Lear/King Lear.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/King Lear/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Love's Labour's Lost/Love's Labour's Lost.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Love's Labour's Lost/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Macbeth/Macbeth.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Macbeth/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Measure for Measure/Measure for Measure.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Measure for Measure/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Much Ado About Nothing/Much Ado About Nothing.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Much Ado About Nothing/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Othello/Othello.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Othello/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/Pericles, Prince of Tyre.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Pericles, Prince of Tyre/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/README.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard II/Richard II.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard II/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard III/Richard III.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Richard III/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Romeo and Juliet/Romeo and Juliet.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Romeo and Juliet/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Comedy of Errors/The Comedy of Errors.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Comedy of Errors/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/The Importance of Being Earnest.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/hints.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Importance of Being Earnest/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merchant of Venice/The Merchant of Venice.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merchant of Venice/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merry Wives of Windsor/The Merry Wives of Windsor.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Merry Wives of Windsor/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Taming of the Shrew/The Taming of the Shrew.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Taming of the Shrew/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Tempest/The Tempest.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Tempest/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Winter's Tale/The Winter's Tale.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/The Winter's Tale/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Timon of Athens/Timon of Athens.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Timon of Athens/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Titus Andronicus/Titus Andronicus.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Titus Andronicus/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Troilus and Cressida/Troilus and Cressida.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Troilus and Cressida/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Twelfth Night/Twelfth Night.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Twelfth Night/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Two Gentlemen of Verona/Two Gentlemen of Verona.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/data/Two Gentlemen of Verona/optimal.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/docs/API.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/docs/FORMAT_PROFILES.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/docs/JSON_SCHEMA.md +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/docs/play_document.schema.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/setup.cfg +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/__main__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/_io.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/cli/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/cli/main.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/assembler.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/builder.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/constants.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/text.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/types.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/document/validation.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/domain/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/domain/play.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/ingestion/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/ingestion/ingestor.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsers.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/front_matter.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/fsm.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/hints.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/colon_inline.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_block.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/dot_inline.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/loader.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/profiles/schema.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/speakers.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/structure.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/parsing/viterbi.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser/py.typed +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/dependency_links.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/entry_points.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/requires.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/src/play_parser.egg-info/top_level.txt +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/tests/__init__.py +0 -0
- {play_parser-1.2.1 → play_parser-1.2.2}/tests/conftest.py +0 -0
|
@@ -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
|
-
|
|
91
|
-
type="stage_direction",
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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
|
|
651
|
-
state.events.
|
|
650
|
+
if stage_directions is not None:
|
|
651
|
+
state.events.extend(stage_directions)
|
|
652
652
|
state.index = next_index
|
|
653
653
|
return
|
|
654
654
|
|
|
@@ -12,12 +12,12 @@ from play_parser.parsing.parser import parse_play_text
|
|
|
12
12
|
from play_parser.parsing.profiles import get_format_profile
|
|
13
13
|
|
|
14
14
|
CANDIDATE_FORMAT_PROFILES: tuple[str, ...] = (
|
|
15
|
+
"generic",
|
|
15
16
|
"dot_block",
|
|
16
17
|
"colon_inline",
|
|
17
18
|
"dot_inline",
|
|
18
19
|
"mixed_parenthetical",
|
|
19
20
|
"narrative_stage_heavy",
|
|
20
|
-
"generic",
|
|
21
21
|
)
|
|
22
22
|
DEFAULT_SAMPLE_CHARS = 2_000
|
|
23
23
|
LOW_SCORE = -10_000
|
|
@@ -129,6 +129,14 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
|
|
|
129
129
|
|
|
130
130
|
plausible_speakers = [speaker for speaker in unique_speakers if _is_plausible_speaker_name(speaker)]
|
|
131
131
|
implausible_speakers = len(unique_speakers) - len(plausible_speakers)
|
|
132
|
+
suspicious_speakers = [speaker for speaker in unique_speakers if _is_suspicious_speaker_name(speaker)]
|
|
133
|
+
one_off_multiword_speakers = [
|
|
134
|
+
speaker
|
|
135
|
+
for speaker in unique_speakers
|
|
136
|
+
if speakers.count(speaker) == 1
|
|
137
|
+
and len(speaker.split()) > 1
|
|
138
|
+
and speaker.casefold() not in {"cast list"}
|
|
139
|
+
]
|
|
132
140
|
|
|
133
141
|
repeated_speakers = tuple(sorted({speaker for speaker in unique_speakers if speakers.count(speaker) >= 2}))
|
|
134
142
|
|
|
@@ -153,11 +161,15 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
|
|
|
153
161
|
score += 60
|
|
154
162
|
|
|
155
163
|
if len(stage_dirs) > len(speeches) * 0.5:
|
|
156
|
-
score -=
|
|
164
|
+
score -= 180
|
|
165
|
+
if len(stage_dirs) > len(speeches):
|
|
166
|
+
score -= 240
|
|
157
167
|
if 0 < alternation_ratio < 0.15 and len(speeches) >= 6:
|
|
158
168
|
score -= 120
|
|
159
169
|
score -= int(meta_ratio * 250)
|
|
160
170
|
score -= implausible_speakers * 120
|
|
171
|
+
score -= len(suspicious_speakers) * 180
|
|
172
|
+
score -= len(one_off_multiword_speakers) * 180
|
|
161
173
|
score -= int(very_short_ratio * 180)
|
|
162
174
|
score -= int(very_long_ratio * 220)
|
|
163
175
|
|
|
@@ -179,10 +191,38 @@ def _score_events(profile: str, events: list[PlayEvent]) -> ProfileScore:
|
|
|
179
191
|
def _is_plausible_speaker_name(value: str) -> bool:
|
|
180
192
|
if not value or len(value) > 40:
|
|
181
193
|
return False
|
|
182
|
-
if any(char in value for char in "
|
|
194
|
+
if any(char in value for char in "?!,:;()[]{}"):
|
|
183
195
|
return False
|
|
184
196
|
parts = value.split()
|
|
185
|
-
|
|
197
|
+
if not 1 <= len(parts) <= 4:
|
|
198
|
+
return False
|
|
199
|
+
# Allow title/name abbreviations such as "Ms. Rai" or "Dr. Moreau".
|
|
200
|
+
return all(part.replace(".", "").replace("'", "").replace("-", "").isalpha() for part in parts)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _is_suspicious_speaker_name(value: str) -> bool:
|
|
204
|
+
lowered = value.casefold()
|
|
205
|
+
if lowered in {
|
|
206
|
+
"a",
|
|
207
|
+
"an",
|
|
208
|
+
"and",
|
|
209
|
+
"but",
|
|
210
|
+
"fine",
|
|
211
|
+
"no",
|
|
212
|
+
"not",
|
|
213
|
+
"now",
|
|
214
|
+
"oh",
|
|
215
|
+
"so",
|
|
216
|
+
"then",
|
|
217
|
+
"well",
|
|
218
|
+
"yes",
|
|
219
|
+
}:
|
|
220
|
+
return True
|
|
221
|
+
words = [word.strip(".") for word in value.split() if word.strip(".")]
|
|
222
|
+
# Parsed speaker names are normalised to title-ish form. Verse fragments
|
|
223
|
+
# promoted by over-eager colon parsing often retain lowercase words, e.g.
|
|
224
|
+
# "My strength can give you" or "Of hostile paces".
|
|
225
|
+
return any(word and word[0].islower() for word in words)
|
|
186
226
|
|
|
187
227
|
|
|
188
228
|
def detect_format_profile(
|
|
@@ -203,6 +243,19 @@ def detect_format_profile(
|
|
|
203
243
|
coerced_hints = _coerce_hints(hints)
|
|
204
244
|
scores: list[ProfileScore] = []
|
|
205
245
|
|
|
246
|
+
if "by William Shakespeare" in sample:
|
|
247
|
+
try:
|
|
248
|
+
events = parse_play_text(sample, profile=None, hints=coerced_hints)
|
|
249
|
+
generic_score = score_profile_events("generic", events)
|
|
250
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
251
|
+
generic_score = score_profile_events("generic", [], error=str(exc))
|
|
252
|
+
return ProfileDetectionResult(
|
|
253
|
+
selected_profile="generic",
|
|
254
|
+
confidence="high",
|
|
255
|
+
sample_chars=len(sample),
|
|
256
|
+
scores=(generic_score,),
|
|
257
|
+
)
|
|
258
|
+
|
|
206
259
|
for profile_name in _unique_profiles(candidate_profiles):
|
|
207
260
|
try:
|
|
208
261
|
profile = None if profile_name == "generic" else get_format_profile(profile_name)
|
|
@@ -218,6 +271,10 @@ def detect_format_profile(
|
|
|
218
271
|
best = scores[0]
|
|
219
272
|
second = scores[1] if len(scores) > 1 else None
|
|
220
273
|
confidence = _confidence(best, second)
|
|
274
|
+
if confidence == "low":
|
|
275
|
+
generic = next((score for score in scores if score.profile == "generic" and score.score > LOW_SCORE), None)
|
|
276
|
+
if generic is not None:
|
|
277
|
+
best = generic
|
|
221
278
|
return ProfileDetectionResult(
|
|
222
279
|
selected_profile=best.profile,
|
|
223
280
|
confidence=confidence,
|
|
@@ -725,6 +725,13 @@ def is_strong_adjacent_speech_start(
|
|
|
725
725
|
# a new speech.
|
|
726
726
|
letters = [char for char in raw_speaker if char.isalpha()]
|
|
727
727
|
return bool(letters) and all(not char.islower() for char in letters)
|
|
728
|
+
if profile is not None and profile.name != "colon_inline" and COLON_SPEAKER_RE.match(linestr):
|
|
729
|
+
# Mixed/generic parsing may see verse punctuation such as
|
|
730
|
+
# ``Call'd Robin Goodfellow: are not you he`` inside an existing
|
|
731
|
+
# speech. Without a blank boundary, only source-uppercase colon
|
|
732
|
+
# labels are strong enough to interrupt the current speech.
|
|
733
|
+
letters = [char for char in raw_speaker if char.isalpha()]
|
|
734
|
+
return bool(letters) and all(not char.islower() for char in letters)
|
|
728
735
|
return True
|
|
729
736
|
letters = [char for char in raw_speaker if char.isalpha()]
|
|
730
737
|
return (
|
|
@@ -66,6 +66,21 @@ def clean_stage_direction_text(text: str, *, profile: FormatProfile | None = Non
|
|
|
66
66
|
return re.sub(r" {2,}", " ", cleaned).strip()
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def split_unbracketed_stage_prose(text: str) -> list[str]:
|
|
72
|
+
"""Split unbracketed stage prose into sentence-like stage events.
|
|
73
|
+
|
|
74
|
+
Long unbracketed paragraphs are a convenience for natural prose stage
|
|
75
|
+
directions. The play document model represents each sentence-like action as
|
|
76
|
+
its own stage_direction event, matching the corpus optimal JSON.
|
|
77
|
+
"""
|
|
78
|
+
stripped = text.strip()
|
|
79
|
+
if not stripped:
|
|
80
|
+
return []
|
|
81
|
+
parts = re.split(r"(?<=[.!?])\s+(?=[A-Z])", stripped)
|
|
82
|
+
return [part.strip() for part in parts if part.strip()]
|
|
83
|
+
|
|
69
84
|
def consume_multiline_stage_direction(
|
|
70
85
|
lines: Sequence[str],
|
|
71
86
|
index: int,
|
|
@@ -716,20 +716,4 @@ src/play_parser/parsing/profiles/builtins/mixed_parenthetical.json
|
|
|
716
716
|
src/play_parser/parsing/profiles/builtins/narrative_stage_heavy.json
|
|
717
717
|
tests/__init__.py
|
|
718
718
|
tests/conftest.py
|
|
719
|
-
tests/
|
|
720
|
-
tests/test_cli.py
|
|
721
|
-
tests/test_corpus_inventory.py
|
|
722
|
-
tests/test_corpus_optimal_json.py
|
|
723
|
-
tests/test_document_roundtrip.py
|
|
724
|
-
tests/test_domain.py
|
|
725
|
-
tests/test_fsm_corpus_optimal_json.py
|
|
726
|
-
tests/test_fsm_scoring.py
|
|
727
|
-
tests/test_ingestor.py
|
|
728
|
-
tests/test_json_schema.py
|
|
729
|
-
tests/test_parser_core.py
|
|
730
|
-
tests/test_parser_factory.py
|
|
731
|
-
tests/test_profile_detection.py
|
|
732
|
-
tests/test_profiles.py
|
|
733
|
-
tests/test_public_api.py
|
|
734
|
-
tests/test_validation_strict_types.py
|
|
735
|
-
tests/test_viterbi_decoder.py
|
|
719
|
+
tests/test_corpus_optimal_json.py
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import json
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from play_parser import PlayParser, load_play_parse_config
|
|
6
|
+
|
|
7
|
+
DATA = Path(__file__).resolve().parents[1] / "data"
|
|
8
|
+
|
|
9
|
+
def parsed_play_only(document):
|
|
10
|
+
document = copy.deepcopy(document)
|
|
11
|
+
document.get("metadata", {}).pop("selected_format_profile", None)
|
|
12
|
+
document.get("metadata", {}).pop("profile_detection", None)
|
|
13
|
+
return document
|
|
14
|
+
|
|
15
|
+
def test_all_data_fixtures_match_optimal_json():
|
|
16
|
+
parser = PlayParser.create("rule")
|
|
17
|
+
for case in sorted(p for p in DATA.iterdir() if p.is_dir()):
|
|
18
|
+
config = load_play_parse_config(case / "hints.json")
|
|
19
|
+
actual = parser.parse_document((case / f"{case.name}.txt").read_text(encoding="utf-8"), source_name=f"{case.name}.txt", profile=config.profile, hints=config.hints)
|
|
20
|
+
expected = json.loads((case / "optimal.json").read_text(encoding="utf-8"))
|
|
21
|
+
assert parsed_play_only(actual) == parsed_play_only(expected), case.name
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from copy import deepcopy
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
JsonObject = dict[str, Any]
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def normalise_play_document_structure(document: JsonObject) -> JsonObject:
|
|
10
|
-
"""Return a comparison-safe copy of a parsed play document.
|
|
11
|
-
|
|
12
|
-
The corpus JSON captures theatre structure. Some fields are structural but
|
|
13
|
-
not order-sensitive. For example, the character list represents the set of
|
|
14
|
-
characters found in a play; the order may come from first appearance in one
|
|
15
|
-
parser path and from a cast/preamble list in another.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
normalised = deepcopy(document)
|
|
19
|
-
metadata = normalised.get("metadata")
|
|
20
|
-
|
|
21
|
-
if isinstance(metadata, dict):
|
|
22
|
-
characters = metadata.get("characters")
|
|
23
|
-
if isinstance(characters, list):
|
|
24
|
-
metadata["characters"] = sorted(characters, key=_character_sort_key)
|
|
25
|
-
|
|
26
|
-
return normalised
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def equalsJSONstructure(actual: JsonObject, expected: JsonObject) -> bool:
|
|
30
|
-
"""Compare two theatrical JSON structures.
|
|
31
|
-
|
|
32
|
-
This is intentionally stricter than a loose semantic comparison, but less
|
|
33
|
-
brittle than raw JSON equality where order does not carry meaning.
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
return normalise_play_document_structure(actual) == normalise_play_document_structure(expected)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def _character_sort_key(value: object) -> tuple[str, str]:
|
|
40
|
-
text = str(value)
|
|
41
|
-
return (text.casefold(), text)
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import subprocess
|
|
5
|
-
import sys
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def test_cli_parse_defaults_to_rule_parser(tmp_path: Path) -> None:
|
|
10
|
-
source = tmp_path / "sample.txt"
|
|
11
|
-
output = tmp_path / "sample.json"
|
|
12
|
-
source.write_text(
|
|
13
|
-
"Tiny Play\nby A Writer\n\nACT I\n\nSCENE I. A room.\n\nALEX: Hello.\n\nTHE END\n",
|
|
14
|
-
encoding="utf-8",
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
result = subprocess.run(
|
|
18
|
-
[
|
|
19
|
-
sys.executable,
|
|
20
|
-
"-m",
|
|
21
|
-
"play_parser",
|
|
22
|
-
"parse",
|
|
23
|
-
str(source),
|
|
24
|
-
"--json-output",
|
|
25
|
-
str(output),
|
|
26
|
-
],
|
|
27
|
-
check=False,
|
|
28
|
-
capture_output=True,
|
|
29
|
-
text=True,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
assert result.returncode == 0, result.stderr
|
|
33
|
-
document = json.loads(output.read_text(encoding="utf-8"))
|
|
34
|
-
assert document["metadata"]["title"] == "Tiny Play"
|
|
35
|
-
assert document["events"][-1]["type"] == "end_marker"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_cli_parse_accepts_fsm_beam_width(tmp_path: Path) -> None:
|
|
39
|
-
source = tmp_path / "sample.txt"
|
|
40
|
-
output = tmp_path / "sample.json"
|
|
41
|
-
source.write_text(
|
|
42
|
-
"Tiny Play\nby A Writer\n\nACT I\n\nSCENE I. A room.\n\nALEX: Hello.\n\nTHE END\n",
|
|
43
|
-
encoding="utf-8",
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
result = subprocess.run(
|
|
47
|
-
[
|
|
48
|
-
sys.executable,
|
|
49
|
-
"-m",
|
|
50
|
-
"play_parser",
|
|
51
|
-
"parse",
|
|
52
|
-
str(source),
|
|
53
|
-
"--method",
|
|
54
|
-
"fsm",
|
|
55
|
-
"--beam-width",
|
|
56
|
-
"2",
|
|
57
|
-
"--json-output",
|
|
58
|
-
str(output),
|
|
59
|
-
],
|
|
60
|
-
check=False,
|
|
61
|
-
capture_output=True,
|
|
62
|
-
text=True,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
assert result.returncode == 0, result.stderr
|
|
66
|
-
document = json.loads(output.read_text(encoding="utf-8"))
|
|
67
|
-
assert document["events"][-1]["type"] == "end_marker"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def test_cli_parse_rejects_invalid_beam_width(tmp_path: Path) -> None:
|
|
71
|
-
source = tmp_path / "sample.txt"
|
|
72
|
-
source.write_text("ALEX: Hello.\n", encoding="utf-8")
|
|
73
|
-
|
|
74
|
-
result = subprocess.run(
|
|
75
|
-
[
|
|
76
|
-
sys.executable,
|
|
77
|
-
"-m",
|
|
78
|
-
"play_parser",
|
|
79
|
-
"parse",
|
|
80
|
-
str(source),
|
|
81
|
-
"--method",
|
|
82
|
-
"fsm",
|
|
83
|
-
"--beam-width",
|
|
84
|
-
"0",
|
|
85
|
-
],
|
|
86
|
-
check=False,
|
|
87
|
-
capture_output=True,
|
|
88
|
-
text=True,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
assert result.returncode != 0
|
|
92
|
-
assert "--beam-width must be at least 1" in result.stderr
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def test_cli_assemble_reports_invalid_json_without_traceback(tmp_path: Path) -> None:
|
|
96
|
-
source = tmp_path / "broken.json"
|
|
97
|
-
source.write_text("{not json", encoding="utf-8")
|
|
98
|
-
|
|
99
|
-
result = subprocess.run(
|
|
100
|
-
[sys.executable, "-m", "play_parser", "assemble", str(source)],
|
|
101
|
-
check=False,
|
|
102
|
-
capture_output=True,
|
|
103
|
-
text=True,
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
assert result.returncode == 2
|
|
107
|
-
assert "error: Invalid JSON" in result.stderr
|
|
108
|
-
assert "Traceback" not in result.stderr
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def test_cli_parse_reports_invalid_profile_json_without_traceback(tmp_path: Path) -> None:
|
|
112
|
-
source = tmp_path / "sample.txt"
|
|
113
|
-
profile = tmp_path / "profile.json"
|
|
114
|
-
source.write_text("ALEX: Hello.\n", encoding="utf-8")
|
|
115
|
-
profile.write_text("{not json", encoding="utf-8")
|
|
116
|
-
|
|
117
|
-
result = subprocess.run(
|
|
118
|
-
[
|
|
119
|
-
sys.executable,
|
|
120
|
-
"-m",
|
|
121
|
-
"play_parser",
|
|
122
|
-
"parse",
|
|
123
|
-
str(source),
|
|
124
|
-
"--profile-path",
|
|
125
|
-
str(profile),
|
|
126
|
-
],
|
|
127
|
-
check=False,
|
|
128
|
-
capture_output=True,
|
|
129
|
-
text=True,
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
assert result.returncode == 2
|
|
133
|
-
assert "error: Invalid JSON" in result.stderr
|
|
134
|
-
assert "Traceback" not in result.stderr
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def test_cli_assemble_reports_invalid_canonical_document_without_traceback(tmp_path: Path) -> None:
|
|
138
|
-
source = tmp_path / "broken_document.json"
|
|
139
|
-
source.write_text(
|
|
140
|
-
json.dumps(
|
|
141
|
-
{
|
|
142
|
-
"metadata": {
|
|
143
|
-
"title": None,
|
|
144
|
-
"author": None,
|
|
145
|
-
"characters": [],
|
|
146
|
-
"acts": [],
|
|
147
|
-
"scenes": [],
|
|
148
|
-
"stats": {
|
|
149
|
-
"stage_directions": 0,
|
|
150
|
-
"speeches": 1,
|
|
151
|
-
"scenes": 0,
|
|
152
|
-
"acts": 0,
|
|
153
|
-
"source_words": 0,
|
|
154
|
-
"spoken_words": 0,
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
"events": [{"type": "speech"}],
|
|
158
|
-
}
|
|
159
|
-
),
|
|
160
|
-
encoding="utf-8",
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
result = subprocess.run(
|
|
164
|
-
[sys.executable, "-m", "play_parser", "assemble", str(source)],
|
|
165
|
-
check=False,
|
|
166
|
-
capture_output=True,
|
|
167
|
-
text=True,
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
assert result.returncode == 2
|
|
171
|
-
assert "error: Invalid event at index 0" in result.stderr
|
|
172
|
-
assert "speech event missing required fields" in result.stderr
|
|
173
|
-
assert "Traceback" not in result.stderr
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def test_cli_missing_input_path_does_not_show_traceback(tmp_path: Path) -> None:
|
|
177
|
-
missing = tmp_path / "missing.txt"
|
|
178
|
-
|
|
179
|
-
result = subprocess.run(
|
|
180
|
-
[sys.executable, "-m", "play_parser", "parse", str(missing)],
|
|
181
|
-
check=False,
|
|
182
|
-
capture_output=True,
|
|
183
|
-
text=True,
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
assert result.returncode != 0
|
|
187
|
-
assert "Input path not found" in result.stderr
|
|
188
|
-
assert "Traceback" not in result.stderr
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
ROOT = Path(__file__).resolve().parents[1]
|
|
6
|
-
DATA_ROOT = ROOT / "data"
|
|
7
|
-
EXPECTED_CORPUS_SIZE = 234
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def test_regression_corpus_has_expected_size() -> None:
|
|
11
|
-
play_dirs = sorted(path for path in DATA_ROOT.iterdir() if path.is_dir())
|
|
12
|
-
|
|
13
|
-
assert len(play_dirs) == EXPECTED_CORPUS_SIZE
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def test_each_corpus_case_has_text_and_optimal_json() -> None:
|
|
17
|
-
for play_dir in sorted(path for path in DATA_ROOT.iterdir() if path.is_dir()):
|
|
18
|
-
assert (play_dir / f"{play_dir.name}.txt").exists()
|
|
19
|
-
assert (play_dir / "optimal.json").exists()
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
import pytest
|
|
7
|
-
|
|
8
|
-
from play_parser import PlayParser, load_play_parse_config
|
|
9
|
-
from play_parser.parsing.hints import DEFAULT_PROFILE_NAME, PlayParseConfig
|
|
10
|
-
from play_parser.parsing.profiles import get_format_profile
|
|
11
|
-
from tests.play_document_comparison import equalsJSONstructure
|
|
12
|
-
|
|
13
|
-
ROOT = Path(__file__).resolve().parents[1]
|
|
14
|
-
DATA_ROOT = ROOT / "data"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _resolve_profile(config: PlayParseConfig):
|
|
18
|
-
if config.profile == DEFAULT_PROFILE_NAME:
|
|
19
|
-
return None
|
|
20
|
-
return get_format_profile(config.profile)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _all_play_cases() -> list[tuple[Path, Path, Path, PlayParseConfig]]:
|
|
24
|
-
cases: list[tuple[Path, Path, Path, PlayParseConfig]] = []
|
|
25
|
-
|
|
26
|
-
for play_dir in sorted(path for path in DATA_ROOT.iterdir() if path.is_dir()):
|
|
27
|
-
text_path = play_dir / f"{play_dir.name}.txt"
|
|
28
|
-
expected_path = play_dir / "optimal.json"
|
|
29
|
-
hints_path = play_dir / "hints.json"
|
|
30
|
-
cases.append((text_path, expected_path, hints_path, load_play_parse_config(hints_path)))
|
|
31
|
-
|
|
32
|
-
return cases
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
ALL_PLAY_CASES = _all_play_cases()
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def _case_id(case: tuple[Path, Path, Path, PlayParseConfig]) -> str:
|
|
39
|
-
text_path, _, _, _ = case
|
|
40
|
-
return text_path.stem
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@pytest.mark.parametrize("case", ALL_PLAY_CASES, ids=_case_id)
|
|
44
|
-
def test_rule_parser_matches_optimal_json(
|
|
45
|
-
case: tuple[Path, Path, Path, PlayParseConfig],
|
|
46
|
-
) -> None:
|
|
47
|
-
text_path, expected_path, _hints_path, config = case
|
|
48
|
-
|
|
49
|
-
assert text_path.exists(), f"Missing text file: {text_path}"
|
|
50
|
-
assert expected_path.exists(), f"Missing optimal JSON for {text_path.name}: {expected_path}"
|
|
51
|
-
|
|
52
|
-
parser = PlayParser.create("rule")
|
|
53
|
-
actual = parser.parse_document(
|
|
54
|
-
text_path.read_text(encoding="utf-8"),
|
|
55
|
-
profile=_resolve_profile(config),
|
|
56
|
-
hints=config.hints,
|
|
57
|
-
source_name=text_path.name,
|
|
58
|
-
)
|
|
59
|
-
expected = json.loads(expected_path.read_text(encoding="utf-8"))
|
|
60
|
-
|
|
61
|
-
assert equalsJSONstructure(actual, expected)
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import tempfile
|
|
5
|
-
import unittest
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
|
|
8
|
-
from play_parser._io import DEFAULT_MAX_INPUT_BYTES
|
|
9
|
-
from play_parser.document.assembler import assemble_play_text
|
|
10
|
-
from play_parser.document.builder import build_play_document, build_play_document_from_file, write_json_file
|
|
11
|
-
|
|
12
|
-
ROOT = Path(__file__).resolve().parents[1]
|
|
13
|
-
|
|
14
|
-
SAMPLE_TEXT = """Example Play
|
|
15
|
-
by William Shakespeare
|
|
16
|
-
|
|
17
|
-
ACT I
|
|
18
|
-
|
|
19
|
-
SCENE I. A room.
|
|
20
|
-
|
|
21
|
-
HAMLET: To be or not to be.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class DocumentRoundtripTests(unittest.TestCase):
|
|
26
|
-
def test_build_play_document_collects_metadata_and_events(self) -> None:
|
|
27
|
-
document = build_play_document(SAMPLE_TEXT)
|
|
28
|
-
|
|
29
|
-
self.assertEqual(document["metadata"]["title"], "Example Play")
|
|
30
|
-
self.assertEqual(document["metadata"]["author"], "William Shakespeare")
|
|
31
|
-
self.assertEqual(document["metadata"]["stats"]["acts"], 1)
|
|
32
|
-
self.assertEqual(document["metadata"]["stats"]["scenes"], 1)
|
|
33
|
-
self.assertEqual(document["metadata"]["stats"]["speeches"], 1)
|
|
34
|
-
self.assertEqual(document["events"][0]["type"], "meta")
|
|
35
|
-
self.assertEqual(document["events"][-1]["type"], "speech")
|
|
36
|
-
|
|
37
|
-
def test_json_to_text_to_json_is_idempotent_for_sample(self) -> None:
|
|
38
|
-
document = build_play_document(SAMPLE_TEXT, play_name="Example Play")
|
|
39
|
-
canonical_text = assemble_play_text(document)
|
|
40
|
-
reparsed = build_play_document(canonical_text, play_name="Example Play")
|
|
41
|
-
|
|
42
|
-
self.assertEqual(reparsed, document)
|
|
43
|
-
|
|
44
|
-
def test_txt_to_json_to_normalised_txt_to_json_is_idempotent_for_sample_file(self) -> None:
|
|
45
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
46
|
-
input_path = Path(tmpdir) / "Example.txt"
|
|
47
|
-
input_path.write_text(SAMPLE_TEXT, encoding="utf-8")
|
|
48
|
-
|
|
49
|
-
first = build_play_document_from_file(input_path)
|
|
50
|
-
normalised_text = assemble_play_text(first)
|
|
51
|
-
second = build_play_document(normalised_text, play_name=input_path.stem)
|
|
52
|
-
|
|
53
|
-
self.assertEqual(second, first)
|
|
54
|
-
|
|
55
|
-
def test_write_json_file_writes_same_document_that_it_returns(self) -> None:
|
|
56
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
57
|
-
tmp = Path(tmpdir)
|
|
58
|
-
input_path = tmp / "Example.txt"
|
|
59
|
-
output_path = tmp / "out" / "Example.json"
|
|
60
|
-
input_path.write_text(SAMPLE_TEXT, encoding="utf-8")
|
|
61
|
-
|
|
62
|
-
returned = write_json_file(input_path, output_path)
|
|
63
|
-
written = json.loads(output_path.read_text(encoding="utf-8"))
|
|
64
|
-
|
|
65
|
-
self.assertEqual(written, returned)
|
|
66
|
-
|
|
67
|
-
def test_rejects_oversized_text_file(self) -> None:
|
|
68
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
69
|
-
path = Path(tmpdir) / "Large.txt"
|
|
70
|
-
with path.open("wb") as handle:
|
|
71
|
-
handle.truncate(DEFAULT_MAX_INPUT_BYTES + 1)
|
|
72
|
-
|
|
73
|
-
with self.assertRaisesRegex(ValueError, "too large"):
|
|
74
|
-
build_play_document_from_file(path)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if __name__ == "__main__":
|
|
78
|
-
unittest.main()
|